Search guides and the APICtrl K
  1. API reference
  2. DSP

passive_eq.h

A Pultec-style passive program equaliser.

#include <sonore/passive_eq.h>
On this page

Design notes

WHAT THIS IS, stated honestly: the CONTROL TOPOLOGY and curve family of the classic passive program EQ (EQP-1A pattern) -- independent boost and cut at one selected low frequency, a broad bell up top with a bandwidth control, a separate high shelf cut -- with the curves built from this SDK's matched biquads. It is NOT a component-level simulation of any specific unit: that would need the unit's schematic values through circuit.h. What it keeps is the behaviour that makes the topology worth having, each part documented in published measurements of the originals:

  • BOOST AND CUT AT ONCE (the "Pultec trick"): the cut network's corner sits about two octaves above the boost's and is shallower when the boost loads it, so full boost + full cut leaves a net low shelf, a dip in the low mids just above it, and a flat top. Neither knob alone can make that shape.
  • The boost is a second-order shelf into its corner; the cut is first order. Different orders are WHY their sum is not zero.
  • The high boost is a bell whose gain grows as its bandwidth narrows (sharp reaches +18 dB, broad +10), which is how the original's coupled bandwidth/boost network behaved.
  • Frequencies snap to the front-panel positions (20/30/60/100 low; 3/4/5/8/10/12/16 k bell; 5/10/20 k atten), because "60 Hz" on this kind of EQ is a switch, not a pot.

Coefficients are recomputed on the setter, not per sample: a program EQ's switches are set, not swept. Smooth outside if you automate it.

Included by dsp.h.

Types 1

A passive program equaliser in the EQP-1A pattern: low boost and low cut at one switched frequency (both at once give the dip-and-shelf "trick"), a high bell with a bandwidth control, and a high shelf cut. The control topology and curve family, not a component simulation of a unit (see the file comment).

One channel, per sample. Call setSampleRate() in prepare(). The amounts are 0..1 of each section's full range; the frequencies snap to the front panel's switch positions. The setters and process() run on the audio thread, but every setter redesigns all four sections and nothing is smoothed: set a control when it changes rather than per sample, and smooth outside if it is automated.

↑↓ to move↵ to openEvery public name in the headers, and every guide