Resonant Filters

Overview

These are the dynamically-controlled resonant filters: state-variable and ladder topologies whose cutoff can be modulated every sample (by an envelope or LFO) while staying stable and free of zipper noise, the property a direct-form Biquad lacks. There are three, trading cost against accuracy and character:

  • State Variable Filter — a topology-preserving-transform (TPT) state-variable filter. Exact cutoff up to Nyquist and exact Q, with lowpass, bandpass, highpass, notch, peak, and allpass from one tick. The accurate, general-purpose default.

  • Moog Ladder Filter — a 4-pole (24 dB/octave) zero-delay-feedback ladder with resonance and self-oscillation: the classic "fat" synthesizer voice.

  • Chamberlin Filter — the cheap Chamberlin state-variable filter. Cheapest to run, but stable only below fs/6, with a slight cutoff warp and approximate Q.

Versus the biquad

The Biquad filters are excellent, but for a different job. A biquad is a second-order direct-form filter whose coefficients are derived from the RBJ cookbook assuming a fixed, time-invariant transfer function. It is the right tool for static work: EQ, mixing, and fixed-cutoff filtering, and in particular the peaking and shelving shapes with gain that the filters here do not provide. Configured once, it is cheap and accurate.

The trouble is modulation. A direct-form biquad stores past input and output samples, and those only correspond to the coefficients that produced them. Change the coefficients to sweep the cutoff, as a synth filter driven by an envelope or LFO must, and the charged state no longer matches the new transfer function: the output gets zipper noise and transient clicks, and at high Q it can ring or briefly blow up. Retuning is also not cheap, a sin, a cos, and several divides per change.

The resonant filters here are built for exactly that case. Their state is integrator outputs with a consistent physical meaning, so the cutoff can change every sample and the filter stays stable and free of zipper noise, even at high resonance and into self-oscillation. Retuning costs a single transcendental and at most a couple of divides (see Cost). On top of that, the State Variable Filter yields several responses from one tick, and the State Variable Filter and Moog Ladder Filter give musical resonance and, for the ladder, self-oscillation, none of which a biquad is meant to do.

Rule of thumb: reach for a Biquad for static EQ and fixed-cutoff filtering (especially shelving and peaking EQ); reach for these when the filter is modulated, a synth voice, an auto-wah, a filter sweep.

Cost

Approximate cost, to help choose. Tick counts the multiplies in the per-sample processing loop (adds and subtracts are not counted). Retune is the cost of changing the cutoff or Q: it is paid only when they change, so it is free for a static filter and per-sample for a swept one.

Filter Response Tick Retune Notes

Chamberlin Filter

12 dB/oct; lp / bp / hp / notch

~3 mults

sin, no divide

Cheapest. Stable only below fs/6; slight cutoff warp; approximate Q.

State Variable Filter

12 dB/oct; lp / bp / hp / notch / peak / allpass

~6 mults

tan + 1 divide

Exact cutoff to Nyquist and exact Q. The accurate default.

Moog Ladder Filter

24 dB/oct lowpass with resonance

~10 mults

tan + 2 divides

Exact (zero-delay feedback); Moog character and self-oscillation. The premium voice.

The retune transcendental (sin / tan) uses Q’s fast-math approximation, so a swept cutoff stays cheap; the divides are the dominant retune cost for the svf and the ladder under per-sample modulation.

For a cost-sensitive patch, choosing the right filter usually beats cheapening one. Reach for Chamberlin Filter when you want a cheap musical sweep and do not need an exact frequency or Q (and the cutoff stays below fs/6), State Variable Filter when you want accuracy or a response other than lowpass, and Moog Ladder Filter only when you want its 24 dB/octave voice.

Copyright (c) 2014-2026 Joel de Guzman. All rights reserved. Distributed under the Boost Software License, Version 1.0