FAILURE MAP
← Case archive

FA-91816 / Digital signal filters / Open access

Notch design places the zeros at pi - w0 · case 01

The notch appears at fs/2 - f0.

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

ROOT CAUSE

b1 is +2 cos w0 instead of -2 cos w0.

VERIFIED REPAIR

Use b = [1, -2 cos w0, 1].

Unsuccessful approach: The attempted repair flips the pole cosine sign as well, moving the poles to the mirrored frequency too.

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 * 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=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}], ['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]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['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]}], ['regression: 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=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['regression: 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=60 fs=480 r=9/10', ['60', '480', '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'], ['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=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=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=60 fs=480 r=99/100', ['60', '480', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['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'], ['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]}], ['regression: 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=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=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: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: 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=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=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], '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=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: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['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]}]]]
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=0{'a': [1.0, 0.0, 0.0], 'b': [0.256271408, 0.487457185, 0.256271408]}{'a': [1.0, 0.0, 0.0], 'b': [10.215864547, -19.431729095, 10.215864547]}Failed
regression: f0=50 fs=1000 r=9/10{'a': [1.0, -1.711901729, 0.81], 'b': [0.025139782, 0.047818707, 0.025139782]}{'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.25], 'b': [0.076610667, 0.145722149, 0.076610667]}{'a': [1.0, -0.951056516, 0.25], 'b': [3.053966137, -5.80898879, 3.053966137]}Failed
control: at nyquistbad-frequencybad-frequencyPassed
control: bad radiusbad-radiusbad-radiusPassed
regression: f0=50 fs=1000 r=99/100{'a': [1.0, -1.883091902, 0.9801], 'b': [0.024860402, 0.047287294, 0.024860402]}{'a': [1.0, -1.883091902, 0.9801], 'b': [0.991021586, -1.885035075, 0.991021586]}Failed
regression: f0=60 fs=480 r=0{'a': [1.0, 0.0, 0.0], 'b': [0.292893219, 0.414213562, 0.292893219]}{'a': [1.0, 0.0, 0.0], 'b': [1.707106781, -2.414213562, 1.707106781]}Failed

SHA-256 / 18d90c5040b1decbe11ac9b50034cd663ba0a9ade92073b75581997795b9b006

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(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=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}], ['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]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['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]}], ['regression: 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=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['regression: 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=60 fs=480 r=9/10', ['60', '480', '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'], ['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=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=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=60 fs=480 r=99/100', ['60', '480', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['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'], ['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]}], ['regression: 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=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=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: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: 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=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=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], '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=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: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['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]}]]]
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=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
regression: f0=50 fs=1000 r=9/10{'a': [1.0, 1.711901729, 0.81], 'b': [35.979271016, -68.436640302, 35.979271016]}{'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.25], 'b': [22.485695231, -42.770333946, 22.485695231]}{'a': [1.0, -0.951056516, 0.25], 'b': [3.053966137, -5.80898879, 3.053966137]}Failed
control: at nyquistbad-frequencybad-frequencyPassed
control: bad radiusbad-radiusbad-radiusPassed
regression: f0=50 fs=1000 r=99/100{'a': [1.0, 1.883091902, 0.9801], 'b': [39.465845194, -75.068498485, 39.465845194]}{'a': [1.0, -1.883091902, 0.9801], 'b': [0.991021586, -1.885035075, 0.991021586]}Failed
regression: 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

SHA-256 / 0654499847a6993964a813cef2e1fba1ee47ebfc9be5a2f1f25cf9002ad8f766

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=0', ['50', '1000', '0'], {'b': [10.215864547, -19.431729095, 10.215864547], 'a': [1.0, 0.0, 0.0]}], ['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]}], ['control: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['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]}], ['regression: 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=50 fs=1000 r=99/100', ['50', '1000', '99/100'], {'b': [0.991021586, -1.885035075, 0.991021586], 'a': [1.0, -1.883091902, 0.9801]}], ['regression: 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=60 fs=480 r=9/10', ['60', '480', '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'], ['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=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=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=60 fs=480 r=99/100', ['60', '480', '99/100'], {'b': [0.990170711, -1.400312848, 0.990170711], 'a': [1.0, -1.400071427, 0.9801]}], ['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'], ['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]}], ['regression: 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=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=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: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['regression: 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=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=3 fs=8 r=0', ['3', '8', '0'], {'b': [0.292893219, 0.414213562, 0.292893219], '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=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: at nyquist', ['4', '8', '1/2'], 'bad-frequency'], ['control: bad radius', ['1', '8', '1'], 'bad-radius'], ['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]}]]]
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=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
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
control: at nyquistbad-frequencybad-frequencyPassed
control: bad radiusbad-radiusbad-radiusPassed
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
regression: 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

SHA-256 / 1dd55a4a3e5cfaeb43f78e3732ffe0f4189f453f474189377cff7321dab41322

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.541240+00:00.

Case digest / a09df22a6fa062c5995d48271651b837fcb9de12580b95e753dc7f71b1d6feb8