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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: primed step lowpass | ['-8', '0', '4', '4'] | ['8/3', '8/3', '8/3', '8/3'] | Failed |
| regression: primed highpass | dc-pole | ['0', '0', '-2'] | Failed |
| regression: dc pole | ['-1', '0'] | dc-pole | Failed |
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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-pole | Failed |
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 pole | dc-pole | dc-pole | Passed |
| 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