Mercurial > hg > qm-dsp
comparison base/Window.h @ 505:930b5b0f707d
Merge branch 'codestyle-and-tidy'
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Wed, 05 Jun 2019 12:55:15 +0100 |
parents | 3f649fbb1172 |
children |
comparison
equal
deleted
inserted
replaced
471:e3335cb213da | 505:930b5b0f707d |
---|---|
10 published by the Free Software Foundation; either version 2 of the | 10 published by the Free Software Foundation; either version 2 of the |
11 License, or (at your option) any later version. See the file | 11 License, or (at your option) any later version. See the file |
12 COPYING included with this distribution for more information. | 12 COPYING included with this distribution for more information. |
13 */ | 13 */ |
14 | 14 |
15 #ifndef _WINDOW_H_ | 15 #ifndef QM_DSP_WINDOW_H |
16 #define _WINDOW_H_ | 16 #define QM_DSP_WINDOW_H |
17 | 17 |
18 #include <cmath> | 18 #include <cmath> |
19 #include <iostream> | 19 #include <iostream> |
20 #include <map> | 20 #include <map> |
21 #include <vector> | 21 #include <vector> |
48 * symmetrical window of size N+1 with the final element missing.) | 48 * symmetrical window of size N+1 with the final element missing.) |
49 */ | 49 */ |
50 Window(WindowType type, int size) : m_type(type), m_size(size) { encache(); } | 50 Window(WindowType type, int size) : m_type(type), m_size(size) { encache(); } |
51 Window(const Window &w) : m_type(w.m_type), m_size(w.m_size) { encache(); } | 51 Window(const Window &w) : m_type(w.m_type), m_size(w.m_size) { encache(); } |
52 Window &operator=(const Window &w) { | 52 Window &operator=(const Window &w) { |
53 if (&w == this) return *this; | 53 if (&w == this) return *this; |
54 m_type = w.m_type; | 54 m_type = w.m_type; |
55 m_size = w.m_size; | 55 m_size = w.m_size; |
56 encache(); | 56 encache(); |
57 return *this; | 57 return *this; |
58 } | 58 } |
59 virtual ~Window() { delete[] m_cache; } | 59 virtual ~Window() { delete[] m_cache; } |
60 | 60 |
61 void cut(T *src) const { cut(src, src); } | 61 void cut(T *src) const { cut(src, src); } |
62 void cut(const T *src, T *dst) const { | 62 void cut(const T *src, T *dst) const { |
63 for (int i = 0; i < m_size; ++i) dst[i] = src[i] * m_cache[i]; | 63 for (int i = 0; i < m_size; ++i) { |
64 dst[i] = src[i] * m_cache[i]; | |
65 } | |
64 } | 66 } |
65 | 67 |
66 WindowType getType() const { return m_type; } | 68 WindowType getType() const { return m_type; } |
67 int getSize() const { return m_size; } | 69 int getSize() const { return m_size; } |
68 | 70 |
89 T *mult = new T[n]; | 91 T *mult = new T[n]; |
90 int i; | 92 int i; |
91 for (i = 0; i < n; ++i) mult[i] = 1.0; | 93 for (i = 0; i < n; ++i) mult[i] = 1.0; |
92 | 94 |
93 switch (m_type) { | 95 switch (m_type) { |
94 | 96 |
95 case RectangularWindow: | 97 case RectangularWindow: |
96 for (i = 0; i < n; ++i) { | 98 for (i = 0; i < n; ++i) { |
97 mult[i] = mult[i] * 0.5; | 99 mult[i] = mult[i] * 0.5; |
98 } | 100 } |
99 break; | 101 break; |
100 | 102 |
101 case BartlettWindow: | 103 case BartlettWindow: |
102 if (n == 2) { | 104 if (n == 2) { |
103 mult[0] = mult[1] = 0; // "matlab compatible" | 105 mult[0] = mult[1] = 0; // "matlab compatible" |
104 } else if (n == 3) { | 106 } else if (n == 3) { |
105 mult[0] = 0; | 107 mult[0] = 0; |
107 } else if (n > 3) { | 109 } else if (n > 3) { |
108 for (i = 0; i < n/2; ++i) { | 110 for (i = 0; i < n/2; ++i) { |
109 mult[i] = mult[i] * (i / T(n/2)); | 111 mult[i] = mult[i] * (i / T(n/2)); |
110 mult[i + n - n/2] = mult[i + n - n/2] * (1.0 - (i / T(n/2))); | 112 mult[i + n - n/2] = mult[i + n - n/2] * (1.0 - (i / T(n/2))); |
111 } | 113 } |
112 } | 114 } |
113 break; | 115 break; |
114 | 116 |
115 case HammingWindow: | 117 case HammingWindow: |
116 if (n > 1) { | 118 if (n > 1) { |
117 for (i = 0; i < n; ++i) { | 119 for (i = 0; i < n; ++i) { |
118 mult[i] = mult[i] * (0.54 - 0.46 * cos(2 * M_PI * i / n)); | 120 mult[i] = mult[i] * (0.54 - 0.46 * cos(2 * M_PI * i / n)); |
119 } | 121 } |
120 } | 122 } |
121 break; | 123 break; |
122 | 124 |
123 case HanningWindow: | 125 case HanningWindow: |
124 if (n > 1) { | 126 if (n > 1) { |
125 for (i = 0; i < n; ++i) { | 127 for (i = 0; i < n; ++i) { |
126 mult[i] = mult[i] * (0.50 - 0.50 * cos(2 * M_PI * i / n)); | 128 mult[i] = mult[i] * (0.50 - 0.50 * cos(2 * M_PI * i / n)); |
127 } | 129 } |
128 } | 130 } |
129 break; | 131 break; |
130 | 132 |
131 case BlackmanWindow: | 133 case BlackmanWindow: |
132 if (n > 1) { | 134 if (n > 1) { |
133 for (i = 0; i < n; ++i) { | 135 for (i = 0; i < n; ++i) { |
134 mult[i] = mult[i] * (0.42 - 0.50 * cos(2 * M_PI * i / n) | 136 mult[i] = mult[i] * (0.42 - 0.50 * cos(2 * M_PI * i / n) |
135 + 0.08 * cos(4 * M_PI * i / n)); | 137 + 0.08 * cos(4 * M_PI * i / n)); |
136 } | 138 } |
137 } | 139 } |
138 break; | 140 break; |
139 | 141 |
140 case BlackmanHarrisWindow: | 142 case BlackmanHarrisWindow: |
141 if (n > 1) { | 143 if (n > 1) { |
142 for (i = 0; i < n; ++i) { | 144 for (i = 0; i < n; ++i) { |
143 mult[i] = mult[i] * (0.35875 | 145 mult[i] = mult[i] * (0.35875 |
144 - 0.48829 * cos(2 * M_PI * i / n) | 146 - 0.48829 * cos(2 * M_PI * i / n) |
145 + 0.14128 * cos(4 * M_PI * i / n) | 147 + 0.14128 * cos(4 * M_PI * i / n) |
146 - 0.01168 * cos(6 * M_PI * i / n)); | 148 - 0.01168 * cos(6 * M_PI * i / n)); |
147 } | 149 } |
148 } | 150 } |
149 break; | 151 break; |
150 } | 152 } |
151 | 153 |
152 m_cache = mult; | 154 m_cache = mult; |
153 } | 155 } |
154 | 156 |
155 #endif | 157 #endif |