dsp/: C++ skeleton with working FFT/WOLA STFT
- Cooley-Tukey radix-2 FFT (forward + inverse with /N normalization) - WOLA STFT/ISTFT with Hann window (nfft=2048, hop=512) - WAV16 read + WAV24 write (fixed aliasing bug in read) - Fixed in-place processing bug (separate input/output buffers) - Biquad filter (peak/shelf/reject) - Peak detector skeleton - MS encode/decode (M8 stereo) - Harness: WAV16 → STFT → WAV24 passthrough verified non-zero output Verified: burst500.wav passthrough produces output RMS=0.0678
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
#include "fft_stage.hpp"
|
||||
#include <cstring>
|
||||
|
||||
namespace fft_stage {
|
||||
|
||||
void cplx_mul(double* out, const double* in1, const double* in2, uint32_t n) {
|
||||
for (uint32_t i = 0; i < n; i += 64) {
|
||||
for (uint32_t j = 0; j < 4; j++) {
|
||||
double re1 = in1[i + j*2 + 0];
|
||||
double im1 = in1[i + j*2 + 1];
|
||||
double re2 = in2[i + j*2 + 0];
|
||||
double im2 = in2[i + j*2 + 1];
|
||||
out[i + j*2 + 0] = re1*re2 - im1*im2;
|
||||
out[i + j*2 + 1] = re1*im2 + im1*re2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void stage_complex(double* out, const double* in, const double* tw, uint32_t n) {
|
||||
for (uint32_t i = 0; i < n; i += 64) {
|
||||
for (uint32_t j = 0; j < 4; j++) {
|
||||
double re1 = in[i + j*2 + 0];
|
||||
double im1 = in[i + j*2 + 1];
|
||||
double re2 = tw[i + j*2 + 0];
|
||||
double im2 = tw[i + j*2 + 1];
|
||||
out[i + j*2 + 0] = re1*re2 - im1*im2;
|
||||
out[i + j*2 + 1] = re1*im2 + im1*re2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void stage_double(double* out, const double* in, const double* tw, uint32_t n) {
|
||||
for (uint32_t i = 0; i < n; i += 64) {
|
||||
for (uint32_t j = 0; j < 8; j++) {
|
||||
out[i + j] = in[i + j] * tw[i + j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user