A digital filter's feedback loop needs the current output in order to calculate the current output, which is impossible without solving the loop first. That circular dependency sits at the heart of every resonant filter you have ever used.
The lazy fix is to stick one sample of delay in the feedback path. It works, it costs almost nothing, and it quietly breaks the filter's behaviour.
Once that delay is in there, the resonance and the cutoff stop landing where the analog prototype put them. The error is small at low cutoff settings and gets ugly as you sweep upward.
Topology-preserving transform designs go a step further. Instead of converting an analog filter's transfer function on paper, they convert the actual signal flow of the circuit, block by block, so the digital version inherits the original's stability and response shape.
That structural fidelity is what makes the controls feel right. Cutoff and resonance keep behaving the way the analog design intended, rather than drifting apart as you push either one.
The gap widens the closer you get to the ceiling of the sample rate. Down at 200 Hz it is inaudible. Up near the top of the audible range, it is a real, hearable shift.
Prewarping fixes the frequency you care about most. The analog prototype gets designed at a deliberately shifted point so that, after the transform, the cutoff lands exactly where you asked for it.
Everything else still bends slightly around that anchor. This is a large part of why the same cutoff setting sounds different across plugins, even when two developers are modelling the same circuit.
Sample rate complicates it further. A filter tuned to behave at 44.1 kHz can misbehave at 96 kHz, because the coefficients that keep it stable are sensitive to the rate they were calculated for.
The ladder's resonance uses global negative feedback wrapped from output back to input. Push it hard, and the low end thins out noticeably, which is a documented trait rather than a modelling error.
State-variable designs run two integrators and a summing stage. They give you low-pass, high-pass, band-pass, and notch simultaneously, and cutoff and resonance interact far less than they do in a ladder. Pair that layout with topology-preserving maths, and it shows up everywhere, including in a cheap experimental synth that still gets its filter maths right.
Self-oscillation exposes the differences fastest. A state-variable filter tips into a clean sine at the cutoff frequency with little damage to the pass band, while a diode ladder tends to break into gritty distortion before it oscillates at all.
Modulation adds one more trap. Sweeping cutoff quickly changes the filter coefficients, and stepping those values creates zipper noise unless they are smoothed first.
A one-pole low-pass on the coefficient values with a time constant somewhere between one and five milliseconds handles it. Skip that stage, and fast envelope sweeps crackle audibly. It is one of the more reliable tells of rushed code, and it has nothing to do with the filter design itself.
The lazy fix is to stick one sample of delay in the feedback path. It works, it costs almost nothing, and it quietly breaks the filter's behaviour.
Once that delay is in there, the resonance and the cutoff stop landing where the analog prototype put them. The error is small at low cutoff settings and gets ugly as you sweep upward.
One sample of delay wrecks the feedback loop
Zero-delay feedback attacks the problem with algebra rather than approximation. The equations get restructured so the feedback path uses the current sample's value, and the loop resolves properly instead of leaning on the last sample's output.Topology-preserving transform designs go a step further. Instead of converting an analog filter's transfer function on paper, they convert the actual signal flow of the circuit, block by block, so the digital version inherits the original's stability and response shape.
That structural fidelity is what makes the controls feel right. Cutoff and resonance keep behaving the way the analog design intended, rather than drifting apart as you push either one.
Frequency warping pushes your cutoff off target
The bilinear transform maps analog frequencies onto digital ones, but the mapping is not linear. High frequencies get squashed harder than low ones, so the cutoff you dialled in ends up sitting lower than the number on screen.The gap widens the closer you get to the ceiling of the sample rate. Down at 200 Hz it is inaudible. Up near the top of the audible range, it is a real, hearable shift.
Prewarping fixes the frequency you care about most. The analog prototype gets designed at a deliberately shifted point so that, after the transform, the cutoff lands exactly where you asked for it.
Everything else still bends slightly around that anchor. This is a large part of why the same cutoff setting sounds different across plugins, even when two developers are modelling the same circuit.
Sample rate complicates it further. A filter tuned to behave at 44.1 kHz can misbehave at 96 kHz, because the coefficients that keep it stable are sensitive to the rate they were calculated for.
Ladder and state-variable filters resonate differently
Slope comes down to pole count. Each pole adds 6 dB per octave, so a two-pole design rolls off at 12 dB per octave, and a four-pole ladder reaches 24 dB per octave.The ladder's resonance uses global negative feedback wrapped from output back to input. Push it hard, and the low end thins out noticeably, which is a documented trait rather than a modelling error.
State-variable designs run two integrators and a summing stage. They give you low-pass, high-pass, band-pass, and notch simultaneously, and cutoff and resonance interact far less than they do in a ladder. Pair that layout with topology-preserving maths, and it shows up everywhere, including in a cheap experimental synth that still gets its filter maths right.
Self-oscillation exposes the differences fastest. A state-variable filter tips into a clean sine at the cutoff frequency with little damage to the pass band, while a diode ladder tends to break into gritty distortion before it oscillates at all.
Modulation adds one more trap. Sweeping cutoff quickly changes the filter coefficients, and stepping those values creates zipper noise unless they are smoothed first.
A one-pole low-pass on the coefficient values with a time constant somewhere between one and five milliseconds handles it. Skip that stage, and fast envelope sweeps crackle audibly. It is one of the more reliable tells of rushed code, and it has nothing to do with the filter design itself.