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
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 {
88 // process only if there is a change
90 if (p_wf->samples() != samples) {
92 int to_be_size = i_half_samples + 1;
93 if (buffer.size() != to_be_size) {
94 buffer.resize(to_be_size);
95 for (int j = 0; j <= i_half_samples; j++) {
96 buffer[j] = p_wf->factor(j);
97 }
98 }
99 }
100 }
101
102 protected:
105
106 float factor_internal(int idx) override {
107 if (idx < 0 || idx > i_half_samples) return 0.0;
108 return buffer[idx];
109 }
110};
111
118class Rectange : public WindowFunction {
119 public:
120 Rectange() = default;
121 float factor_internal(int idx) {
122 if (idx < 0 || idx >= i_samples) return 0;
123 return 1.0f;
124 }
125 const char* name() { return "Rectange"; }
126};
127
134class Hamming : public WindowFunction {
135 public:
136 Hamming() = default;
137 float factor_internal(int idx) {
138 return 0.54f - (0.46f * cos(twoPi * ratio(idx)));
139 }
140 const char* name() { return "Hamming"; }
141};
142
149class Hann : public WindowFunction {
150 public:
151 Hann() = default;
152 const char* name() { return "Hann"; }
153
154 float factor_internal(int idx) {
155 return 0.54f * (1.0f - cos(twoPi * ratio(idx)));
156 }
157};
158
165class Triangle : public WindowFunction {
166 public:
167 Triangle() = default;
168 const char* name() { return "Triangle"; }
169 float factor_internal(int idx) {
170 return 1.0f - ((2.0f * fabs((idx - 1) -
171 (static_cast<float>(i_samples - 1) / 2.0f))) /
173 }
174};
175
183class Nuttall : public WindowFunction {
184 public:
185 Nuttall() = default;
186 const char* name() override { return "Nuttall"; }
187 float factor_internal(int idx) override {
188 float r = ratio(idx);
189 return 0.355768f - (0.487396f * (cos(twoPi * r))) +
190 (0.144232f * (cos(fourPi * r))) - (0.012604f * (cos(sixPi * r)));
191 }
192};
193
201class Blackman : public WindowFunction {
202 public:
203 Blackman() = default;
204 const char* name() override { return "Blackman"; }
205 float factor_internal(int idx) override {
206 float r = ratio(idx);
207 return 0.42323f - (0.49755f * (cos(twoPi * r))) +
208 (0.07922f * (cos(fourPi * r)));
209 }
210};
211
219 public:
220 BlackmanNuttall() = default;
221 const char* name() override { return "BlackmanNuttall"; }
222 float factor_internal(int idx) override {
223 float r = ratio(idx);
224 return 0.3635819f - (0.4891775f * (cos(twoPi * r))) +
225 (0.1365995f * (cos(fourPi * r))) - (0.0106411f * (cos(sixPi * r)));
226 }
227};
228
236 public:
237 BlackmanHarris() = default;
238 const char* name() override { return "BlackmanHarris"; }
239 float factor_internal(int idx) override {
240 float r = ratio(idx);
241 return 0.35875f - (0.48829f * (cos(twoPi * r))) +
242 (0.14128f * (cos(fourPi * r))) - (0.01168f * (cos(sixPi * r)));
243 }
244};
245
252class FlatTop : public WindowFunction {
253 public:
254 FlatTop() = default;
255 const char* name() override { return "FlatTop"; }
256 float factor_internal(int idx) override {
257 float r = ratio(idx);
258 return 0.2810639f - (0.5208972f * cos(twoPi * r)) +
259 (0.1980399f * cos(fourPi * r));
260 }
261};
262
269class Welch : public WindowFunction {
270 public:
271 Welch() = default;
272 const char* name() override { return "Welch"; }
273 float factor_internal(int idx) override {
274 float tmp =
275 (((idx - 1) - samples_minus_1 / 2.0f) / (samples_minus_1 / 2.0f));
276 return 1.0f - (tmp * tmp);
277 }
278};
279
280} // namespace audio_tools
#define assert(T)
Definition avr.h:10
BlackmanHarris FFT Window function.
Definition FFTWindows.h:235
const char * name() override
Definition FFTWindows.h:238
float factor_internal(int idx) override
Definition FFTWindows.h:239
Blackman FFT Window function.
Definition FFTWindows.h:201
const char * name() override
Definition FFTWindows.h:204
float factor_internal(int idx) override
Definition FFTWindows.h:205
BlackmanNuttall FFT Window function.
Definition FFTWindows.h:218
const char * name() override
Definition FFTWindows.h:221
float factor_internal(int idx) override
Definition FFTWindows.h:222
Buffered window function, so that we do not need to re-calculate the values.
Definition FFTWindows.h:77
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:106
BufferedWindow(WindowFunction *wf)
Definition FFTWindows.h:79
FlatTop FFT Window function.
Definition FFTWindows.h:252
const char * name() override
Definition FFTWindows.h:255
float factor_internal(int idx) override
Definition FFTWindows.h:256
Hamming FFT Window function.
Definition FFTWindows.h:134
const char * name()
Definition FFTWindows.h:140
float factor_internal(int idx)
Definition FFTWindows.h:137
Hann FFT Window function.
Definition FFTWindows.h:149
const char * name()
Definition FFTWindows.h:152
float factor_internal(int idx)
Definition FFTWindows.h:154
Nuttall FFT Window function.
Definition FFTWindows.h:183
const char * name() override
Definition FFTWindows.h:186
float factor_internal(int idx) override
Definition FFTWindows.h:187
Rectange FFT Window function.
Definition FFTWindows.h:118
const char * name()
Definition FFTWindows.h:125
float factor_internal(int idx)
Definition FFTWindows.h:121
Triangle FFT Window function.
Definition FFTWindows.h:165
const char * name()
Definition FFTWindows.h:168
float factor_internal(int idx)
Definition FFTWindows.h:169
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
bool resize(size_t newSize, T value)
Definition Vector.h:266
int size()
Definition Vector.h:178
Welch FFT Window function.
Definition FFTWindows.h:269
const char * name() override
Definition FFTWindows.h:272
float factor_internal(int idx) override
Definition FFTWindows.h:273
FFT Window Function.
Definition FFTWindows.h:28
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