Skip to content

AEC: open-loop echo validation, the echo chapter, and the afc~/aec~ naming (HANDOFF Rev 4) - #4

Merged
tap merged 3 commits into
mainfrom
claude/handoff-review-planning-nkc5q4
Jul 16, 2026
Merged

AEC: open-loop echo validation, the echo chapter, and the afc~/aec~ naming (HANDOFF Rev 4)#4
tap merged 3 commits into
mainfrom
claude/handoff-review-planning-nkc5q4

Conversation

@tap

@tap tap commented Jul 16, 2026

Copy link
Copy Markdown
Owner

The MuTap half of HANDOFF Rev 4's "next effort" (AEC objects + echo chapter), in three commits:

HANDOFF Rev 4 — the plan

Records the chosen effort as a three-stage plan and settles the external-naming open decision: mutap.afc~ (rename from the mutap.defeed~ placeholder) and mutap.aec~ for the new echo canceller.

Stage 1 — open-loop AEC validation layer

  • tests/support/echo_scenario.h: block-synchronous open-loop echo simulation (far-end → true path → mic, near-end injection) reporting both the observable ERLE and the true residual-echo suppression only a simulation can measure.
  • tests/test_aec.cpp (9 tests, thresholds measured first per the house workflow): at 0 dB double-talk the naive estimate is kicked past useless (median misalignment +3.4 dB) while PEM holds −8.5 dB and the Kalman core holds −13.3 dB with 13.4 dB suppression through the segment, config-free; the gated M4 stack freezes flat (±0.1 dB); the warped predictor won the music double-talk suppression in all 18 room × seed pairs; typed f32/f64 single-talk suites on the studio fixture room.
  • Emulated-target selections updated in both places (working note 4): bare_metal_main.cpp and tests/CMakeLists.txt, now 58 tests on-target.
  • Notebook section 8 (via the generator, re-executed): AEC misalignment traces + the ERLE-vs-double-talk scoreboard.

Stage 3 — the book chapter + rename sweep

  • book/src/echo-cancellation.md ("The echo canceller"), honesty rule observed: every number from test_aec.cpp/notebook section 8, every attribute exists on the mutap.aec~ external (MuTap-Max PR).
  • mutap.defeed~mutap.afc~ across chapter 1, the introduction, README, and the notebook generator; HANDOFF marks the stages done and re-ranks what's next.

Verification

Full suite green locally: 97/97 (Linux GCC, Release), clang-format/tidy clean, notebook executed with zero errors.

Merge order: this PR first, then tap/MuTap-Max#claude/handoff-review-planning-nkc5q4 — and per working note 6, the MuTap-Max submodule pin needs one final bump after this rebase-merge lands.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TLE2rvptWxV8catE8vTvgx


Generated by Claude Code

claude added 3 commits July 15, 2026 23:05
…aec~)

Planning revision, no code. Records the chosen next effort — AEC objects
+ the echo-cancellation book chapter — as a three-stage plan (validation
layer, mutap.aec~ external + the defeed~->afc~ rename + submodule
re-pin, book chapter), and resolves the external-naming open decision.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TLE2rvptWxV8catE8vTvgx
…tests

The cores already run open loop — pem_afc::process_block(x, y, e) is the
AEC signature, and the Gil-Cacho 2014 paper the PEM structure implements
is an open-loop double-talk framework. This adds the validation layer:

- tests/support/echo_scenario.h: block-synchronous open-loop echo
  simulation (far-end -> true path -> mic, near-end injection) reporting
  both observable ERLE and the true residual-echo suppression only a
  simulation can measure; shared misalignment metric.
- tests/test_aec.cpp (9 tests, every threshold measured first): 0 dB
  double-talk kicks the naive estimate past useless (median +3.4 dB
  misalignment) where PEM holds -8.5 and the Kalman core -13.3 with
  13.4 dB suppression, config-free; the gated M4 stack freezes flat;
  the warped predictor beat the speech cascade's music double-talk
  suppression in all 18 room x seed pairs measured; typed float/double
  single-talk suites on the studio fixture room.
- Emulated-target selections updated in BOTH places (bare_metal_main.cpp
  and tests/CMakeLists.txt): +aec_test/0, 58 tests on-target.
- Notebook section 8 (via the generator): the AEC misalignment traces
  and the ERLE-vs-double-talk scoreboard.
- README Status: the AEC bullet and the measured numbers; HANDOFF: Stage 1
  of 'The next effort' done.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TLE2rvptWxV8catE8vTvgx
The echo-cancellation chapter, per the honesty rule: every number is
measured by tests/test_aec.cpp or notebook section 8 (the naive learner
kicked past useless by 0 dB double-talk, the gate's +-0.1 dB freeze, the
PEM/Kalman engines adapting through it, the excitation-weighted ERLE
trade, the warped predictor's 18-of-18 music sweep), and every attribute
described exists on the mutap.aec~ external that Stage 2 added.

Also the MuTap-side half of the Rev 4 rename: mutap.defeed~ ->
mutap.afc~ across chapter 1, the introduction, README, and the notebook
generator (notebook re-executed); HANDOFF marks Stages 2-3 done and
re-ranks what's next.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TLE2rvptWxV8catE8vTvgx
@tap
tap merged commit 276bf29 into main Jul 16, 2026
20 checks passed
tap pushed a commit to tap/MuTap-Max that referenced this pull request Jul 16, 2026
tap/MuTap#4 merged; the pin moves from the pre-AEC 7a82d0d to the new
tip so the gitlink stays reachable once branches are cleaned up
(HANDOFF working note 6).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TLE2rvptWxV8catE8vTvgx
tap pushed a commit to tap/MuTap-Max that referenced this pull request Jul 16, 2026
tap/MuTap#4 merged; the pin moves from the pre-AEC 7a82d0d to the new
tip so the gitlink stays reachable once branches are cleaned up
(HANDOFF working note 6).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TLE2rvptWxV8catE8vTvgx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants