FA-91826 / Digital signal filters / Open access
Allpass adds the feedback term · case 01
The magnitude response is no longer flat; the section boosts low frequencies.
ROOT CAUSE
The recursion uses + a y[n-1].
VERIFIED REPAIR
Use - a y[n-1].
Unsuccessful approach: The attempted repair subtracts a x[n-1] instead of a y[n-1].
Case contract
Input [a, samples]: y[n] = a x[n] + x[n-1] - a y[n-1] with zero state, "unstable" if |a| >= 1. Return exact fraction strings.
Why this case matters
Allpass sections build phase equalizers and fractional delays; any coefficient slip breaks the unit-magnitude property.
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):
a, xs = Fraction(x[0]), x[1]
if abs(a) >= 1:
return 'unstable'
x1 = y1 = Fraction(0)
out = []
for v in xs:
y = a * v + x1 + a * y1
x1, y1 = v, 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: impulse a=1/2', ['1/2', [1, 0, 0, 0]], ['1/2', '3/4', '-3/8', '3/16']], ['regression: negative coefficient', ['-1/3', [2, -1, 0]], ['-2/3', '19/9', '-8/27']], ['regression: random allpass 0', ['1/4', [1, 2, 2, 4]], ['1/4', '23/16', '137/64', '631/256']], ['control: unstable', ['1', [1]], 'unstable'], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']]], [['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['regression: random allpass 0', ['1/4', [1, 2, 2, 4]], ['1/4', '23/16', '137/64', '631/256']], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 3', ['3/5', [1, -1, 0, 4, 1, 4]], ['3/5', '1/25', '-128/125', '1884/625', '8723/3125', '26956/15625']]], [['regression: random allpass 4', ['1/2', [4, 2, -3, 0, 3, -3]], ['2', '4', '-3/2', '-9/4', '21/8', '3/16']], ['regression: random allpass 5', ['-1/2', [3, 4, -2, 1, -1]], ['-3/2', '1/4', '41/8', '1/16', '49/32']], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['control: unstable', ['1', [1]], 'unstable'], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']]], [['regression: random allpass 7', ['-2/3', [4, 3, 3, -3]], ['-8/3', '2/9', '31/27', '467/81']], ['regression: random allpass 8', ['3/5', [4, -2, -2]], ['12/5', '34/25', '-502/125']], ['regression: random allpass 4', ['1/2', [4, 2, -3, 0, 3, -3]], ['2', '4', '-3/2', '-9/4', '21/8', '3/16']], ['control: unstable', ['1', [1]], 'unstable'], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']]], [['regression: random allpass 10', ['1/4', [-3, 4, 3, 2, -3]], ['-3/4', '-29/16', '333/64', '563/256', '717/1024']], ['regression: random allpass 11', ['-2/3', [3, 1, 4, 0]], ['-2', '1', '-1', '10/3']], ['regression: random allpass 6', ['-1/2', [-3, 3, 3, 2]], ['3/2', '-15/4', '-3/8', '29/16']], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 3', ['3/5', [1, -1, 0, 4, 1, 4]], ['3/5', '1/25', '-128/125', '1884/625', '8723/3125', '26956/15625']]]]
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: impulse a=1/2 | ['1/2', '5/4', '5/8', '5/16'] | ['1/2', '3/4', '-3/8', '3/16'] | Failed |
| regression: negative coefficient | ['-2/3', '23/9', '-50/27'] | ['-2/3', '19/9', '-8/27'] | Failed |
| regression: random allpass 0 | ['1/4', '25/16', '185/64', '953/256'] | ['1/4', '23/16', '137/64', '631/256'] | Failed |
| control: unstable | unstable | unstable | Passed |
| control: a zero is delay | ['0', '1', '2'] | ['0', '1', '2'] | Passed |
| control: random allpass 27 | ['0', '-8/3'] | ['0', '-8/3'] | Passed |
| regression: random allpass 1 | ['0', '-1/2', '-7/4', '-15/8'] | ['0', '-1/2', '-5/4', '-3/8'] | Failed |
SHA-256 / c3a32ea205bf39d8341008610603cfc086cdecacbe82775752fa63ddc6e7ab1f
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):
a, xs = Fraction(x[0]), x[1]
if abs(a) >= 1:
return 'unstable'
x1 = y1 = Fraction(0)
out = []
for v in xs:
y = a * v + x1 - a * x1
x1, y1 = v, 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: impulse a=1/2', ['1/2', [1, 0, 0, 0]], ['1/2', '3/4', '-3/8', '3/16']], ['regression: negative coefficient', ['-1/3', [2, -1, 0]], ['-2/3', '19/9', '-8/27']], ['regression: random allpass 0', ['1/4', [1, 2, 2, 4]], ['1/4', '23/16', '137/64', '631/256']], ['control: unstable', ['1', [1]], 'unstable'], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']]], [['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['regression: random allpass 0', ['1/4', [1, 2, 2, 4]], ['1/4', '23/16', '137/64', '631/256']], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 3', ['3/5', [1, -1, 0, 4, 1, 4]], ['3/5', '1/25', '-128/125', '1884/625', '8723/3125', '26956/15625']]], [['regression: random allpass 4', ['1/2', [4, 2, -3, 0, 3, -3]], ['2', '4', '-3/2', '-9/4', '21/8', '3/16']], ['regression: random allpass 5', ['-1/2', [3, 4, -2, 1, -1]], ['-3/2', '1/4', '41/8', '1/16', '49/32']], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['control: unstable', ['1', [1]], 'unstable'], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']]], [['regression: random allpass 7', ['-2/3', [4, 3, 3, -3]], ['-8/3', '2/9', '31/27', '467/81']], ['regression: random allpass 8', ['3/5', [4, -2, -2]], ['12/5', '34/25', '-502/125']], ['regression: random allpass 4', ['1/2', [4, 2, -3, 0, 3, -3]], ['2', '4', '-3/2', '-9/4', '21/8', '3/16']], ['control: unstable', ['1', [1]], 'unstable'], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']]], [['regression: random allpass 10', ['1/4', [-3, 4, 3, 2, -3]], ['-3/4', '-29/16', '333/64', '563/256', '717/1024']], ['regression: random allpass 11', ['-2/3', [3, 1, 4, 0]], ['-2', '1', '-1', '10/3']], ['regression: random allpass 6', ['-1/2', [-3, 3, 3, 2]], ['3/2', '-15/4', '-3/8', '29/16']], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 3', ['3/5', [1, -1, 0, 4, 1, 4]], ['3/5', '1/25', '-128/125', '1884/625', '8723/3125', '26956/15625']]]]
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: impulse a=1/2 | ['1/2', '1/2', '0', '0'] | ['1/2', '3/4', '-3/8', '3/16'] | Failed |
| regression: negative coefficient | ['-2/3', '3', '-4/3'] | ['-2/3', '19/9', '-8/27'] | Failed |
| regression: random allpass 0 | ['1/4', '5/4', '2', '5/2'] | ['1/4', '23/16', '137/64', '631/256'] | Failed |
| control: unstable | unstable | unstable | Passed |
| control: a zero is delay | ['0', '1', '2'] | ['0', '1', '2'] | Passed |
| control: random allpass 27 | ['0', '-8/3'] | ['0', '-8/3'] | Passed |
| regression: random allpass 1 | ['0', '-1/2', '-1', '-1/2'] | ['0', '-1/2', '-5/4', '-3/8'] | Failed |
SHA-256 / 5e25728d0833911bbd84d3bff1f79c5a25ce2993f6973a58c736ef1d6431a10d
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):
a, xs = Fraction(x[0]), x[1]
if abs(a) >= 1:
return 'unstable'
x1 = y1 = Fraction(0)
out = []
for v in xs:
y = a * v + x1 - a * y1
x1, y1 = v, 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: impulse a=1/2', ['1/2', [1, 0, 0, 0]], ['1/2', '3/4', '-3/8', '3/16']], ['regression: negative coefficient', ['-1/3', [2, -1, 0]], ['-2/3', '19/9', '-8/27']], ['regression: random allpass 0', ['1/4', [1, 2, 2, 4]], ['1/4', '23/16', '137/64', '631/256']], ['control: unstable', ['1', [1]], 'unstable'], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']]], [['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['regression: random allpass 0', ['1/4', [1, 2, 2, 4]], ['1/4', '23/16', '137/64', '631/256']], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 3', ['3/5', [1, -1, 0, 4, 1, 4]], ['3/5', '1/25', '-128/125', '1884/625', '8723/3125', '26956/15625']]], [['regression: random allpass 4', ['1/2', [4, 2, -3, 0, 3, -3]], ['2', '4', '-3/2', '-9/4', '21/8', '3/16']], ['regression: random allpass 5', ['-1/2', [3, 4, -2, 1, -1]], ['-3/2', '1/4', '41/8', '1/16', '49/32']], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['control: unstable', ['1', [1]], 'unstable'], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']]], [['regression: random allpass 7', ['-2/3', [4, 3, 3, -3]], ['-8/3', '2/9', '31/27', '467/81']], ['regression: random allpass 8', ['3/5', [4, -2, -2]], ['12/5', '34/25', '-502/125']], ['regression: random allpass 4', ['1/2', [4, 2, -3, 0, 3, -3]], ['2', '4', '-3/2', '-9/4', '21/8', '3/16']], ['control: unstable', ['1', [1]], 'unstable'], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']]], [['regression: random allpass 10', ['1/4', [-3, 4, 3, 2, -3]], ['-3/4', '-29/16', '333/64', '563/256', '717/1024']], ['regression: random allpass 11', ['-2/3', [3, 1, 4, 0]], ['-2', '1', '-1', '10/3']], ['regression: random allpass 6', ['-1/2', [-3, 3, 3, 2]], ['3/2', '-15/4', '-3/8', '29/16']], ['control: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['control: random allpass 27', ['-2/3', [0, 4]], ['0', '-8/3']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 3', ['3/5', [1, -1, 0, 4, 1, 4]], ['3/5', '1/25', '-128/125', '1884/625', '8723/3125', '26956/15625']]]]
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: impulse a=1/2 | ['1/2', '3/4', '-3/8', '3/16'] | ['1/2', '3/4', '-3/8', '3/16'] | Passed |
| regression: negative coefficient | ['-2/3', '19/9', '-8/27'] | ['-2/3', '19/9', '-8/27'] | Passed |
| regression: random allpass 0 | ['1/4', '23/16', '137/64', '631/256'] | ['1/4', '23/16', '137/64', '631/256'] | Passed |
| control: unstable | unstable | unstable | Passed |
| control: a zero is delay | ['0', '1', '2'] | ['0', '1', '2'] | Passed |
| control: random allpass 27 | ['0', '-8/3'] | ['0', '-8/3'] | Passed |
| regression: random allpass 1 | ['0', '-1/2', '-5/4', '-3/8'] | ['0', '-1/2', '-5/4', '-3/8'] | Passed |
SHA-256 / c35685246f90cd8ec47a3284acd5bf57aade14a2d15c70ed4841151af3bec9e9
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.576820+00:00.
Case digest / 2441bffc97dbcb3abe440e14a425aa954cbacae53528e98e8e75392fab0b028c