Repository navigation
Comparison: add SpeexDSP (both arithmetic builds), re-pin r8brain at 7.6 - #75
Merged
Merged
Conversation
PR 1b of the comparison plan. SpeexDSP's resampler is the one competitor with a fixed-point build, so it is the first that the Q15 rows can be measured against on their own terms. It is fetched at the SpeexDSP-1.2.1 commit and compiled from resample.c twice (cmake/speexdsp.cmake, FIXED_POINT and FLOATING_POINT under separate RANDOM_PREFIXes), for the host bench, the embedded counts (four new comparison binaries, quality 10 and quality 4 per build, in compare.yml) and the notebook (a two-function shim, both builds). The notebook adds the two SpeexDSP quality rows and a SampleRateTap Q15 row through the new Q15 C ABI, and a sweep over the quality knob: no setting is flat to 20 kHz (-0.42 dB from quality 4 up), so quality 4 is the row that matches balanced's latency class (32 frames) beside quality 10's ceiling. update_compare_docs.py derives the SpeexDSP rows when the record carries them, the fixed-point ones ratioed against balanced Q15. r8brain moves from 7.5 to the upstream tip (7.6): faster filter calculation, construction only. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3HxzEGiZp7jStoMuYNuBK
The record from the first compare.yml run with the four SpeexDSP binaries, on this branch's head, and the block it derives. Every pre-existing steady-state cell is unchanged; r8brain 7.6 moves its M33 construction by 0.1 M. The SpeexDSP rows reproduce the local M33/M55/Hexagon derivation cell for cell. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3HxzEGiZp7jStoMuYNuBK
tap
pushed a commit
that referenced
this pull request
Oct 10, 2026
The comparison plan (#73, #75, #76, #77) and its follow-up (#78) closed; this is the plan for what the family's plans and ledgers still carry open, sequenced into twelve weeks in three blocks, with "production-ready" defined as a thirteen-row checklist per engine so the verdict can be checked rather than believed. Drafted and then audited by two independent adversarial reviews (one against the trees' facts and settled decisions, one against engineering judgement). The audit changed the draft materially: the book's bridge chapters are done (#68), so they are off the list; rational has no cross-engine validation by design (scipy and decimate.h are its legs); TSan runs async only; four host compilers and three QEMU targets, not the draft's counts; the +1.9 % M55 ratio23_q15_eco drift is ab8fea3's stated move, not a DspTap bump, and the chain rows sit +926/+1,102; the hardware block never ran bridge or rational on silicon; nothing builds with -fno-exceptions; TSan has never seen the converter with two threads; no footprint, stack or worst-single-call figure exists; Setup 1's "< 1 ppm" criterion tests the counting, not the servo, and cheap USB dongles may not own a crystal; the timestamp servo is a four-to-five-week extension, not an overload, and must not be frozen in the release that adds it; "C ABIs frozen" needs a reconciled NULL model, an extension rule, SOVERSION and a compat test. Section 7 holds the six decisions the maintainer takes before week 1, each with a recommendation. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3HxzEGiZp7jStoMuYNuBK
tap
pushed a commit
that referenced
this pull request
Oct 10, 2026
The comparison plan (#73, #75, #76, #77) and its follow-up (#78) closed; this is the plan for what the family's plans and ledgers still carry open, sequenced into twelve weeks in three blocks, with "production-ready" defined as a thirteen-row checklist per engine so the verdict can be checked rather than believed. Drafted and then audited by two independent adversarial reviews (one against the trees' facts and settled decisions, one against engineering judgement). The audit changed the draft materially: the book's bridge chapters are done (#68), so they are off the list; rational has no cross-engine validation by design (scipy and decimate.h are its legs); TSan runs async only; four host compilers and three QEMU targets, not the draft's counts; the +1.9 % M55 ratio23_q15_eco drift is ab8fea3's stated move, not a DspTap bump, and the chain rows sit +926/+1,102; the hardware block never ran bridge or rational on silicon; nothing builds with -fno-exceptions; TSan has never seen the converter with two threads; no footprint, stack or worst-single-call figure exists; Setup 1's "< 1 ppm" criterion tests the counting, not the servo, and cheap USB dongles may not own a crystal; the timestamp servo is a four-to-five-week extension, not an overload, and must not be frozen in the release that adds it; "C ABIs frozen" needs a reconciled NULL model, an extension rule, SOVERSION and a compat test. Section 7 holds the six decisions the maintainer takes before week 1, each with a recommendation. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3HxzEGiZp7jStoMuYNuBK
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.
What this changes
PR 1b of the comparison plan (after #73; bridge and rational follow). SpeexDSP's resampler joins the async comparison in both of its arithmetic builds, and r8brain moves from 7.5 to the upstream tip (7.6).
resample.ctwice (cmake/speexdsp.cmake:FIXED_POINTandFLOATING_POINTunder separateRANDOM_PREFIXes) for the host bench, the embedded counts (four new comparison binaries: quality 10 and quality 4 per build, incompare.yml) and the notebook (a two-function shim over both builds,tools/compare_shim/).update_compare_docs.pyderives the SpeexDSP rows when the record carries them, the fixed-point rows ratioed against balanced Q15;COMPARISON.mdgets the quality rows, a Speex latency section, a per-target reading paragraph, the landscape row, and a refreshed host table;README.mdnames the new dependency.bench/compare_counts.json) is re-harvested fromcompare.ymlrun 37970395757 on this branch's first commit, the first run with the Speex binaries; the second commit carries it and the regenerated block.Why
SpeexDSP is the one resampler library with a fixed-point build, so it is the first competitor the Q15 rows can be measured against on their own terms: until now the Q15 datapath's cost tables had no row to be read against, and the quality table had no 16-bit competitor beside it.
Verification
notebooks/asrc_comparison.ipynb, committed executed): every existing row reproduces to the displayed precision. SpeexDSP float at quality 10 measures −133.7 dB THD+N / 149.1 dB DR, wherebalancedsits, not at the format ceiling the other three libraries reach; its fixed-point build −80.2 dB / 97.4 dB beside SampleRateTap Q15 at −76.6 dB / 97.3 dB (the README's "77 dB, format-limited"). The sweep's assertions pin the knee: no quality is flat to 20 kHz (−0.42 dB from quality 4 up), so quality 4 (32 frames) is the matched row beside quality 10 (128 frames).update_compare_docs.pyidempotent on the committed record, the workflow YAML parses, the book builds, native runs of all four Speex comparison binaries report ok.compare.ymlharvest with the Speex binaries ran end to end on this branch (green, record above); the Comparison build smoke job is the first CI build of the Speex shim on the hosted compilers.Notes for the reviewer
PRIVATEby necessity, because a translation unit that reads the header for both builds has to define them itself;speexdsp.cmakesays so.speex_resampler_*names are macros overRANDOM_PREFIX, expanded at the use site, so the shim and the bench call the prefixed symbols directly and undefine the include guard between the two reads of the header. It looks odd; the comment at each site explains why.balancedfloat, fixed rows vs. Q15) and the prose carries the reading.15:13.2.rel1-2is arm-none-eabi-gcc 13.2.1); the prose above the block says the same thing in the human form.🤖 Generated with Claude Code
https://claude.ai/code/session_01G3HxzEGiZp7jStoMuYNuBK