FAILURE MAP
← Case archive

FA-91811 / Digital signal filters / Open access

Notch design uses r instead of r^2 for a2 · case 01

The poles do not sit at radius r; the notch is far wider than specified.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The second denominator coefficient is r rather than r^2.

VERIFIED REPAIR

Use a2 = r^2 for a conjugate pole pair at radius r.

Unsuccessful approach: The attempted repair uses 2 r.

Case contract

Input [f0, fs, r]: second-order notch with zeros on the unit circle at +-w0 (w0 = 2 pi f0 / fs) and poles at radius r: b = [1, -2 cos w0, 1], a = [1, -2 r cos w0, r^2]; b is scaled for unity DC gain (sum(a)/sum(b)). Coefficients rounded to 9 decimals; "bad-frequency" unless 0 < f0 < fs/2, "bad-radius" unless 0 <= r < 1.

Why this case matters

Notch filters remove mains hum and interference tones; angle or radius slips miss the tone or widen the notch.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(x):
    f0, fs, r = Fraction(x[0]), Fraction(x[1]), Fraction(x[2])
    if not 0 < f0 < fs / 2:
        return 'bad-frequency'
    if not 0 <= r < 1:
        return 'bad-radius'
    w0 = 2 * math.pi * float(f0 / fs)
    c = math.cos(w0)
    b = [1.0, -2 * c, 1.0]
    a = [1.0, -2 * float(r) * c, float(r)]
    g = sum(a) / sum(b)
    return {'b': [round(g * v, 9) + 0.0 for v in b], 'a': [round(v, 9) + 0.0 for v in a]}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: f0=50 fs=1000 r=9/10', ['50', '1000', '9/10'], {'b': [1.002158645, -1.90621902, 1.002158645], 'a': [1.0, -1.711901729, 0.81]}], ['regression: f0=50 fs=1000 r=1/2', ['50', '1000', '1/2'], {'b': [3.053966137, -5.80898879, 3.053966137], 'a': [1.0, -0.951056516, 0.25]}], ['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['control: f0=50 fs=1000 r=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}], ['control: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=1 fs=8 r=0', ['1', '8', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['control: f0=100 fs=44100 r=0', ['100', '44100', '0'], {'b': [4926.344613165, -9851.689226331, 4926.344613165], 'a': [1.0, 0.0, 0.0]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['control: f0=50 fs=1000 r=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=1 fs=8 r=9/10', ['1', '8', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=1 fs=8 r=1/2', ['1', '8', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['control: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=1 fs=8 r=0', ['1', '8', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], 'a': [1.0, 0.0, 0.0]}], ['control: f0=100 fs=44100 r=0', ['100', '44100', '0'], {'b': [4926.344613165, -9851.689226331, 4926.344613165], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=3 fs=8 r=9/10', ['3', '8', '9/10'], {'b': [0.902928932, 1.276934342, 0.902928932], 'a': [1.0, 1.272792206, 0.81]}], ['regression: f0=3 fs=8 r=1/2', ['3', '8', '1/2'], {'b': [0.573223305, 0.810660172, 0.573223305], 'a': [1.0, 0.707106781, 0.25]}], ['regression: f0=1 fs=8 r=9/10', ['1', '8', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['control: f0=50 fs=1000 r=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}], ['control: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=100 fs=44100 r=9/10', ['100', '44100', '9/10'], {'b': [50.163446132, -100.316709572, 50.163446132], 'a': [1.0, -1.799817309, 0.81]}], ['regression: f0=100 fs=44100 r=1/2', ['100', '44100', '1/2'], {'b': [1232.086153291, -2463.922205088, 1232.086153291], 'a': [1.0, -0.999898505, 0.25]}], ['regression: f0=1 fs=8 r=99/100', ['1', '8', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['control: f0=1 fs=8 r=0', ['1', '8', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], 'a': [1.0, 0.0, 0.0]}], ['control: f0=100 fs=44100 r=0', ['100', '44100', '0'], {'b': [4926.344613165, -9851.689226331, 4926.344613165], 'a': [1.0, 0.0, 0.0]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency']]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: f0=50 fs=1000 r=9/10{'a': [1.0, -1.711901729, 0.9], 'b': [1.921586455, -3.655074639, 1.921586455]}{'a': [1.0, -1.711901729, 0.81], 'b': [1.002158645, -1.90621902, 1.002158645]}Failed
regression: f0=50 fs=1000 r=1/2{'a': [1.0, -0.951056516, 0.5], 'b': [5.607932274, -10.666921064, 5.607932274]}{'a': [1.0, -0.951056516, 0.25], 'b': [3.053966137, -5.80898879, 3.053966137]}Failed
regression: f0=50 fs=1000 r=99/100{'a': [1.0, -1.883091902, 0.99], 'b': [1.092158645, -2.077409193, 1.092158645]}{'a': [1.0, -1.883091902, 0.9801], 'b': [0.991021586, -1.885035075, 0.991021586]}Failed
control: f0=50 fs=1000 r=0{'a': [1.0, 0.0, 0.0], 'b': [10.215864547, -19.431729095, 10.215864547]}{'a': [1.0, 0.0, 0.0], 'b': [10.215864547, -19.431729095, 10.215864547]}Passed
control: f0=60 fs=480 r=0{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}Passed
control: f0=1 fs=8 r=0{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}Passed
control: f0=3 fs=8 r=0{'a': [1.0, 0.0, 0.0], 'b': [0.292893219, 0.414213562, 0.292893219]}{'a': [1.0, 0.0, 0.0], 'b': [0.292893219, 0.414213562, 0.292893219]}Passed

SHA-256 / b64bf0ce0d0a77e0f3a0c231785634b44d8b908d5769f5e65fb3f751a1c9ba79

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(x):
    f0, fs, r = Fraction(x[0]), Fraction(x[1]), Fraction(x[2])
    if not 0 < f0 < fs / 2:
        return 'bad-frequency'
    if not 0 <= r < 1:
        return 'bad-radius'
    w0 = 2 * math.pi * float(f0 / fs)
    c = math.cos(w0)
    b = [1.0, -2 * c, 1.0]
    a = [1.0, -2 * float(r) * c, float(2 * r)]
    g = sum(a) / sum(b)
    return {'b': [round(g * v, 9) + 0.0 for v in b], 'a': [round(v, 9) + 0.0 for v in a]}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: f0=50 fs=1000 r=9/10', ['50', '1000', '9/10'], {'b': [1.002158645, -1.90621902, 1.002158645], 'a': [1.0, -1.711901729, 0.81]}], ['regression: f0=50 fs=1000 r=1/2', ['50', '1000', '1/2'], {'b': [3.053966137, -5.80898879, 3.053966137], 'a': [1.0, -0.951056516, 0.25]}], ['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['control: f0=50 fs=1000 r=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}], ['control: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=1 fs=8 r=0', ['1', '8', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['control: f0=100 fs=44100 r=0', ['100', '44100', '0'], {'b': [4926.344613165, -9851.689226331, 4926.344613165], 'a': [1.0, 0.0, 0.0]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['control: f0=50 fs=1000 r=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=1 fs=8 r=9/10', ['1', '8', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=1 fs=8 r=1/2', ['1', '8', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['control: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=1 fs=8 r=0', ['1', '8', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], 'a': [1.0, 0.0, 0.0]}], ['control: f0=100 fs=44100 r=0', ['100', '44100', '0'], {'b': [4926.344613165, -9851.689226331, 4926.344613165], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=3 fs=8 r=9/10', ['3', '8', '9/10'], {'b': [0.902928932, 1.276934342, 0.902928932], 'a': [1.0, 1.272792206, 0.81]}], ['regression: f0=3 fs=8 r=1/2', ['3', '8', '1/2'], {'b': [0.573223305, 0.810660172, 0.573223305], 'a': [1.0, 0.707106781, 0.25]}], ['regression: f0=1 fs=8 r=9/10', ['1', '8', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['control: f0=50 fs=1000 r=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}], ['control: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=100 fs=44100 r=9/10', ['100', '44100', '9/10'], {'b': [50.163446132, -100.316709572, 50.163446132], 'a': [1.0, -1.799817309, 0.81]}], ['regression: f0=100 fs=44100 r=1/2', ['100', '44100', '1/2'], {'b': [1232.086153291, -2463.922205088, 1232.086153291], 'a': [1.0, -0.999898505, 0.25]}], ['regression: f0=1 fs=8 r=99/100', ['1', '8', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['control: f0=1 fs=8 r=0', ['1', '8', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], 'a': [1.0, 0.0, 0.0]}], ['control: f0=100 fs=44100 r=0', ['100', '44100', '0'], {'b': [4926.344613165, -9851.689226331, 4926.344613165], 'a': [1.0, 0.0, 0.0]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency']]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: f0=50 fs=1000 r=9/10{'a': [1.0, -1.711901729, 1.8], 'b': [11.115864547, -21.143630824, 11.115864547]}{'a': [1.0, -1.711901729, 0.81], 'b': [1.002158645, -1.90621902, 1.002158645]}Failed
regression: f0=50 fs=1000 r=1/2{'a': [1.0, -0.951056516, 1.0], 'b': [10.715864547, -20.382785611, 10.715864547]}{'a': [1.0, -0.951056516, 0.25], 'b': [3.053966137, -5.80898879, 3.053966137]}Failed
regression: f0=50 fs=1000 r=99/100{'a': [1.0, -1.883091902, 1.98], 'b': [11.205864547, -21.314820997, 11.205864547]}{'a': [1.0, -1.883091902, 0.9801], 'b': [0.991021586, -1.885035075, 0.991021586]}Failed
control: f0=50 fs=1000 r=0{'a': [1.0, 0.0, 0.0], 'b': [10.215864547, -19.431729095, 10.215864547]}{'a': [1.0, 0.0, 0.0], 'b': [10.215864547, -19.431729095, 10.215864547]}Passed
control: f0=60 fs=480 r=0{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}Passed
control: f0=1 fs=8 r=0{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}Passed
control: f0=3 fs=8 r=0{'a': [1.0, 0.0, 0.0], 'b': [0.292893219, 0.414213562, 0.292893219]}{'a': [1.0, 0.0, 0.0], 'b': [0.292893219, 0.414213562, 0.292893219]}Passed

SHA-256 / 6ea86f7fbdd3f2e031be65256b6de4c59d1faf41541303890ab10a8a1bef5759

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(x):
    f0, fs, r = Fraction(x[0]), Fraction(x[1]), Fraction(x[2])
    if not 0 < f0 < fs / 2:
        return 'bad-frequency'
    if not 0 <= r < 1:
        return 'bad-radius'
    w0 = 2 * math.pi * float(f0 / fs)
    c = math.cos(w0)
    b = [1.0, -2 * c, 1.0]
    a = [1.0, -2 * float(r) * c, float(r * r)]
    g = sum(a) / sum(b)
    return {'b': [round(g * v, 9) + 0.0 for v in b], 'a': [round(v, 9) + 0.0 for v in a]}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: f0=50 fs=1000 r=9/10', ['50', '1000', '9/10'], {'b': [1.002158645, -1.90621902, 1.002158645], 'a': [1.0, -1.711901729, 0.81]}], ['regression: f0=50 fs=1000 r=1/2', ['50', '1000', '1/2'], {'b': [3.053966137, -5.80898879, 3.053966137], 'a': [1.0, -0.951056516, 0.25]}], ['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['control: f0=50 fs=1000 r=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}], ['control: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=1 fs=8 r=0', ['1', '8', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=60 fs=480 r=9/10', ['60', '480', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['regression: f0=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['control: f0=100 fs=44100 r=0', ['100', '44100', '0'], {'b': [4926.344613165, -9851.689226331, 4926.344613165], 'a': [1.0, 0.0, 0.0]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['control: f0=50 fs=1000 r=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=1 fs=8 r=9/10', ['1', '8', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['regression: f0=1 fs=8 r=1/2', ['1', '8', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['regression: f0=60 fs=480 r=1/2', ['60', '480', '1/2'], {'b': [0.926776695, -1.310660172, 0.926776695], 'a': [1.0, -0.707106781, 0.25]}], ['control: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=1 fs=8 r=0', ['1', '8', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], 'a': [1.0, 0.0, 0.0]}], ['control: f0=100 fs=44100 r=0', ['100', '44100', '0'], {'b': [4926.344613165, -9851.689226331, 4926.344613165], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=3 fs=8 r=9/10', ['3', '8', '9/10'], {'b': [0.902928932, 1.276934342, 0.902928932], 'a': [1.0, 1.272792206, 0.81]}], ['regression: f0=3 fs=8 r=1/2', ['3', '8', '1/2'], {'b': [0.573223305, 0.810660172, 0.573223305], 'a': [1.0, 0.707106781, 0.25]}], ['regression: f0=1 fs=8 r=9/10', ['1', '8', '9/10'], {'b': [0.917071068, -1.296934342, 0.917071068], 'a': [1.0, -1.272792206, 0.81]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['control: f0=50 fs=1000 r=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}], ['control: f0=60 fs=480 r=0', ['60', '480', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}]], [['regression: f0=100 fs=44100 r=9/10', ['100', '44100', '9/10'], {'b': [50.163446132, -100.316709572, 50.163446132], 'a': [1.0, -1.799817309, 0.81]}], ['regression: f0=100 fs=44100 r=1/2', ['100', '44100', '1/2'], {'b': [1232.086153291, -2463.922205088, 1232.086153291], 'a': [1.0, -0.999898505, 0.25]}], ['regression: f0=1 fs=8 r=99/100', ['1', '8', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['control: f0=1 fs=8 r=0', ['1', '8', '0'], {'b': [1.707106781, -2.414213562, 1.707106781], 'a': [1.0, 0.0, 0.0]}], ['control: f0=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], 'a': [1.0, 0.0, 0.0]}], ['control: f0=100 fs=44100 r=0', ['100', '44100', '0'], {'b': [4926.344613165, -9851.689226331, 4926.344613165], 'a': [1.0, 0.0, 0.0]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency']]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: f0=50 fs=1000 r=9/10{'a': [1.0, -1.711901729, 0.81], 'b': [1.002158645, -1.90621902, 1.002158645]}{'a': [1.0, -1.711901729, 0.81], 'b': [1.002158645, -1.90621902, 1.002158645]}Passed
regression: f0=50 fs=1000 r=1/2{'a': [1.0, -0.951056516, 0.25], 'b': [3.053966137, -5.80898879, 3.053966137]}{'a': [1.0, -0.951056516, 0.25], 'b': [3.053966137, -5.80898879, 3.053966137]}Passed
regression: f0=50 fs=1000 r=99/100{'a': [1.0, -1.883091902, 0.9801], 'b': [0.991021586, -1.885035075, 0.991021586]}{'a': [1.0, -1.883091902, 0.9801], 'b': [0.991021586, -1.885035075, 0.991021586]}Passed
control: f0=50 fs=1000 r=0{'a': [1.0, 0.0, 0.0], 'b': [10.215864547, -19.431729095, 10.215864547]}{'a': [1.0, 0.0, 0.0], 'b': [10.215864547, -19.431729095, 10.215864547]}Passed
control: f0=60 fs=480 r=0{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}Passed
control: f0=1 fs=8 r=0{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}Passed
control: f0=3 fs=8 r=0{'a': [1.0, 0.0, 0.0], 'b': [0.292893219, 0.414213562, 0.292893219]}{'a': [1.0, 0.0, 0.0], 'b': [0.292893219, 0.414213562, 0.292893219]}Passed

SHA-256 / 934349c0d744a71b6e7eb864fd9985d0c836fdf0921c8171a81e3934b401e1b4

Verification & scope

A deterministic bounded teaching model with a stipulated toy contract; exact rational arithmetic or fixed-decimal rounding keeps outputs strict JSON. It is not a production DSP library and claims no standards conformance. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:51:39.513262+00:00.

Case digest / f73d36c8a618c89c7057363f41d77d6de4a3f3856f8828172d74de3baa970def