arduino-audio-tools
Loading...
Searching...
No Matches
FFTWindows.h
Go to the documentation of this file.
1
14#pragma once
15
16#include <math.h>
18
19namespace audio_tools {
20
27
29 public:
30 WindowFunction() = default;
31
33 virtual void begin(int samples) {
34 this->samples_minus_1 = -1.0f + samples;
35 this->i_samples = samples;
36 this->i_half_samples = samples / 2;
37 }
38
41 inline float factor(int idx) {
43 float result = idx <= i_half_samples ? factor_internal(idx)
44 : factor_internal(i_samples - idx - 1);
45 return result > 1.0f ? 1.0f : result;
46 }
47
49 inline int samples() { return i_samples; }
50
51 virtual const char* name() = 0;
52
53 protected:
54 float samples_minus_1 = 0.0f;
55 int i_samples = 0;
57 const float twoPi = 6.28318531f;
58 const float fourPi = 12.56637061f;
59 const float sixPi = 18.84955593f;
60
61 // virtual function provide implementation in subclass
62 virtual float factor_internal(int idx) = 0;
63
64 // the ratio idx / samples -1
65 inline float ratio(int idx) {
66 return (static_cast<float>(idx)) / samples_minus_1;
67 }
68};
69
78 public:
80
81 const char* name() override {
82 static char buffer[80] = "Buffered ";
83 strncpy(buffer + 9, p_wf->name(), 69);
84 return buffer;
85 }
86
87 virtual void begin(int samples) override {
89 // the wrapped window may already have been started with this size (e.g.
90 // shared with another user): the cache must be filled independently
91 if (p_wf->samples() != samples) p_wf->begin(samples);
92 // process only if there is a change
94 buffer.resize(i_half_samples + 1);
95 for (int j = 0; j <= i_half_samples; j++) {
96 buffer[j] = p_wf->factor(j);
97 }
99 }
100 }
101
102 protected:
106
107 float factor_internal(int idx) override {
108 if (idx < 0 || idx > i_half_samples) return 0.0;
109 return buffer[idx];
110 }
111};
112
119class Rectange : public WindowFunction {
120 public:
121 Rectange() = default;
122 float factor_internal(int idx) {
123 if (idx < 0 || idx >= i_samples) return 0;
124 return 1.0f;
125 }
126 const char* name() { return "Rectange"; }
127};
128
135class Hamming : public WindowFunction {
136 public:
137 Hamming() = default;
138 float factor_internal(int idx) {
139 return 0.54f - (0.46f * cos(twoPi * ratio(idx)));
140 }
141 const char* name() { return "Hamming"; }
142};
143
150class Hann : public WindowFunction {
151 public:
152 Hann() = default;
153 const char* name() { return "Hann"; }
154
155 // Hann: 0.5 * (1 - cos(2 pi n / (N - 1))); previously 0.54 * (...), which
156 // peaked at 1.08 and was clipped to 1.0 by factor() (flattened center)
157 float factor_internal(int idx) {
158 return 0.5f * (1.0f - cos(twoPi * ratio(idx)));
159 }
160};
161
168class Triangle : public WindowFunction {
169 public:
170 Triangle() = default;
171 const char* name() { return "Triangle"; }
172 float factor_internal(int idx) {
173 return 1.0f - ((2.0f * fabs((idx - 1) -
174 (static_cast<float>(i_samples - 1) / 2.0f))) /
176 }
177};
178
185
186class Nuttall : public WindowFunction {
187 public:
188 Nuttall() = default;
189 const char* name() override { return "Nuttall"; }
190 float factor_internal(int idx) override {
191 float r = ratio(idx);
192 return 0.355768f - (0.487396f * (cos(twoPi * r))) +
193 (0.144232f * (cos(fourPi * r))) - (0.012604f * (cos(sixPi * r)));
194 }
195};
196
203
204class Blackman : public WindowFunction {
205 public:
206 Blackman() = default;
207 const char* name() override { return "Blackman"; }
208 float factor_internal(int idx) override {
209 float r = ratio(idx);
210 return 0.42323f - (0.49755f * (cos(twoPi * r))) +
211 (0.07922f * (cos(fourPi * r)));
212 }
213};
214
222 public:
223 BlackmanNuttall() = default;
224 const char* name() override { return "BlackmanNuttall"; }
225 float factor_internal(int idx) override {
226 float r = ratio(idx);
227 return 0.3635819f - (0.4891775f * (cos(twoPi * r))) +
228 (0.1365995f * (cos(fourPi * r))) - (0.0106411f * (cos(sixPi * r)));
229 }
230};
231
239 public:
240 BlackmanHarris() = default;
241 const char* name() override { return "BlackmanHarris"; }
242 float factor_internal(int idx) override {
243 float r = ratio(idx);
244 return 0.35875f - (0.48829f * (cos(twoPi * r))) +
245 (0.14128f * (cos(fourPi * r))) - (0.01168f * (cos(sixPi * r)));
246 }
247};
248
255class FlatTop : public WindowFunction {
256 public:
257 FlatTop() = default;
258 const char* name() override { return "FlatTop"; }
259 float factor_internal(int idx) override {
260 float r = ratio(idx);
261 return 0.2810639f - (0.5208972f * cos(twoPi * r)) +
262 (0.1980399f * cos(fourPi * r));
263 }
264};
265
272class Welch : public WindowFunction {
273 public:
274 Welch() = default;
275 const char* name() override { return "Welch"; }
276 float factor_internal(int idx) override {
277 float tmp =
278 (((idx - 1) - samples_minus_1 / 2.0f) / (samples_minus_1 / 2.0f));
279 return 1.0f - (tmp * tmp);
280 }
281};
282
283} // namespace audio_tools
#define assert(T)
const char * name() override
Definition FFTWindows.h:241
float factor_internal(int idx) override
Definition FFTWindows.h:242
const char * name() override
Definition FFTWindows.h:207
float factor_internal(int idx) override
Definition FFTWindows.h:208
const char * name() override
Definition FFTWindows.h:224
float factor_internal(int idx) override
Definition FFTWindows.h:225
WindowFunction * p_wf
Definition FFTWindows.h:103
const char * name() override
Definition FFTWindows.h:81
Vector< float > buffer
Definition FFTWindows.h:104
virtual void begin(int samples) override
Setup the window function providing the fft length.
Definition FFTWindows.h:87
float factor_internal(int idx) override
Definition FFTWindows.h:107
int buffered_samples
Definition FFTWindows.h:105
BufferedWindow(WindowFunction *wf)
Definition FFTWindows.h:79
const char * name() override
Definition FFTWindows.h:258
float factor_internal(int idx) override
Definition FFTWindows.h:259
const char * name()
Definition FFTWindows.h:141
float factor_internal(int idx)
Definition FFTWindows.h:138
const char * name()
Definition FFTWindows.h:153
float factor_internal(int idx)
Definition FFTWindows.h:157
const char * name() override
Definition FFTWindows.h:189
float factor_internal(int idx) override
Definition FFTWindows.h:190
const char * name()
Definition FFTWindows.h:126
float factor_internal(int idx)
Definition FFTWindows.h:122
const char * name()
Definition FFTWindows.h:171
float factor_internal(int idx)
Definition FFTWindows.h:172
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
const char * name() override
Definition FFTWindows.h:275
float factor_internal(int idx) override
Definition FFTWindows.h:276
const float sixPi
Definition FFTWindows.h:59
int samples()
Provides the number of samples (fft length).
Definition FFTWindows.h:49
float ratio(int idx)
Definition FFTWindows.h:65
virtual void begin(int samples)
Setup the window function providing the fft length.
Definition FFTWindows.h:33
virtual float factor_internal(int idx)=0
float samples_minus_1
Definition FFTWindows.h:54
const float fourPi
Definition FFTWindows.h:58
const float twoPi
Definition FFTWindows.h:57
int i_samples
Definition FFTWindows.h:55
float factor(int idx)
Definition FFTWindows.h:41
virtual const char * name()=0
int i_half_samples
Definition FFTWindows.h:56
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6