FAILURE MAP
← Case archive

FA-91716 / Digital signal filters / Open access

Bilinear lowpass numerator divided by K only · case 01

The DC gain is (K + wc)/K instead of 1.

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

ROOT CAUSE

The numerator coefficients use wc / K while the denominator uses K + wc.

THE FAILURE

The numerator coefficients use wc / K while the denominator uses K + wc.

Unsuccessful approach: The attempted repair normalizes b0 correctly but leaves b1 divided by K.

Case contract

Input [kind, wc, fs] with rational analog cutoff wc (rad/s) and sample rate fs. Map H(s) = wc/(s+wc) (lowpass) or s/(s+wc) (highpass) with s = K (1 - z^-1)/(1 + z^-1), K = 2 fs, no prewarping. Return {"b": [b0, b1], "a": [1, a1]} as fraction strings normalized so a0 = 1, or "bad-spec".

Why this case matters

The bilinear transform is the standard analog-to-digital mapping; K or sign slips move the cutoff or flip the filter type.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(x):
    kind, wc, fs = x[0], Fraction(x[1]), Fraction(x[2])
    if wc <= 0 or fs <= 0:
        return 'bad-spec'
    K = 2 * fs
    d = K + wc
    if kind == 'lowpass':
        b = [wc / K, wc / K]
    else:
        b = [K / d, -K / d]
    a = [Fraction(1), (wc - K) / d]
    return {'b': [str(v) for v in b], 'a': [str(v) for v in a]}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: lowpass wc=100 fs=1000', ['lowpass', '100', '1000'], {'b': ['1/21', '1/21'], 'a': ['1', '-19/21']}], ['regression: lowpass wc=1 fs=1', ['lowpass', '1', '1'], {'b': ['1/3', '1/3'], 'a': ['1', '-1/3']}], ['regression: lowpass wc=3 fs=1/2', ['lowpass', '3', '1/2'], {'b': ['3/4', '3/4'], 'a': ['1', '1/2']}], ['control: highpass wc=100 fs=1000', ['highpass', '100', '1000'], {'b': ['20/21', '-20/21'], 'a': ['1', '-19/21']}], ['control: highpass wc=1 fs=1', ['highpass', '1', '1'], {'b': ['2/3', '-2/3'], 'a': ['1', '-1/3']}], ['control: highpass wc=3 fs=1/2', ['highpass', '3', '1/2'], {'b': ['1/4', '-1/4'], 'a': ['1', '1/2']}], ['control: highpass wc=2000 fs=48000', ['highpass', '2000', '48000'], {'b': ['48/49', '-48/49'], 'a': ['1', '-47/49']}]], [['regression: lowpass wc=2000 fs=48000', ['lowpass', '2000', '48000'], {'b': ['1/49', '1/49'], 'a': ['1', '-47/49']}], ['regression: lowpass wc=1/2 fs=2', ['lowpass', '1/2', '2'], {'b': ['1/9', '1/9'], 'a': ['1', '-7/9']}], ['regression: lowpass wc=3 fs=1/2', ['lowpass', '3', '1/2'], {'b': ['3/4', '3/4'], 'a': ['1', '1/2']}], ['control: highpass wc=1/2 fs=2', ['highpass', '1/2', '2'], {'b': ['8/9', '-8/9'], 'a': ['1', '-7/9']}], ['control: bad spec', ['lowpass', '0', '1'], 'bad-spec'], ['control: highpass wc=100 fs=1000', ['highpass', '100', '1000'], {'b': ['20/21', '-20/21'], 'a': ['1', '-19/21']}], ['control: highpass wc=1 fs=1', ['highpass', '1', '1'], {'b': ['2/3', '-2/3'], 'a': ['1', '-1/3']}]], [['regression: lowpass wc=1 fs=1', ['lowpass', '1', '1'], {'b': ['1/3', '1/3'], 'a': ['1', '-1/3']}], ['regression: lowpass wc=3 fs=1/2', ['lowpass', '3', '1/2'], {'b': ['3/4', '3/4'], 'a': ['1', '1/2']}], ['regression: lowpass wc=1/2 fs=2', ['lowpass', '1/2', '2'], {'b': ['1/9', '1/9'], 'a': ['1', '-7/9']}], ['control: highpass wc=3 fs=1/2', ['highpass', '3', '1/2'], {'b': ['1/4', '-1/4'], 'a': ['1', '1/2']}], ['control: highpass wc=2000 fs=48000', ['highpass', '2000', '48000'], {'b': ['48/49', '-48/49'], 'a': ['1', '-47/49']}], ['control: highpass wc=1/2 fs=2', ['highpass', '1/2', '2'], {'b': ['8/9', '-8/9'], 'a': ['1', '-7/9']}], ['control: bad spec', ['lowpass', '0', '1'], 'bad-spec']], [['regression: lowpass wc=1/2 fs=2', ['lowpass', '1/2', '2'], {'b': ['1/9', '1/9'], 'a': ['1', '-7/9']}], ['regression: lowpass wc=100 fs=1000', ['lowpass', '100', '1000'], {'b': ['1/21', '1/21'], 'a': ['1', '-19/21']}], ['regression: lowpass wc=1 fs=1', ['lowpass', '1', '1'], {'b': ['1/3', '1/3'], 'a': ['1', '-1/3']}], ['control: highpass wc=100 fs=1000', ['highpass', '100', '1000'], {'b': ['20/21', '-20/21'], 'a': ['1', '-19/21']}], ['control: highpass wc=1 fs=1', ['highpass', '1', '1'], {'b': ['2/3', '-2/3'], 'a': ['1', '-1/3']}], ['control: highpass wc=3 fs=1/2', ['highpass', '3', '1/2'], {'b': ['1/4', '-1/4'], 'a': ['1', '1/2']}], ['control: highpass wc=2000 fs=48000', ['highpass', '2000', '48000'], {'b': ['48/49', '-48/49'], 'a': ['1', '-47/49']}]], [['regression: lowpass wc=3 fs=1/2', ['lowpass', '3', '1/2'], {'b': ['3/4', '3/4'], 'a': ['1', '1/2']}], ['regression: lowpass wc=2000 fs=48000', ['lowpass', '2000', '48000'], {'b': ['1/49', '1/49'], 'a': ['1', '-47/49']}], ['regression: lowpass wc=1/2 fs=2', ['lowpass', '1/2', '2'], {'b': ['1/9', '1/9'], 'a': ['1', '-7/9']}], ['control: highpass wc=1/2 fs=2', ['highpass', '1/2', '2'], {'b': ['8/9', '-8/9'], 'a': ['1', '-7/9']}], ['control: bad spec', ['lowpass', '0', '1'], 'bad-spec'], ['control: highpass wc=100 fs=1000', ['highpass', '100', '1000'], {'b': ['20/21', '-20/21'], 'a': ['1', '-19/21']}], ['control: highpass wc=1 fs=1', ['highpass', '1', '1'], {'b': ['2/3', '-2/3'], 'a': ['1', '-1/3']}]]]
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: lowpass wc=100 fs=1000{'a': ['1', '-19/21'], 'b': ['1/20', '1/20']}{'a': ['1', '-19/21'], 'b': ['1/21', '1/21']}Failed
regression: lowpass wc=1 fs=1{'a': ['1', '-1/3'], 'b': ['1/2', '1/2']}{'a': ['1', '-1/3'], 'b': ['1/3', '1/3']}Failed
regression: lowpass wc=3 fs=1/2{'a': ['1', '1/2'], 'b': ['3', '3']}{'a': ['1', '1/2'], 'b': ['3/4', '3/4']}Failed
control: highpass wc=100 fs=1000{'a': ['1', '-19/21'], 'b': ['20/21', '-20/21']}{'a': ['1', '-19/21'], 'b': ['20/21', '-20/21']}Passed
control: highpass wc=1 fs=1{'a': ['1', '-1/3'], 'b': ['2/3', '-2/3']}{'a': ['1', '-1/3'], 'b': ['2/3', '-2/3']}Passed
control: highpass wc=3 fs=1/2{'a': ['1', '1/2'], 'b': ['1/4', '-1/4']}{'a': ['1', '1/2'], 'b': ['1/4', '-1/4']}Passed
control: highpass wc=2000 fs=48000{'a': ['1', '-47/49'], 'b': ['48/49', '-48/49']}{'a': ['1', '-47/49'], 'b': ['48/49', '-48/49']}Passed

SHA-256 / e5f54db00b0cd901b42853217cb8de7fc18fe9fd903200e3fbc1cb5bc70ef77b

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(x):
    kind, wc, fs = x[0], Fraction(x[1]), Fraction(x[2])
    if wc <= 0 or fs <= 0:
        return 'bad-spec'
    K = 2 * fs
    d = K + wc
    if kind == 'lowpass':
        b = [wc / d, wc / K]
    else:
        b = [K / d, -K / d]
    a = [Fraction(1), (wc - K) / d]
    return {'b': [str(v) for v in b], 'a': [str(v) for v in a]}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: lowpass wc=100 fs=1000', ['lowpass', '100', '1000'], {'b': ['1/21', '1/21'], 'a': ['1', '-19/21']}], ['regression: lowpass wc=1 fs=1', ['lowpass', '1', '1'], {'b': ['1/3', '1/3'], 'a': ['1', '-1/3']}], ['regression: lowpass wc=3 fs=1/2', ['lowpass', '3', '1/2'], {'b': ['3/4', '3/4'], 'a': ['1', '1/2']}], ['control: highpass wc=100 fs=1000', ['highpass', '100', '1000'], {'b': ['20/21', '-20/21'], 'a': ['1', '-19/21']}], ['control: highpass wc=1 fs=1', ['highpass', '1', '1'], {'b': ['2/3', '-2/3'], 'a': ['1', '-1/3']}], ['control: highpass wc=3 fs=1/2', ['highpass', '3', '1/2'], {'b': ['1/4', '-1/4'], 'a': ['1', '1/2']}], ['control: highpass wc=2000 fs=48000', ['highpass', '2000', '48000'], {'b': ['48/49', '-48/49'], 'a': ['1', '-47/49']}]], [['regression: lowpass wc=2000 fs=48000', ['lowpass', '2000', '48000'], {'b': ['1/49', '1/49'], 'a': ['1', '-47/49']}], ['regression: lowpass wc=1/2 fs=2', ['lowpass', '1/2', '2'], {'b': ['1/9', '1/9'], 'a': ['1', '-7/9']}], ['regression: lowpass wc=3 fs=1/2', ['lowpass', '3', '1/2'], {'b': ['3/4', '3/4'], 'a': ['1', '1/2']}], ['control: highpass wc=1/2 fs=2', ['highpass', '1/2', '2'], {'b': ['8/9', '-8/9'], 'a': ['1', '-7/9']}], ['control: bad spec', ['lowpass', '0', '1'], 'bad-spec'], ['control: highpass wc=100 fs=1000', ['highpass', '100', '1000'], {'b': ['20/21', '-20/21'], 'a': ['1', '-19/21']}], ['control: highpass wc=1 fs=1', ['highpass', '1', '1'], {'b': ['2/3', '-2/3'], 'a': ['1', '-1/3']}]], [['regression: lowpass wc=1 fs=1', ['lowpass', '1', '1'], {'b': ['1/3', '1/3'], 'a': ['1', '-1/3']}], ['regression: lowpass wc=3 fs=1/2', ['lowpass', '3', '1/2'], {'b': ['3/4', '3/4'], 'a': ['1', '1/2']}], ['regression: lowpass wc=1/2 fs=2', ['lowpass', '1/2', '2'], {'b': ['1/9', '1/9'], 'a': ['1', '-7/9']}], ['control: highpass wc=3 fs=1/2', ['highpass', '3', '1/2'], {'b': ['1/4', '-1/4'], 'a': ['1', '1/2']}], ['control: highpass wc=2000 fs=48000', ['highpass', '2000', '48000'], {'b': ['48/49', '-48/49'], 'a': ['1', '-47/49']}], ['control: highpass wc=1/2 fs=2', ['highpass', '1/2', '2'], {'b': ['8/9', '-8/9'], 'a': ['1', '-7/9']}], ['control: bad spec', ['lowpass', '0', '1'], 'bad-spec']], [['regression: lowpass wc=1/2 fs=2', ['lowpass', '1/2', '2'], {'b': ['1/9', '1/9'], 'a': ['1', '-7/9']}], ['regression: lowpass wc=100 fs=1000', ['lowpass', '100', '1000'], {'b': ['1/21', '1/21'], 'a': ['1', '-19/21']}], ['regression: lowpass wc=1 fs=1', ['lowpass', '1', '1'], {'b': ['1/3', '1/3'], 'a': ['1', '-1/3']}], ['control: highpass wc=100 fs=1000', ['highpass', '100', '1000'], {'b': ['20/21', '-20/21'], 'a': ['1', '-19/21']}], ['control: highpass wc=1 fs=1', ['highpass', '1', '1'], {'b': ['2/3', '-2/3'], 'a': ['1', '-1/3']}], ['control: highpass wc=3 fs=1/2', ['highpass', '3', '1/2'], {'b': ['1/4', '-1/4'], 'a': ['1', '1/2']}], ['control: highpass wc=2000 fs=48000', ['highpass', '2000', '48000'], {'b': ['48/49', '-48/49'], 'a': ['1', '-47/49']}]], [['regression: lowpass wc=3 fs=1/2', ['lowpass', '3', '1/2'], {'b': ['3/4', '3/4'], 'a': ['1', '1/2']}], ['regression: lowpass wc=2000 fs=48000', ['lowpass', '2000', '48000'], {'b': ['1/49', '1/49'], 'a': ['1', '-47/49']}], ['regression: lowpass wc=1/2 fs=2', ['lowpass', '1/2', '2'], {'b': ['1/9', '1/9'], 'a': ['1', '-7/9']}], ['control: highpass wc=1/2 fs=2', ['highpass', '1/2', '2'], {'b': ['8/9', '-8/9'], 'a': ['1', '-7/9']}], ['control: bad spec', ['lowpass', '0', '1'], 'bad-spec'], ['control: highpass wc=100 fs=1000', ['highpass', '100', '1000'], {'b': ['20/21', '-20/21'], 'a': ['1', '-19/21']}], ['control: highpass wc=1 fs=1', ['highpass', '1', '1'], {'b': ['2/3', '-2/3'], 'a': ['1', '-1/3']}]]]
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: lowpass wc=100 fs=1000{'a': ['1', '-19/21'], 'b': ['1/21', '1/20']}{'a': ['1', '-19/21'], 'b': ['1/21', '1/21']}Failed
regression: lowpass wc=1 fs=1{'a': ['1', '-1/3'], 'b': ['1/3', '1/2']}{'a': ['1', '-1/3'], 'b': ['1/3', '1/3']}Failed
regression: lowpass wc=3 fs=1/2{'a': ['1', '1/2'], 'b': ['3/4', '3']}{'a': ['1', '1/2'], 'b': ['3/4', '3/4']}Failed
control: highpass wc=100 fs=1000{'a': ['1', '-19/21'], 'b': ['20/21', '-20/21']}{'a': ['1', '-19/21'], 'b': ['20/21', '-20/21']}Passed
control: highpass wc=1 fs=1{'a': ['1', '-1/3'], 'b': ['2/3', '-2/3']}{'a': ['1', '-1/3'], 'b': ['2/3', '-2/3']}Passed
control: highpass wc=3 fs=1/2{'a': ['1', '1/2'], 'b': ['1/4', '-1/4']}{'a': ['1', '1/2'], 'b': ['1/4', '-1/4']}Passed
control: highpass wc=2000 fs=48000{'a': ['1', '-47/49'], 'b': ['48/49', '-48/49']}{'a': ['1', '-47/49'], 'b': ['48/49', '-48/49']}Passed

SHA-256 / c8bf47cdeb21459954e4a03033fbfa0f66a3ad0d17b94b91f68840992488744f

HELD IN THE MEMBER ARCHIVE

The verified repair and its recorded checks are member-only.

This mechanism has 7 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.

Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.

Member access is invitation-based. Sign in with your invited account to inspect the repair.

Sign in to the archive ↗

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

Case digest / 991e320626711d66af3887345c02536e3b090642d07cf96fe5130ea98d656a27