Skip to content

Three shipped filter configurations never return to silence — Phaser defaults hold −4 LSB of DC forever #23

Description

@bdbarnett

Evidence from the 2026-09-02 fault-planting pass run by the accuracy session on Brad's "break it" challenge (workflow journal wf_88202b87-a89, each agent in its own worktree, audioif verified byte-identical to HEAD afterwards). Filed by Arthur because that session is write-frozen; the measurements are its, quoted, not mine.

Three shipped configurations across two node types never return to silence. Source driven with a 0.09 s tone then digital silence; residual after 100 s of silence:

configuration residual
audioeffects.Phaser(src), shipped defaults −4 LSB, exactly constant, never decays
audiofilters.Phaser(frequency=200, stages=2, 48 kHz) −179 LSB, about −45 dBFS of DC
audiofilters.Phaser(frequency=1000, stages=2, 48 kHz) −36 LSB
audioeffects.LowPass(src, frequency=100.0), default q +1 LSB DC, forever
audioeffects.LowPass(src, frequency=40.0, q=8.0) −4 LSB DC, forever

Cause

The biquad is fixed-point (audioif_biquad.h: int32 coefficients with a per-filter shift, int32 state with 12 fractional bits). At low W0 it settles on a stuck DC value rather than zero.

Why the parity probe sits exactly where the fault is not

audiofilters.Phaser(frequency=1234, sample_rate=8000) — the probe's exact configuration — measures residual 0. It differs from the product on all four axes that decide this: 8 kHz vs 48 kHz, a static 1234 Hz vs an LFO sweeping 470–1730 Hz, 0.256 s vs minutes, and a never-silent random source vs real silence between notes. The probe occupies the one cell of the grid where the property holds.

Why nothing in the suite catches it

Five places assert nodes are not silent (assertGreater(peak, 0.001, "%s renders silence")test_cpython_effects_library.py:245, test_cpython_instruments.py:75, :85, test_cpython_render.py:175, :685). Exact-zero output is asserted in only two places, test_cpython_dsp_nodes.py:83 (Dynamics) and :163 (Splitter), two blocks each, both stateless passthrough. No recursive node is ever asked to go quiet.

A −4 LSB DC offset held forever on a shipped default is a product defect, not a test nit: it is a DC component in every rest.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions