ITU compliance Stage 5 (core): the preset as library API, the C ABI chain, the claims - #13
Merged
Conversation
mutap::aec_chain_preset<Sample>(block, partitions, fs) moves the pinned compliance configuration from tests/support/itu_chain.h into mutap/postfilter.h: one rule rescales every per-block time constant to hold the physically calibrated behavior at any (block, sample rate) geometry, with the two deliberate exceptions documented in place (the canceller transition is not rescaled; the comfort-noise floor bias is calibrated per geometry, interpolated between the two measured points and clamped to the measured neighborhood). chain_config() in the test support header is now a one-line call into the preset, so the suite gates the preset itself — full suite re-verified green (156/156) after the refactor. The C ABI grows the mutap_aec_* family: the full chain (raw FD-Kalman canceller + residual suppressor + comfort noise + receive guard) built from the preset, with echo_explained/converged introspection and the same NULL-tolerant contract as the other families; exercised from a C driver (deep tail suppression, convergence certification, clone/reset). Claims land where users read them: README gains the ITU-T compliance section with the requirement/measured/margin table (worst-rate values) and the scope caveats stated honestly; the book's echo chapter gains "The last 30 dB: @PostFilter" and the two new knobs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TLE2rvptWxV8catE8vTvgx
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TLE2rvptWxV8catE8vTvgx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The MuTap half of Stage 5 — based directly on
main(which now has Stage 4 via #12); no stacked base this time.mutap::aec_chain_preset<Sample>(block, partitions, fs)(mutap/postfilter.h): the pinned compliance configuration graduates from the test support header into the library. One rule rescales every per-block time constant so the physically calibrated behavior holds at any (block, sample-rate) geometry; the two deliberate exceptions are documented in place — the canceller transition stays 0.9998 per block (rescaling it traded the time-variant-path row to the wire), and the comfort-noise floor bias is calibrated per geometry (interpolated between the two measured points, ratio 1 → 4.0 and ratio 3 → 5.6, clamped to the measured neighborhood, with an explicit "uncalibrated far outside this span" warning).tests/support/itu_chain.hchain_config()is now one line — a call into the preset — so the compliance suite gates the preset itself: any change to it lands as a failing measured gate, never as silent drift. Full suite re-verified green after the refactor: 156/156.C ABI: the
mutap_aec_*family exposes the full chain (raw FD-Kalman canceller + residual suppressor + comfort noise + initial receive guard) to FFI consumers, built from the preset —create(block, partitions, sample_rate, comfort_noise, receive_guard),process,echo_explained,converged,set_adaptation,reset,clone, with the families' NULL-tolerant contract. Exercised from a plain C driver: deep tail suppression on an echo-only scenario, convergence certification, clone/reset/NULL paths.Claims: README gains an "ITU-T compliance" section — the requirement/measured/margin table at worst-rate values (TCL +22 dB, echo level +18 dB, spectral mask +13 dB, P.340 full-duplex echo loss +10 dB, …) with the scope caveats stated plainly (G.168-adapted framing, G.167 run-and-reported, synthetic-signal method equivalence pending vector procurement). The book's echo chapter gains "The last 30 dB:
@postfilter" — the suppressor/comfort-noise/receive-guard story for non-DSP readers — plus the two new knob entries.Resolves
The HANDOFF core follow-up filed by the Max half: the external's duplicated scaling rule now has a library home. Remaining after this merges (MuTap-Max): re-pin the submodule and switch
mutap.aec~'smake_chain_configto call the preset — that closes the ITU compliance plan, Stages 0–5.🤖 Generated with Claude Code
https://claude.ai/code/session_01TLE2rvptWxV8catE8vTvgx
Generated by Claude Code