comparison base/Window.h @ 142:0ba66b160a02

* Add frequency plot to window shape preference -- just because... * Fix some window shapes
author Chris Cannam
date Mon, 24 Jul 2006 14:36:35 +0000
parents 4f26f623a8bc
children 3fe6660f8fe2
comparison
equal deleted inserted replaced
141:4f26f623a8bc 142:0ba66b160a02
25 BartlettWindow, 25 BartlettWindow,
26 HammingWindow, 26 HammingWindow,
27 HanningWindow, 27 HanningWindow,
28 BlackmanWindow, 28 BlackmanWindow,
29 GaussianWindow, 29 GaussianWindow,
30 ParzenWindow 30 ParzenWindow,
31 NuttallWindow,
32 BlackmanHarrisWindow
31 }; 33 };
32 34
33 template <typename T> 35 template <typename T>
34 class Window 36 class Window
35 { 37 {
44 m_type = w.m_type; 46 m_type = w.m_type;
45 m_size = w.m_size; 47 m_size = w.m_size;
46 encache(); 48 encache();
47 return *this; 49 return *this;
48 } 50 }
49 virtual ~Window() { delete m_cache; } 51 virtual ~Window() { delete[] m_cache; }
50 52
51 void cut(T *src) const { cut(src, src); } 53 void cut(T *src) const { cut(src, src); }
52 void cut(T *src, T *dst) const { 54 void cut(T *src, T *dst) const {
53 for (size_t i = 0; i < m_size; ++i) dst[i] = src[i] * m_cache[i]; 55 for (size_t i = 0; i < m_size; ++i) dst[i] = src[i] * m_cache[i];
54 } 56 }
62 WindowType m_type; 64 WindowType m_type;
63 size_t m_size; 65 size_t m_size;
64 T *m_cache; 66 T *m_cache;
65 67
66 void encache(); 68 void encache();
69 void cosinewin(T *, T, T, T, T);
67 }; 70 };
68 71
69 template <typename T> 72 template <typename T>
70 void Window<T>::encache() 73 void Window<T>::encache()
71 { 74 {
88 mult[i + n/2] *= (1.0 - (i / T(n/2))); 91 mult[i + n/2] *= (1.0 - (i / T(n/2)));
89 } 92 }
90 break; 93 break;
91 94
92 case HammingWindow: 95 case HammingWindow:
93 for (i = 0; i < n; ++i) { 96 cosinewin(mult, 0.54, 0.46, 0.0, 0.0);
94 mult[i] *= (0.54 - 0.46 * cos(2 * M_PI * i / n));
95 }
96 break; 97 break;
97 98
98 case HanningWindow: 99 case HanningWindow:
99 for (i = 0; i < n; ++i) { 100 cosinewin(mult, 0.50, 0.50, 0.0, 0.0);
100 mult[i] *= (0.50 - 0.50 * cos(2 * M_PI * i / n));
101 }
102 break; 101 break;
103 102
104 case BlackmanWindow: 103 case BlackmanWindow:
105 for (i = 0; i < n; ++i) { 104 cosinewin(mult, 0.42, 0.50, 0.08, 0.0);
106 mult[i] *= (0.42 - 0.50 * cos(2 * M_PI * i / n)
107 + 0.08 * cos(4 * M_PI * i / n));
108 }
109 break; 105 break;
110 106
111 case GaussianWindow: 107 case GaussianWindow:
112 for (i = 0; i < n; ++i) { 108 for (i = 0; i < n; ++i) {
113 mult[i] *= exp(-(pow(i - (n-1)/2.0, 2) / 109 mult[i] *= pow(2, - pow((i - (n-1)/2.0) / ((n-1)/2.0 / 3), 2));
114 (2 * pow(0.25 * n, 2)))); // sd = 0.25
115 } 110 }
116 break; 111 break;
117 112
118 case ParzenWindow: 113 case ParzenWindow:
119 { 114 {
127 int wn = i - N/2; 122 int wn = i - N/2;
128 T m = 1.0 - 6 * pow(wn / (T(N)/2), 2) * (1.0 - abs(wn) / (T(N)/2)); 123 T m = 1.0 - 6 * pow(wn / (T(N)/2), 2) * (1.0 - abs(wn) / (T(N)/2));
129 mult[i] *= m; 124 mult[i] *= m;
130 mult[N-i] *= m; 125 mult[N-i] *= m;
131 } 126 }
132 } 127 break;
128 }
129
130 case NuttallWindow:
131 cosinewin(mult, 0.3635819, 0.4891775, 0.1365995, 0.0106411);
133 break; 132 break;
133
134 case BlackmanHarrisWindow:
135 cosinewin(mult, 0.35875, 0.48829, 0.14128, 0.01168);
136 break;
134 } 137 }
135 138
136 m_cache = mult; 139 m_cache = mult;
137 } 140 }
138 141
142 template <typename T>
143 void Window<T>::cosinewin(T *mult, T a0, T a1, T a2, T a3)
144 {
145 int n = int(m_size);
146 for (int i = 0; i < n; ++i) {
147 mult[i] *= (a0
148 - a1 * cos(2 * M_PI * i / n)
149 + a2 * cos(4 * M_PI * i / n)
150 - a3 * cos(6 * M_PI * i / n));
151 }
152 }
153
139 #endif 154 #endif