eeb725f996c1dd6e3e316acd039d08bc8a4a2131
Stage A+B of the in-process AEC: a Normalized LMS adaptive-filter echo canceller and a synthetic echo-path simulator, driven end-to-end by a new `specview aec` command so cancellation can be measured fully headless on conjured signals (no speakers/mic needed). - src/dsp/echo_path.rs: EchoPath — synthetic acoustic echo (bulk delay + exponentially-decaying diffuse RIR, energy-normalized to a target attenuation) convolved over a far-end signal. Gives ground-truth echo. - src/dsp/aec.rs: Nlms — sample-at-a-time NLMS adaptive FIR (ring-buffered reference history, energy-normalized update, freezable for double-talk). Cleaned output = mic minus the learned echo estimate. - specview aec: far -> sim echo -> (+ optional near-end) -> cancel -> measure. ERLE via oracle residual (cleaned - near), broadband + early/late (convergence) + per voice band, optional before/after spectrograms. - 6 new tests (path delay/attenuation, NLMS convergence >20 dB on a known path, frozen-filter no-op, near-end passthrough). 33 dsp tests total. Verified: single-talk pink-noise echo cancels +14.5 -> +32.0 dB ERLE as the filter converges; double-talk (no DTD yet) drives ERLE negative as the filter diverges onto the near-end tone — the motivating result for Stage C (DTD). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>