FAILURE MAP
← Case archive

FA-91386 / Digital signal filters / Open access

Transposed DF-II adds a2 feedback in the second state · case 01

Second-order feedback has the wrong sign, e.g. a stable resonance diverges.

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

ROOT CAUSE

The s2 update uses + a2 y.

THE FAILURE

The s2 update uses + a2 y.

Unsuccessful approach: The attempted repair subtracts a2 times the input instead of the output.

Case contract

Input [[b0, b1, b2, a1, a2], samples, prime] (a0 = 1). Transposed direct form II: y = b0 x + s1; s1 = b1 x - a1 y + s2; s2 = b2 x - a2 y. If prime and samples exist, initialize s1, s2 to the steady state for a constant input equal to the first sample (y_ss = x0 (b0+b1+b2)/(1+a1+a2), "dc-pole" if the denominator is 0). Return exact fraction strings.

Why this case matters

Transposed DF-II is the default numerical form in filtering libraries, and steady-state priming avoids start-up transients.

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):
    b0, b1, b2, a1, a2 = [Fraction(v) for v in x[0]]
    xs, prime = x[1], x[2]
    s1 = s2 = Fraction(0)
    if prime and xs:
        den = 1 + a1 + a2
        if den == 0:
            return 'dc-pole'
        x0 = xs[0]
        yss = x0 * (b0 + b1 + b2) / den
        s1 = yss - b0 * x0
        s2 = b2 * x0 - a2 * yss
    out = []
    for v in xs:
        y = b0 * v + s1
        s1 = b1 * v - a1 * y + s2
        s2 = b2 * v + a2 * y
        out.append(str(y))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: primed step lowpass', [['1/4', '1/2', '1/4', '-1/2', '1/4'], [2, 2, 2, 2], True], ['8/3', '8/3', '8/3', '8/3']], ['regression: unprimed impulse', [['1', '1/2', '1/3', '1/2', '-1/4'], [1, 0, 0, 0], False], ['1', '0', '7/12', '-7/24']], ['regression: random df2t 0', [['5/4', '1/3', '3/4', '-1/2', '2'], [-1, 2, 4, 4, 1], False], ['-5/4', '37/24', '131/16', '283/32', '-1223/192']], ['control: primed highpass', [['1', '-2', '1', '0', '0'], [3, 3, 1], True], ['0', '0', '-2']], ['control: dc pole', [['1', '0', '0', '-2', '1'], [1, 1], True], 'dc-pole'], ['control: primed empty', [['1', '0', '0', '0', '0'], [], True], []], ['control: random df2t 2', [['3/4', '-1/4', '1/2', '1/8', '-1/2'], [-2, 2], True], ['-16/5', '-1/5']]], [['regression: random df2t 1', [['-1/4', '-1/2', '0', '-1/2', '-3/8'], [-3, 3, 1, 2], False], ['3/4', '9/8', '-29/32', '-33/32']], ['regression: random df2t 6', [['0', '-1/2', '1/8', '3/4', '3/4'], [4, 4, 2, 4], False], ['0', '-2', '0', '1']], ['regression: random df2t 7', [['-1/2', '2', '-1/4', '1/2', '2'], [3, 2, -2, 0], True], ['15/14', '11/7', '37/28', '-465/56']], ['control: random df2t 3', [['1/8', '3/4', '-3/8', '-1/2', '1/8'], [2], False], ['1/4']], ['control: random df2t 4', [['-1/2', '-3/8', '0', '0', '1/3'], [-3], True], ['63/32']], ['control: random df2t 5', [['-3/8', '-1/4', '-1/4', '1/3', '-1/4'], [2], True], ['-21/13']], ['control: random df2t 11', [['1/8', '1/8', '5/4', '-3/8', '1/2'], [0], True], ['0']]], [['regression: random df2t 8', [['-3/8', '2', '1/8', '1/3', '2'], [4, -3, -2, 1, 4], True], ['21/10', '189/40', '-421/40', '-1283/120', '8951/360']], ['regression: random df2t 9', [['-3/8', '0', '-1/2', '2', '5/4'], [3, -3, 3, 2], False], ['-9/8', '27/8', '-255/32', '399/32']], ['regression: random df2t 7', [['-1/2', '2', '-1/4', '1/2', '2'], [3, 2, -2, 0], True], ['15/14', '11/7', '37/28', '-465/56']], ['control: random df2t 12', [['-1/2', '5/4', '-1/4', '5/4', '-1/4'], [0, 0], False], ['0', '0']], ['control: random df2t 13', [['-1/4', '-1/4', '1/2', '5/4', '0'], [2, -3, -1, 3, -3], False], ['-1/2', '7/8', '29/32', '-401/128', '1749/512']], ['control: random df2t 14', [['1/3', '2', '1/2', '1/2', '5/4'], [0, -2], True], ['0', '-2/3']], ['control: random df2t 15', [['-1/4', '2', '-1/2', '1/2', '1/2'], [4], False], ['-1']]], [['regression: random df2t 16', [['5/4', '1/8', '1/8', '-3/8', '1/3'], [-2, 2, 3], True], ['-72/23', '43/23', '1011/184']], ['regression: random df2t 18', [['0', '-3/8', '1/3', '1/3', '2'], [4, 4, 2, 0, -3], True], ['-1/20', '-1/20', '-1/20', '7/10', '8/15']], ['regression: random df2t 9', [['-3/8', '0', '-1/2', '2', '5/4'], [3, -3, 3, 2], False], ['-9/8', '27/8', '-255/32', '399/32']], ['control: random df2t 17', [['2', '-1/2', '3/4', '-1/4', '-3/8'], [-1, 1], True], ['-6', '-2']], ['control: random df2t 19', [['-1/4', '1/3', '1/8', '1/3', '1/8'], [0, 1, -3], True], ['0', '-1/4', '7/6']], ['control: random df2t 20', [['5/4', '0', '5/4', '-1/2', '-1/2'], [-3, 1], True], 'dc-pole'], ['control: random df2t 22', [['1/3', '-3/8', '1/3', '0', '5/4'], [4], True], ['14/27']]], [['regression: random df2t 25', [['-1/4', '1/3', '1/3', '0', '1/8'], [-1, 3, -1, 0], True], ['-10/27', '-37/27', '26/27', '181/216']], ['regression: random df2t 26', [['1/3', '-3/8', '0', '1/3', '5/4'], [-2, 3, -2, 4, 3], True], ['1/31', '158/93', '-5353/2232', '5083/6696', '180377/80352']], ['regression: random df2t 16', [['5/4', '1/8', '1/8', '-3/8', '1/3'], [-2, 2, 3], True], ['-72/23', '43/23', '1011/184']], ['control: random df2t 23', [['3/4', '0', '-1/2', '-1/2', '0'], [3, 0, 3], False], ['9/4', '9/8', '21/16']], ['control: random df2t 24', [['2', '0', '-1/4', '1/8', '2'], [1, 0], False], ['2', '-1/4']], ['control: random df2t 28', [['3/4', '0', '-1/2', '1/2', '-1/2'], [4, 1], False], ['3', '-3/4']], ['control: random df2t 31', [['-1/2', '1/8', '1/2', '-1/2', '-1/4'], [0, -3], False], ['0', '3/2']]]]
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: primed step lowpass['8/3', '8/3', '4', '14/3']['8/3', '8/3', '8/3', '8/3']Failed
regression: unprimed impulse['1', '0', '1/12', '-1/24']['1', '0', '7/12', '-7/24']Failed
regression: random df2t 0['-5/4', '37/24', '51/16', '1201/96', '3497/192']['-5/4', '37/24', '131/16', '283/32', '-1223/192']Failed
control: primed highpass['0', '0', '-2']['0', '0', '-2']Passed
control: dc poledc-poledc-polePassed
control: primed empty[][]Passed
control: random df2t 2['-16/5', '-1/5']['-16/5', '-1/5']Passed

SHA-256 / 3cb1745fa875abf9376021c75ef8e5d2a9f59d3f6984e229991a51c440e3aebc

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):
    b0, b1, b2, a1, a2 = [Fraction(v) for v in x[0]]
    xs, prime = x[1], x[2]
    s1 = s2 = Fraction(0)
    if prime and xs:
        den = 1 + a1 + a2
        if den == 0:
            return 'dc-pole'
        x0 = xs[0]
        yss = x0 * (b0 + b1 + b2) / den
        s1 = yss - b0 * x0
        s2 = b2 * x0 - a2 * yss
    out = []
    for v in xs:
        y = b0 * v + s1
        s1 = b1 * v - a1 * y + s2
        s2 = b2 * v - a2 * v
        out.append(str(y))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: primed step lowpass', [['1/4', '1/2', '1/4', '-1/2', '1/4'], [2, 2, 2, 2], True], ['8/3', '8/3', '8/3', '8/3']], ['regression: unprimed impulse', [['1', '1/2', '1/3', '1/2', '-1/4'], [1, 0, 0, 0], False], ['1', '0', '7/12', '-7/24']], ['regression: random df2t 0', [['5/4', '1/3', '3/4', '-1/2', '2'], [-1, 2, 4, 4, 1], False], ['-5/4', '37/24', '131/16', '283/32', '-1223/192']], ['control: primed highpass', [['1', '-2', '1', '0', '0'], [3, 3, 1], True], ['0', '0', '-2']], ['control: dc pole', [['1', '0', '0', '-2', '1'], [1, 1], True], 'dc-pole'], ['control: primed empty', [['1', '0', '0', '0', '0'], [], True], []], ['control: random df2t 2', [['3/4', '-1/4', '1/2', '1/8', '-1/2'], [-2, 2], True], ['-16/5', '-1/5']]], [['regression: random df2t 1', [['-1/4', '-1/2', '0', '-1/2', '-3/8'], [-3, 3, 1, 2], False], ['3/4', '9/8', '-29/32', '-33/32']], ['regression: random df2t 6', [['0', '-1/2', '1/8', '3/4', '3/4'], [4, 4, 2, 4], False], ['0', '-2', '0', '1']], ['regression: random df2t 7', [['-1/2', '2', '-1/4', '1/2', '2'], [3, 2, -2, 0], True], ['15/14', '11/7', '37/28', '-465/56']], ['control: random df2t 3', [['1/8', '3/4', '-3/8', '-1/2', '1/8'], [2], False], ['1/4']], ['control: random df2t 4', [['-1/2', '-3/8', '0', '0', '1/3'], [-3], True], ['63/32']], ['control: random df2t 5', [['-3/8', '-1/4', '-1/4', '1/3', '-1/4'], [2], True], ['-21/13']], ['control: random df2t 11', [['1/8', '1/8', '5/4', '-3/8', '1/2'], [0], True], ['0']]], [['regression: random df2t 8', [['-3/8', '2', '1/8', '1/3', '2'], [4, -3, -2, 1, 4], True], ['21/10', '189/40', '-421/40', '-1283/120', '8951/360']], ['regression: random df2t 9', [['-3/8', '0', '-1/2', '2', '5/4'], [3, -3, 3, 2], False], ['-9/8', '27/8', '-255/32', '399/32']], ['regression: random df2t 7', [['-1/2', '2', '-1/4', '1/2', '2'], [3, 2, -2, 0], True], ['15/14', '11/7', '37/28', '-465/56']], ['control: random df2t 12', [['-1/2', '5/4', '-1/4', '5/4', '-1/4'], [0, 0], False], ['0', '0']], ['control: random df2t 13', [['-1/4', '-1/4', '1/2', '5/4', '0'], [2, -3, -1, 3, -3], False], ['-1/2', '7/8', '29/32', '-401/128', '1749/512']], ['control: random df2t 14', [['1/3', '2', '1/2', '1/2', '5/4'], [0, -2], True], ['0', '-2/3']], ['control: random df2t 15', [['-1/4', '2', '-1/2', '1/2', '1/2'], [4], False], ['-1']]], [['regression: random df2t 16', [['5/4', '1/8', '1/8', '-3/8', '1/3'], [-2, 2, 3], True], ['-72/23', '43/23', '1011/184']], ['regression: random df2t 18', [['0', '-3/8', '1/3', '1/3', '2'], [4, 4, 2, 0, -3], True], ['-1/20', '-1/20', '-1/20', '7/10', '8/15']], ['regression: random df2t 9', [['-3/8', '0', '-1/2', '2', '5/4'], [3, -3, 3, 2], False], ['-9/8', '27/8', '-255/32', '399/32']], ['control: random df2t 17', [['2', '-1/2', '3/4', '-1/4', '-3/8'], [-1, 1], True], ['-6', '-2']], ['control: random df2t 19', [['-1/4', '1/3', '1/8', '1/3', '1/8'], [0, 1, -3], True], ['0', '-1/4', '7/6']], ['control: random df2t 20', [['5/4', '0', '5/4', '-1/2', '-1/2'], [-3, 1], True], 'dc-pole'], ['control: random df2t 22', [['1/3', '-3/8', '1/3', '0', '5/4'], [4], True], ['14/27']]], [['regression: random df2t 25', [['-1/4', '1/3', '1/3', '0', '1/8'], [-1, 3, -1, 0], True], ['-10/27', '-37/27', '26/27', '181/216']], ['regression: random df2t 26', [['1/3', '-3/8', '0', '1/3', '5/4'], [-2, 3, -2, 4, 3], True], ['1/31', '158/93', '-5353/2232', '5083/6696', '180377/80352']], ['regression: random df2t 16', [['5/4', '1/8', '1/8', '-3/8', '1/3'], [-2, 2, 3], True], ['-72/23', '43/23', '1011/184']], ['control: random df2t 23', [['3/4', '0', '-1/2', '-1/2', '0'], [3, 0, 3], False], ['9/4', '9/8', '21/16']], ['control: random df2t 24', [['2', '0', '-1/4', '1/8', '2'], [1, 0], False], ['2', '-1/4']], ['control: random df2t 28', [['3/4', '0', '-1/2', '1/2', '-1/2'], [4, 1], False], ['3', '-3/4']], ['control: random df2t 31', [['-1/2', '1/8', '1/2', '-1/2', '-1/4'], [0, -3], False], ['0', '3/2']]]]
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: primed step lowpass['8/3', '8/3', '17/6', '35/12']['8/3', '8/3', '8/3', '8/3']Failed
regression: unprimed impulse['1', '0', '7/12', '-7/24']['1', '0', '7/12', '-7/24']Passed
regression: random df2t 0['-5/4', '37/24', '123/16', '737/96', '91/64']['-5/4', '37/24', '131/16', '283/32', '-1223/192']Failed
control: primed highpass['0', '0', '-2']['0', '0', '-2']Passed
control: dc poledc-poledc-polePassed
control: primed empty[][]Passed
control: random df2t 2['-16/5', '-1/5']['-16/5', '-1/5']Passed

SHA-256 / 57a47245b970c0814be8a56fb2490813d75e468e787267e78acea3febf6ebf72

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

Case digest / 2ffbc1ac50a825b0fe9ed224ef6d8553181b03f60f52ff6712dff754b31d7d15