600257a7c4
Replace the per-sample ring-buffer FIR convolution with block-level overlap-save convolution using rustfft. For a block of M samples and N taps the old approach costs O(N·M); the new one costs O(M log M), with rustfft using SIMD (AVX2/SSE4) internally. Key changes: - Add rustfft = "6" dependency - Add BlockFirFilter: overlap-save filter with pre-computed H(f) and a single forward+inverse FFT pair per block (no per-sample multiply) - ChannelDsp.process_block() now: 1. Batch-mixes entire block to baseband in one vectorisable loop 2. Applies BlockFirFilter to I and Q (one FFT pair each) 3. Decimates and demodulates as before - Keep the old FirFilter for unit tests (sample-by-sample interface) - Add BlockFirFilter unit tests (DC passthrough, length preservation) - IQ_BLOCK_SIZE promoted to pub const for use in filter sizing For the default config (4096-sample blocks, 64 taps, decim=40): Old: ~262144 multiply-adds per FIR × 2 components = ~524k per block New: ~2 × (3 × 8192 × log2(8192)) ops, all SIMD-vectorised by rustfft Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Stan Grams <sjg@haxx.space>