STFT partitioned conv: FIR construction pipeline (52b550-52b8bb)
Implement minimum-phase FIR design from BLOCKMAP: - buildFirFromMask: mask → 1/mask (reciprocal via log→negate→exp) → IFFT → causal window → FFT → normalize → complex multiply - RT_FIRCONV=2 activates the new path - RT_FIRCONV=1 preserved as simple mask × audio (legacy) Results (tone1kq single band): default (pointwise): 500Hz=-25.35 dB, 1kHz=-50.60 dB FIRCONV=1 (mask mul): 500Hz=-1.31 dB, 1kHz=-25.92 dB FIRCONV=2 (min-phase): same as FIRCONV=1 The twiddle stages (ops B/C/D with cos/sin tables) are the missing piece for bit-exact FIR construction. They perform FMA operations with twiddle factors that modify the mask shape. Note: dual_b1q_0.5.wav reference is empty (0 bytes) — corpus can't run. Needs regeneration.
This commit is contained in:
@@ -37,4 +37,14 @@ private:
|
||||
void computeWindow();
|
||||
void stftFrame(const float* in, std::complex<double>* out);
|
||||
void istftFrame(std::complex<double>* in, float* out, float* overlap);
|
||||
|
||||
// FIR construction from detector mask (52b550-52b8bb pipeline):
|
||||
// mask → log → sign-invert → EXP → twiddle ops → window → normalize
|
||||
// Produces frequency-domain FIR kernel for complex multiply application.
|
||||
void buildFirFromMask(const float* mask, std::complex<double>* fir, size_t nbin);
|
||||
|
||||
// WIN_freq: live-captured freq-path window (0x540658), 0.5→1.0
|
||||
std::vector<float> win_freq_;
|
||||
bool win_freq_loaded_ = false;
|
||||
void loadWinFreq();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user