FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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: unstableunstableunstablePassed
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 fixtureActualExpectedOutcome
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: unstableunstableunstablePassed
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 fixtureActualExpectedOutcome
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: unstableunstableunstablePassed
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