OpenWareLaboratory
Window.h
Go to the documentation of this file.
1 #ifndef __WINDOW_H__
2 #define __WINDOW_H__
3 
4 #include "basicmaths.h"
5 #include "SignalProcessor.h"
6 #include "FloatArray.h"
7 
8 /*
9  * Window provides static methods to generate and apply window functions:
10  * rectangular, hann, hanning, hamming, triangular
11  * or
12  * window(WindowType type, float* window, int size);
13  * a static method to apply a window to a signal (nothing but pairwise multiplication)
14  * applyWindow(float *signal, float *window)
15  * and a static method to apply a triangular window
16  * (as computing a triangular window is very cheap,
17  * this solution can be handy as it requires less memory (no window array required))
18  * applyTriangularWindow(float *signal, int size)
19  */
21 private:
22  size_t index = 0;
23 public:
24  typedef enum WindowType {
33  Window(){}
34  Window(float* win, int size) : FloatArray(win, size) {}
35  void apply(float *signalIn){
36  Window::applyWindow(signalIn, getData(), getSize());
37  }
38  void apply(float *signalIn, float *signalOut){
39  Window::applyWindow(signalIn, getData(), signalOut, getSize());
40  }
41  float process(float input){
42  float value = input*getData()[index++];
43  if(index >= getSize())
44  index = 0;
45  return value;
46  }
47  void process(FloatArray input, FloatArray output){
48  Window::applyWindow(input, getData(), output, getSize());
49  }
50  static Window create(WindowType type, int size){
51  Window win(new float[size], size);
52  win.window(type, win, size);
53  return win;
54  }
55  static Window create(int size){
56  Window win(new float[size], size);
57  return win;
58  }
59  static void window(WindowType type, float *window, int size){
60  switch(type){
61  case HannWindow:
62  case HanningWindow:
63  hann(window, size);
64  break;
65  case HammingWindow:
67  break;
68  case WelchWindow:
69  welch(window, size);
70  break;
71  case SineWindow:
72  sine(window, size);
73  break;
74  case TriangularWindow:
76  break;
77  case RectangularWindow:
78  default:
80  break;
81  }
82  }
83  static void rectangular(float *window, int size){
84  for(int n=0; n<size; n++)
85  window[n] = 1;
86  }
87  static void hann(float *window, int size){
88  for(int n=0; n<size; n++)
89  window[n] = 0.5*(1-cosf((float)n/(size-1)*2*M_PI));
90  }
91  static void hamming(float *window, int size){
92  for(int n=0; n<size; n++)
93  window[n] = 0.54-0.46*cosf((float)n/(size-1)*2*M_PI);
94  }
95  static void welch(float *window, int size){
96  for(int n=0; n<size; n++){
97  float x = (n - size/2)/(size/2);
98  window[n] = 1 - x*x;
99  }
100  }
101  static void sine(float *window, int size){
102  for(int n=0; n<size; n++){
103  window[n] = sinf((M_PI*n)/size);
104  }
105  }
106  static void triangular(float *window, int size){
107  float rampStep = 1/(size/2.0f);
108  float ramp = 0;
109  int n=0;
110  for(; n<size/2; n++){
111  window[n] = ramp;
112  ramp = ramp+rampStep;
113  }
114  rampStep = -rampStep;
115  for(; n<size; n++){
116  window[n] = ramp;
117  ramp = ramp+rampStep;
118  }
119  }
120  static void applyTriangularWindow(float *signal, int size){
121  applyTriangularWindow(signal, signal, size);
122  }
123  static void applyTriangularWindow(float *signalIn, float *signalOut, int size){
124  float rampStep = 1/(size/2);
125  float ramp = 0;
126  for(int n=0; n<size/2; n++){
127  signalOut[n] = signalIn[n]*ramp;
128  ramp = ramp+rampStep;
129  }
130  rampStep = -rampStep;
131  for(int n=size/2; n<size; n++){
132  signalOut[n] = signalIn[n]*ramp;
133  ramp = ramp+rampStep;
134  }
135  }
136  static void applyWindow(float *signal, float *window, int size){
137  applyWindow(signal, window, signal, size);
138  }
139  static void applyWindow(float *signalIn, float *window, float *signalOut, int size);
140 };
141 
142 #endif /* __WINDOW_H__ */
#define M_PI
Definition: basicmaths.h:52
This class contains useful methods for manipulating arrays of floats.
Definition: FloatArray.h:12
void ramp(float from, float to)
Create a linear ramp from one value to another.
Definition: FloatArray.cpp:432
Base class for signal processors such as Filters.
size_t getSize() const
Definition: SimpleArray.h:31
float * getData()
Get the data stored in the Array.
Definition: SimpleArray.h:27
Definition: Window.h:20
static Window create(WindowType type, int size)
Definition: Window.h:50
static void applyWindow(float *signal, float *window, int size)
Definition: Window.h:136
static void sine(float *window, int size)
Definition: Window.h:101
static void applyTriangularWindow(float *signalIn, float *signalOut, int size)
Definition: Window.h:123
float process(float input)
Definition: Window.h:41
static void rectangular(float *window, int size)
Definition: Window.h:83
static Window create(int size)
Definition: Window.h:55
void process(FloatArray input, FloatArray output)
Definition: Window.h:47
void apply(float *signalIn)
Definition: Window.h:35
Window()
Definition: Window.h:33
Window(float *win, int size)
Definition: Window.h:34
void apply(float *signalIn, float *signalOut)
Definition: Window.h:38
static void applyTriangularWindow(float *signal, int size)
Definition: Window.h:120
static void hann(float *window, int size)
Definition: Window.h:87
static void hamming(float *window, int size)
Definition: Window.h:91
static void triangular(float *window, int size)
Definition: Window.h:106
WindowType
Definition: Window.h:24
@ HanningWindow
Definition: Window.h:27
@ TriangularWindow
Definition: Window.h:28
@ RectangularWindow
Definition: Window.h:29
@ WelchWindow
Definition: Window.h:30
@ SineWindow
Definition: Window.h:31
@ HammingWindow
Definition: Window.h:25
@ HannWindow
Definition: Window.h:26
static void window(WindowType type, float *window, int size)
Definition: Window.h:59
static void welch(float *window, int size)
Definition: Window.h:95