Skip to content

Commit bbb9ca2

Browse files
committed
FFT Windows corrections
1 parent 2274b5c commit bbb9ca2

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
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->factor(current_pos) * sample;
323+
result = cfg.window_function->ratio(current_pos) * sample;
324324
}
325325
return result;
326326
}

src/AudioLibs/FFT/FFTWindows.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,31 @@ class WindowFunction {
2424
public:
2525
WindowFunction() = default;
2626

27+
/// Setup the window function providing the fft length
2728
virtual void begin(int samples) {
2829
this->samples_minus_1 = -1.0f + samples;
2930
this->i_samples = samples;
31+
this->i_half_samples = samples / 2;
3032
}
3133

3234
inline float ratio(int idx) {
33-
float result = (static_cast<float>(idx)) / samples_minus_1;
34-
return result>1.0f ? 1.0f : result;
35+
return idx < i_half_samples ? factor(idx) : factor(i_samples-idx);
3536
}
3637

3738
inline int samples() { return i_samples; }
38-
virtual float factor(int idx) = 0;
3939

4040
protected:
4141
float samples_minus_1 = 0.0f;
4242
int i_samples = 0;
43+
int i_half_samples = 0;
4344
const float twoPi = 6.28318531f;
4445
const float fourPi = 12.56637061f;
4546
const float sixPi = 18.84955593f;
47+
48+
// virtual function provide implementation in subclass
49+
virtual float factor(int idx) = 0;
50+
51+
4652
};
4753

4854
/**
@@ -64,7 +70,7 @@ class BufferedWindow : public WindowFunction {
6470
len = samples / 2;
6571
buffer.resize(len);
6672
for (int j = 0; j < len; j++) {
67-
buffer[j] = p_wf->factor(j);
73+
buffer[j] = p_wf->ratio(j);
6874
}
6975
}
7076
}

0 commit comments

Comments
 (0)