FAILURE MAP
← Case archive

FA-91831 / Digital signal filters / Open access

Allpass passes the input without the a coefficient · case 01

The section is not allpass; its DC gain differs from 1.

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

ROOT CAUSE

The direct term uses x[n] instead of a x[n].

VERIFIED REPAIR

Use a x[n] on the direct path.

Unsuccessful approach: The attempted repair uses -a x[n].

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 = 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'], ['regression: 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 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']], ['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']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['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 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 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 0', ['1/4', [1, 2, 2, 4]], ['1/4', '23/16', '137/64', '631/256']], ['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']], ['regression: random allpass 5', ['-1/2', [3, 4, -2, 1, -1]], ['-3/2', '1/4', '41/8', '1/16', '49/32']]], [['regression: random allpass 6', ['-1/2', [-3, 3, 3, 2]], ['3/2', '-15/4', '-3/8', '29/16']], ['regression: random allpass 7', ['-2/3', [4, 3, 3, -3]], ['-8/3', '2/9', '31/27', '467/81']], ['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'], ['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 3', ['3/5', [1, -1, 0, 4, 1, 4]], ['3/5', '1/25', '-128/125', '1884/625', '8723/3125', '26956/15625']]], [['regression: random allpass 9', ['1/4', [1, -3, 3, 2, -1, 4]], ['1/4', '3/16', '-147/64', '1043/256', '749/1024', '-749/4096']], ['regression: random allpass 10', ['1/4', [-3, 4, 3, 2, -3]], ['-3/4', '-29/16', '333/64', '563/256', '717/1024']], ['regression: random allpass 6', ['-1/2', [-3, 3, 3, 2]], ['3/2', '-15/4', '-3/8', '29/16']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['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']]]]
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', '1/2', '-1/4', '1/8']['1/2', '3/4', '-3/8', '3/16']Failed
regression: negative coefficient['2', '5/3', '-4/9']['-2/3', '19/9', '-8/27']Failed
regression: random allpass 0['1', '11/4', '53/16', '331/64']['1/4', '23/16', '137/64', '631/256']Failed
control: unstableunstableunstablePassed
regression: a zero is delay['1', '3', '5']['0', '1', '2']Failed
regression: random allpass 1['0', '-1', '-3/2', '-1/4']['0', '-1/2', '-5/4', '-3/8']Failed
regression: random allpass 2['-2', '-4', '-6', '-3']['1', '-1', '0', '-9/2']Failed

SHA-256 / bbf90a3276311343c7088a511635ec499583363162ed677de0da233d520fd302

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 * 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'], ['regression: 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 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']], ['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']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['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 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 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 0', ['1/4', [1, 2, 2, 4]], ['1/4', '23/16', '137/64', '631/256']], ['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']], ['regression: random allpass 5', ['-1/2', [3, 4, -2, 1, -1]], ['-3/2', '1/4', '41/8', '1/16', '49/32']]], [['regression: random allpass 6', ['-1/2', [-3, 3, 3, 2]], ['3/2', '-15/4', '-3/8', '29/16']], ['regression: random allpass 7', ['-2/3', [4, 3, 3, -3]], ['-8/3', '2/9', '31/27', '467/81']], ['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'], ['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 3', ['3/5', [1, -1, 0, 4, 1, 4]], ['3/5', '1/25', '-128/125', '1884/625', '8723/3125', '26956/15625']]], [['regression: random allpass 9', ['1/4', [1, -3, 3, 2, -1, 4]], ['1/4', '3/16', '-147/64', '1043/256', '749/1024', '-749/4096']], ['regression: random allpass 10', ['1/4', [-3, 4, 3, 2, -3]], ['-3/4', '-29/16', '333/64', '563/256', '717/1024']], ['regression: random allpass 6', ['-1/2', [-3, 3, 3, 2]], ['3/2', '-15/4', '-3/8', '29/16']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['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']]]]
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', '17/9', '-10/27']['-2/3', '19/9', '-8/27']Failed
regression: random allpass 0['-1/4', '9/16', '87/64', '169/256']['1/4', '23/16', '137/64', '631/256']Failed
control: unstableunstableunstablePassed
regression: a zero is delay['0', '1', '2']['0', '1', '2']Passed
regression: random allpass 1['0', '1/2', '-3/4', '-5/8']['0', '-1/2', '-5/4', '-3/8']Failed
regression: random allpass 2['-1', '-3', '-4', '-7/2']['1', '-1', '0', '-9/2']Failed

SHA-256 / 6ff1b8d102c530efe3bb3df8b18c5fb2c3af66bd7733390ad055ef022be26372

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'], ['regression: 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 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']], ['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']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: a zero is delay', ['0', [1, 2, 3]], ['0', '1', '2']], ['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 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 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 0', ['1/4', [1, 2, 2, 4]], ['1/4', '23/16', '137/64', '631/256']], ['regression: random allpass 1', ['1/2', [0, -1, -1, 0]], ['0', '-1/2', '-5/4', '-3/8']], ['regression: random allpass 5', ['-1/2', [3, 4, -2, 1, -1]], ['-3/2', '1/4', '41/8', '1/16', '49/32']]], [['regression: random allpass 6', ['-1/2', [-3, 3, 3, 2]], ['3/2', '-15/4', '-3/8', '29/16']], ['regression: random allpass 7', ['-2/3', [4, 3, 3, -3]], ['-8/3', '2/9', '31/27', '467/81']], ['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'], ['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 3', ['3/5', [1, -1, 0, 4, 1, 4]], ['3/5', '1/25', '-128/125', '1884/625', '8723/3125', '26956/15625']]], [['regression: random allpass 9', ['1/4', [1, -3, 3, 2, -1, 4]], ['1/4', '3/16', '-147/64', '1043/256', '749/1024', '-749/4096']], ['regression: random allpass 10', ['1/4', [-3, 4, 3, 2, -3]], ['-3/4', '-29/16', '333/64', '563/256', '717/1024']], ['regression: random allpass 6', ['-1/2', [-3, 3, 3, 2]], ['3/2', '-15/4', '-3/8', '29/16']], ['control: unstable', ['1', [1]], 'unstable'], ['regression: random allpass 2', ['-1/2', [-2, -1, -3, 3]], ['1', '-1', '0', '-9/2']], ['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']]]]
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
regression: a zero is delay['0', '1', '2']['0', '1', '2']Passed
regression: random allpass 1['0', '-1/2', '-5/4', '-3/8']['0', '-1/2', '-5/4', '-3/8']Passed
regression: random allpass 2['1', '-1', '0', '-9/2']['1', '-1', '0', '-9/2']Passed

SHA-256 / b800ef4f00471f4e03130ee5275bf653f9084810206ff43d1bc80caf2971df86

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

Case digest / 5a002f546049a7fe7d90bf74305b8e66a50cf4bc409d9cca2ae0696069d6f998