9e5fd63291e173f42e14a6b5efec252ccb9342a7
Add Geigel double-talk detection so the adaptive filter stops diverging when the near-end talks over the far-end (the failure the Stage B demo exposed: ERLE went negative as the filter mistook near-end voice for echo). - src/dsp/aec.rs: DoubleTalkDetector — Geigel test (mic level vs a sliding- window peak of the far-end, via an O(1) monotonic-deque max) with a hangover latch. EchoCanceller — wraps Nlms + the detector, freezing adaptation while double-talk is declared; reports the double-talk rate; DTD can be toggled off for A/B. 5 aec tests (detector fires on near-end not echo; DTD protects a converged filter through double-talk, +15 dB over raw NLMS). - specview aec: now uses EchoCanceller with tunable --dtd-threshold / --hangover / --near-onset / --no-dtd, and prints the double-talk %. Tuning found with the harness (white far-end, -12 dB echo, near-end onset mid-call): DTD threshold 0.5 is the sweet spot — late-call ERLE +29.6 dB with DTD vs -4.0 dB without (a 33 dB swing); 0.35 over-triggers (never learns), 0.7 under-triggers (drifts). Default set to 0.5. Also documents the false-positive /miss tradeoff and that correlated (pink/speech) far-ends converge slower. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>