Mercurial > hg > svcore
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 |