FAILURE MAP
← Case archive

FA-91396 / Digital signal filters / Open access

Steady-state priming omits the leading 1 of the denominator · case 01

Primed outputs start at the wrong level and then settle, a visible start-up step.

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

ROOT CAUSE

The DC gain denominator is a1 + a2 instead of 1 + a1 + a2.

VERIFIED REPAIR

Use A(1) = 1 + a1 + a2.

Unsuccessful approach: The attempted repair uses 1 - a1 - a2, a sign convention from the other denominator form.

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 = 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: primed highpass', [['1', '-2', '1', '0', '0'], [3, 3, 1], True], ['0', '0', '-2']], ['regression: dc pole', [['1', '0', '0', '-2', '1'], [1, 1], True], 'dc-pole'], ['control: unprimed impulse', [['1', '1/2', '1/3', '1/2', '-1/4'], [1, 0, 0, 0], False], ['1', '0', '7/12', '-7/24']], ['control: primed empty', [['1', '0', '0', '0', '0'], [], True], []], ['control: 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: 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 2', [['3/4', '-1/4', '1/2', '1/8', '-1/2'], [-2, 2], True], ['-16/5', '-1/5']], ['regression: random df2t 4', [['-1/2', '-3/8', '0', '0', '1/3'], [-3], True], ['63/32']], ['regression: random df2t 5', [['-3/8', '-1/4', '-1/4', '1/3', '-1/4'], [2], True], ['-21/13']], ['control: random df2t 3', [['1/8', '3/4', '-3/8', '-1/2', '1/8'], [2], False], ['1/4']], ['control: random df2t 6', [['0', '-1/2', '1/8', '3/4', '3/4'], [4, 4, 2, 4], False], ['0', '-2', '0', '1']], ['control: 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 10', [['1/8', '1/3', '-1/4', '1/3', '1/8'], [1, -1, 2, 3, 3], False], ['1/8', '1/6', '-233/576', '2429/1728', '18953/41472']]], [['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']], ['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 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']], ['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']]], [['regression: random df2t 17', [['2', '-1/2', '3/4', '-1/4', '-3/8'], [-1, 1], True], ['-6', '-2']], ['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 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']], ['control: random df2t 15', [['-1/4', '2', '-1/2', '1/2', '1/2'], [4], False], ['-1']], ['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 21', [['1/2', '1/8', '-1/4', '-1/4', '3/4'], [2, 0, 3, -3], False], ['1', '1/2', '3/8', '-45/32']], ['control: random df2t 23', [['3/4', '0', '-1/2', '-1/2', '0'], [3, 0, 3], False], ['9/4', '9/8', '21/16']]], [['regression: 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 17', [['2', '-1/2', '3/4', '-1/4', '-3/8'], [-1, 1], True], ['-6', '-2']], ['control: random df2t 24', [['2', '0', '-1/4', '1/8', '2'], [1, 0], False], ['2', '-1/4']], ['control: random df2t 27', [['-1/4', '2', '2', '3/4', '-3/8'], [-1, 3, 1], False], ['1/4', '-47/16', '387/64']], ['control: random df2t 28', [['3/4', '0', '-1/2', '1/2', '-1/2'], [4, 1], False], ['3', '-3/4']], ['control: random df2t 29', [['1/2', '-1/2', '-1/2', '3/4', '-1/2'], [-3, 0, 1, 3], False], ['-3/2', '21/8', '-23/32', '365/128']]]]
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', '0', '4', '4']['8/3', '8/3', '8/3', '8/3']Failed
regression: primed highpassdc-pole['0', '0', '-2']Failed
regression: dc pole['-1', '0']dc-poleFailed
control: unprimed impulse['1', '0', '7/12', '-7/24']['1', '0', '7/12', '-7/24']Passed
control: primed empty[][]Passed
control: random df2t 0['-5/4', '37/24', '131/16', '283/32', '-1223/192']['-5/4', '37/24', '131/16', '283/32', '-1223/192']Passed
control: random df2t 1['3/4', '9/8', '-29/32', '-33/32']['3/4', '9/8', '-29/32', '-33/32']Passed

SHA-256 / 6245c43c85d2b89559f1130362c06c9f4d84967c62969bf3b61fe5ad0916ed73

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 * 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: primed highpass', [['1', '-2', '1', '0', '0'], [3, 3, 1], True], ['0', '0', '-2']], ['regression: dc pole', [['1', '0', '0', '-2', '1'], [1, 1], True], 'dc-pole'], ['control: unprimed impulse', [['1', '1/2', '1/3', '1/2', '-1/4'], [1, 0, 0, 0], False], ['1', '0', '7/12', '-7/24']], ['control: primed empty', [['1', '0', '0', '0', '0'], [], True], []], ['control: 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: 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 2', [['3/4', '-1/4', '1/2', '1/8', '-1/2'], [-2, 2], True], ['-16/5', '-1/5']], ['regression: random df2t 4', [['-1/2', '-3/8', '0', '0', '1/3'], [-3], True], ['63/32']], ['regression: random df2t 5', [['-3/8', '-1/4', '-1/4', '1/3', '-1/4'], [2], True], ['-21/13']], ['control: random df2t 3', [['1/8', '3/4', '-3/8', '-1/2', '1/8'], [2], False], ['1/4']], ['control: random df2t 6', [['0', '-1/2', '1/8', '3/4', '3/4'], [4, 4, 2, 4], False], ['0', '-2', '0', '1']], ['control: 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 10', [['1/8', '1/3', '-1/4', '1/3', '1/8'], [1, -1, 2, 3, 3], False], ['1/8', '1/6', '-233/576', '2429/1728', '18953/41472']]], [['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']], ['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 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']], ['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']]], [['regression: random df2t 17', [['2', '-1/2', '3/4', '-1/4', '-3/8'], [-1, 1], True], ['-6', '-2']], ['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 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']], ['control: random df2t 15', [['-1/4', '2', '-1/2', '1/2', '1/2'], [4], False], ['-1']], ['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 21', [['1/2', '1/8', '-1/4', '-1/4', '3/4'], [2, 0, 3, -3], False], ['1', '1/2', '3/8', '-45/32']], ['control: random df2t 23', [['3/4', '0', '-1/2', '-1/2', '0'], [3, 0, 3], False], ['9/4', '9/8', '21/16']]], [['regression: 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 17', [['2', '-1/2', '3/4', '-1/4', '-3/8'], [-1, 1], True], ['-6', '-2']], ['control: random df2t 24', [['2', '0', '-1/4', '1/8', '2'], [1, 0], False], ['2', '-1/4']], ['control: random df2t 27', [['-1/4', '2', '2', '3/4', '-3/8'], [-1, 3, 1], False], ['1/4', '-47/16', '387/64']], ['control: random df2t 28', [['3/4', '0', '-1/2', '1/2', '-1/2'], [4, 1], False], ['3', '-3/4']], ['control: random df2t 29', [['1/2', '-1/2', '-1/2', '3/4', '-1/2'], [-3, 0, 1, 3], False], ['-3/2', '21/8', '-23/32', '365/128']]]]
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/5', '12/5', '14/5', '14/5']['8/3', '8/3', '8/3', '8/3']Failed
regression: primed highpass['0', '0', '-2']['0', '0', '-2']Passed
regression: dc pole['1/2', '3/2']dc-poleFailed
control: unprimed impulse['1', '0', '7/12', '-7/24']['1', '0', '7/12', '-7/24']Passed
control: primed empty[][]Passed
control: random df2t 0['-5/4', '37/24', '131/16', '283/32', '-1223/192']['-5/4', '37/24', '131/16', '283/32', '-1223/192']Passed
control: random df2t 1['3/4', '9/8', '-29/32', '-33/32']['3/4', '9/8', '-29/32', '-33/32']Passed

SHA-256 / d7d69d20acdd8b8db370e4ad99097e6bfdf8225e481b28090047742892f1f1c1

3 / The verified repair

Exit 0
"""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: primed highpass', [['1', '-2', '1', '0', '0'], [3, 3, 1], True], ['0', '0', '-2']], ['regression: dc pole', [['1', '0', '0', '-2', '1'], [1, 1], True], 'dc-pole'], ['control: unprimed impulse', [['1', '1/2', '1/3', '1/2', '-1/4'], [1, 0, 0, 0], False], ['1', '0', '7/12', '-7/24']], ['control: primed empty', [['1', '0', '0', '0', '0'], [], True], []], ['control: 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: 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 2', [['3/4', '-1/4', '1/2', '1/8', '-1/2'], [-2, 2], True], ['-16/5', '-1/5']], ['regression: random df2t 4', [['-1/2', '-3/8', '0', '0', '1/3'], [-3], True], ['63/32']], ['regression: random df2t 5', [['-3/8', '-1/4', '-1/4', '1/3', '-1/4'], [2], True], ['-21/13']], ['control: random df2t 3', [['1/8', '3/4', '-3/8', '-1/2', '1/8'], [2], False], ['1/4']], ['control: random df2t 6', [['0', '-1/2', '1/8', '3/4', '3/4'], [4, 4, 2, 4], False], ['0', '-2', '0', '1']], ['control: 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 10', [['1/8', '1/3', '-1/4', '1/3', '1/8'], [1, -1, 2, 3, 3], False], ['1/8', '1/6', '-233/576', '2429/1728', '18953/41472']]], [['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']], ['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 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']], ['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']]], [['regression: random df2t 17', [['2', '-1/2', '3/4', '-1/4', '-3/8'], [-1, 1], True], ['-6', '-2']], ['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 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']], ['control: random df2t 15', [['-1/4', '2', '-1/2', '1/2', '1/2'], [4], False], ['-1']], ['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 21', [['1/2', '1/8', '-1/4', '-1/4', '3/4'], [2, 0, 3, -3], False], ['1', '1/2', '3/8', '-45/32']], ['control: random df2t 23', [['3/4', '0', '-1/2', '-1/2', '0'], [3, 0, 3], False], ['9/4', '9/8', '21/16']]], [['regression: 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 17', [['2', '-1/2', '3/4', '-1/4', '-3/8'], [-1, 1], True], ['-6', '-2']], ['control: random df2t 24', [['2', '0', '-1/4', '1/8', '2'], [1, 0], False], ['2', '-1/4']], ['control: random df2t 27', [['-1/4', '2', '2', '3/4', '-3/8'], [-1, 3, 1], False], ['1/4', '-47/16', '387/64']], ['control: random df2t 28', [['3/4', '0', '-1/2', '1/2', '-1/2'], [4, 1], False], ['3', '-3/4']], ['control: random df2t 29', [['1/2', '-1/2', '-1/2', '3/4', '-1/2'], [-3, 0, 1, 3], False], ['-3/2', '21/8', '-23/32', '365/128']]]]
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', '8/3', '8/3']['8/3', '8/3', '8/3', '8/3']Passed
regression: primed highpass['0', '0', '-2']['0', '0', '-2']Passed
regression: dc poledc-poledc-polePassed
control: unprimed impulse['1', '0', '7/12', '-7/24']['1', '0', '7/12', '-7/24']Passed
control: primed empty[][]Passed
control: random df2t 0['-5/4', '37/24', '131/16', '283/32', '-1223/192']['-5/4', '37/24', '131/16', '283/32', '-1223/192']Passed
control: random df2t 1['3/4', '9/8', '-29/32', '-33/32']['3/4', '9/8', '-29/32', '-33/32']Passed

SHA-256 / 713c39ec3d5bb0df377ac0f0a855b96cac1f92e6ba28e68f11a7d188f2e3f33b

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

Case digest / 352e487baacad05b50652ef9917ec74a0a5f7e2ee0b9455dc6faa77f55eb3bc0