arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
FFTWindows.h
Go to the documentation of this file.
1
11#pragma once
12
13#include <math.h>
14#include "AudioTools/CoreAudio/AudioBasic/Collections/Vector.h"
15
16namespace audio_tools {
17
25 public:
26 WindowFunction() = default;
27
29 virtual void begin(int samples) {
30 this->samples_minus_1 = -1.0f + samples;
31 this->i_samples = samples;
32 this->i_half_samples = samples / 2;
33 }
34
37 inline float factor(int idx) {
38 assert(i_half_samples == i_samples / 2);
39 float result = idx <= i_half_samples ? factor_internal(idx)
40 : factor_internal(i_samples - idx - 1);
41 return result > 1.0f ? 1.0f : result;
42 }
43
45 inline int samples() { return i_samples; }
46
47 virtual const char* name() = 0;
48
49 protected:
50 float samples_minus_1 = 0.0f;
51 int i_samples = 0;
52 int i_half_samples = 0;
53 const float twoPi = 6.28318531f;
54 const float fourPi = 12.56637061f;
55 const float sixPi = 18.84955593f;
56
57 // virtual function provide implementation in subclass
58 virtual float factor_internal(int idx) = 0;
59
60 // the ratio idx / samples -1
61 inline float ratio(int idx) {
62 return (static_cast<float>(idx)) / samples_minus_1;
63 }
64};
65
73 public:
75
76 const char* name() {
77 static char buffer[80] = "Buffered ";
78 strncpy(buffer + 9, p_wf->name(), 69);
79 return buffer;
80 }
81
82 virtual void begin(int samples) override {
83 // process only if there is a change
85 if (p_wf->samples() != samples) {
86 p_wf->begin(samples);
87 int to_be_size = i_half_samples + 1;
88 if (buffer.size() != to_be_size) {
89 buffer.resize(to_be_size);
90 for (int j = 0; j <= i_half_samples; j++) {
91 buffer[j] = p_wf->factor(j);
92 }
93 }
94 }
95 }
96
97 protected:
98 WindowFunction* p_wf = nullptr;
99 Vector<float> buffer{0};
100
101 float factor_internal(int idx) override {
102 if (idx < 0 || idx > i_half_samples) return 0.0;
103 return buffer[idx];
104 }
105};
106
112class Rectange : public WindowFunction {
113 public:
114 Rectange() = default;
115 float factor_internal(int idx) {
116 if (idx < 0 || idx >= i_samples) return 0;
117 return 1.0f;
118 }
119 const char* name() { return "Rectange"; }
120};
121
127class Hamming : public WindowFunction {
128 public:
129 Hamming() = default;
130 float factor_internal(int idx) {
131 return 0.54f - (0.46f * cos(twoPi * ratio(idx)));
132 }
133 const char* name() { return "Hamming"; }
134};
135
141class Hann : public WindowFunction {
142 public:
143 Hann() = default;
144 const char* name() { return "Hann"; }
145
146 float factor_internal(int idx) {
147 return 0.54f * (1.0f - cos(twoPi * ratio(idx)));
148 }
149};
150
156class Triangle : public WindowFunction {
157 public:
158 Triangle() = default;
159 const char* name() { return "Triangle"; }
160 float factor_internal(int idx) {
161 return 1.0f - ((2.0f * fabs((idx - 1) -
162 (static_cast<float>(i_samples - 1) / 2.0f))) /
163 samples_minus_1);
164 }
165};
166
173class Nuttall : public WindowFunction {
174 public:
175 Nuttall() = default;
176 const char* name() { return "Nuttall"; }
177 float factor_internal(int idx) override {
178 float r = ratio(idx);
179 return 0.355768f - (0.487396f * (cos(twoPi * r))) +
180 (0.144232f * (cos(fourPi * r))) - (0.012604f * (cos(sixPi * r)));
181 }
182};
183
190class Blackman : public WindowFunction {
191 public:
192 Blackman() = default;
193 const char* name() { return "Blackman"; }
194 float factor_internal(int idx) override {
195 float r = ratio(idx);
196 return 0.42323f - (0.49755f * (cos(twoPi * r))) +
197 (0.07922f * (cos(fourPi * r)));
198 }
199};
200
207 public:
208 BlackmanNuttall() = default;
209 const char* name() { return "BlackmanNuttall"; }
210 float factor_internal(int idx) override {
211 float r = ratio(idx);
212 return 0.3635819f - (0.4891775f * (cos(twoPi * r))) +
213 (0.1365995f * (cos(fourPi * r))) - (0.0106411f * (cos(sixPi * r)));
214 }
215};
216
223 public:
224 BlackmanHarris() = default;
225 const char* name() { return "BlackmanHarris"; }
226 float factor_internal(int idx) override {
227 float r = ratio(idx);
228 return 0.35875f - (0.48829f * (cos(twoPi * r))) +
229 (0.14128f * (cos(fourPi * r))) - (0.01168f * (cos(sixPi * r)));
230 }
231};
232
238class FlatTop : public WindowFunction {
239 public:
240 FlatTop() = default;
241 const char* name() { return "FlatTop"; }
242 float factor_internal(int idx) override {
243 float r = ratio(idx);
244 return 0.2810639f - (0.5208972f * cos(twoPi * r)) +
245 (0.1980399f * cos(fourPi * r));
246 }
247};
248
254class Welch : public WindowFunction {
255 public:
256 Welch() = default;
257 const char* name() { return "Welch"; }
258 float factor_internal(int idx) override {
259 float tmp =
260 (((idx - 1) - samples_minus_1 / 2.0f) / (samples_minus_1 / 2.0f));
261 return 1.0f - (tmp * tmp);
262 }
263};
264
265} // namespace audio_tools
BlackmanHarris FFT Window function.
Definition FFTWindows.h:222
Blackman FFT Window function.
Definition FFTWindows.h:190
BlackmanNuttall FFT Window function.
Definition FFTWindows.h:206
Buffered window function, so that we do not need to re-calculate the values.
Definition FFTWindows.h:72
virtual void begin(int samples) override
Setup the window function providing the fft length.
Definition FFTWindows.h:82
FlatTop FFT Window function.
Definition FFTWindows.h:238
Hamming FFT Window function.
Definition FFTWindows.h:127
Hann FFT Window function.
Definition FFTWindows.h:141
Nuttall FFT Window function.
Definition FFTWindows.h:173
Rectange FFT Window function.
Definition FFTWindows.h:112
Triangle FFT Window function.
Definition FFTWindows.h:156
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
Welch FFT Window function.
Definition FFTWindows.h:254
FFT Window Function.
Definition FFTWindows.h:24
int samples()
Provides the number of samples (fft length)
Definition FFTWindows.h:45
virtual void begin(int samples)
Setup the window function providing the fft length.
Definition FFTWindows.h:29
float factor(int idx)
Definition FFTWindows.h:37
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioConfig.h:885