Skip to content

Commit 9d15dbc

Browse files
committed
FFT Window functions
1 parent bbb9ca2 commit 9d15dbc

File tree

2 files changed

+26
-21
lines changed

2 files changed

+26
-21
lines changed

src/AudioLibs/AudioFFT.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ class AudioFFTBase : public AudioPrint {
320320
T windowedSample(T sample){
321321
T result = sample;
322322
if (cfg.window_function!=nullptr){
323-
result = cfg.window_function->ratio(current_pos) * sample;
323+
result = cfg.window_function->factor(current_pos) * sample;
324324
}
325325
return result;
326326
}

src/AudioLibs/FFT/FFTWindows.h

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ class WindowFunction {
2828
virtual void begin(int samples) {
2929
this->samples_minus_1 = -1.0f + samples;
3030
this->i_samples = samples;
31-
this->i_half_samples = samples / 2;
31+
this->i_half_samples = samples / 2 - 1;
3232
}
3333

34-
inline float ratio(int idx) {
35-
return idx < i_half_samples ? factor(idx) : factor(i_samples-idx);
34+
inline float factor(int idx) {
35+
return idx < i_half_samples ? factor_internal(idx) : factor_internal(i_samples-idx-1);
3636
}
3737

3838
inline int samples() { return i_samples; }
@@ -46,8 +46,12 @@ class WindowFunction {
4646
const float sixPi = 18.84955593f;
4747

4848
// virtual function provide implementation in subclass
49-
virtual float factor(int idx) = 0;
49+
virtual float factor_internal(int idx) = 0;
5050

51+
inline float ratio(int idx) {
52+
float result = (static_cast<float>(idx)) / samples_minus_1;
53+
return result>1.0f ? 1.0f : result;
54+
}
5155

5256
};
5357

@@ -63,26 +67,27 @@ class BufferedWindow : public WindowFunction {
6367
BufferedWindow(BufferedWindow const&) = delete;
6468
BufferedWindow& operator=(BufferedWindow const&) = delete;
6569

66-
virtual void begin(int samples) {
70+
virtual void begin(int samples) override {
6771
// process only if there is a change
72+
WindowFunction::begin(samples);
6873
if (p_wf->samples() != samples) {
6974
p_wf->begin(samples);
7075
len = samples / 2;
7176
buffer.resize(len);
7277
for (int j = 0; j < len; j++) {
73-
buffer[j] = p_wf->ratio(j);
78+
buffer[j] = p_wf->factor(j);
7479
}
7580
}
7681
}
7782

78-
inline float factor(int idx) {
79-
return idx < len ? buffer[idx] : buffer[i_samples - idx];
80-
}
81-
8283
protected:
8384
WindowFunction* p_wf = nullptr;
8485
Vector<float> buffer{0};
8586
int len;
87+
88+
float factor_internal(int idx) override {
89+
return idx < len ? buffer[idx] : buffer[i_samples - idx];
90+
}
8691
};
8792

8893
/**
@@ -93,7 +98,7 @@ class BufferedWindow : public WindowFunction {
9398
class Rectange : public WindowFunction {
9499
public:
95100
Rectange() = default;
96-
float factor(int idx) { return 1.0f; }
101+
float factor_internal(int idx) { return 1.0f; }
97102
};
98103

99104
/**
@@ -104,7 +109,7 @@ class Rectange : public WindowFunction {
104109
class Hamming : public WindowFunction {
105110
public:
106111
Hamming() = default;
107-
float factor(int idx) {
112+
float factor_internal(int idx) {
108113
return 0.54f - (0.46f * cos(twoPi * ratio(idx)));
109114
}
110115
};
@@ -117,7 +122,7 @@ class Hamming : public WindowFunction {
117122
class Hann : public WindowFunction {
118123
public:
119124
Hann() = default;
120-
float factor(int idx) {
125+
float factor_internal(int idx) {
121126
return 0.54f * (1.0f - cos(twoPi * ratio(idx)));
122127
}
123128
};
@@ -130,7 +135,7 @@ class Hann : public WindowFunction {
130135
class Triangle : public WindowFunction {
131136
public:
132137
Triangle() = default;
133-
float factor(int idx) {
138+
float factor_internal(int idx) {
134139
return 1.0f - ((2.0f * fabs((idx - 1) -
135140
(static_cast<float>(i_samples - 1) / 2.0f))) /
136141
samples_minus_1);
@@ -146,7 +151,7 @@ class Triangle : public WindowFunction {
146151
class Nuttall : public WindowFunction {
147152
public:
148153
Nuttall() = default;
149-
float factor(int idx) {
154+
float factor_internal(int idx) override {
150155
float r = ratio(idx);
151156
return 0.355768f - (0.487396f * (cos(twoPi * r))) +
152157
(0.144232f * (cos(fourPi * r))) - (0.012604f * (cos(sixPi * r)));
@@ -162,7 +167,7 @@ class Nuttall : public WindowFunction {
162167
class Blackman : public WindowFunction {
163168
public:
164169
Blackman() = default;
165-
float factor(int idx) {
170+
float factor_internal(int idx)override {
166171
float r = ratio(idx);
167172
return 0.42323f - (0.49755f * (cos(twoPi * r))) +
168173
(0.07922f * (cos(fourPi * r)));
@@ -177,7 +182,7 @@ class Blackman : public WindowFunction {
177182
class BlackmanNuttall : public WindowFunction {
178183
public:
179184
BlackmanNuttall() = default;
180-
float factor(int idx) {
185+
float factor_internal(int idx) override{
181186
float r = ratio(idx);
182187
return 0.3635819f - (0.4891775f * (cos(twoPi * r))) +
183188
(0.1365995f * (cos(fourPi * r))) - (0.0106411f * (cos(sixPi * r)));
@@ -192,7 +197,7 @@ class BlackmanNuttall : public WindowFunction {
192197
class BlackmanHarris : public WindowFunction {
193198
public:
194199
BlackmanHarris() = default;
195-
float factor(int idx) {
200+
float factor_internal(int idx) override{
196201
float r = ratio(idx);
197202
return 0.35875f - (0.48829f * (cos(twoPi * r))) +
198203
(0.14128f * (cos(fourPi * r))) - (0.01168f * (cos(sixPi * r)));
@@ -207,7 +212,7 @@ class BlackmanHarris : public WindowFunction {
207212
class FlatTop : public WindowFunction {
208213
public:
209214
FlatTop() = default;
210-
float factor(int idx) {
215+
float factor_internal(int idx) override{
211216
float r = ratio(idx);
212217
return 0.2810639f - (0.5208972f * cos(twoPi * r)) +
213218
(0.1980399f * cos(fourPi * r));
@@ -222,7 +227,7 @@ class FlatTop : public WindowFunction {
222227
class Welch : public WindowFunction {
223228
public:
224229
Welch() = default;
225-
float factor(int idx) {
230+
float factor_internal(int idx) override{
226231
float tmp = (((idx - 1) - samples_minus_1 / 2.0f) / (samples_minus_1 / 2.0f));
227232
return 1.0f - (tmp*tmp);
228233
}

0 commit comments

Comments
 (0)