Multiband spectral dereverberation

Remove the room.
Keep the signal.

Your room, hall, or cathedral is in the recording. Deverb takes it out.

Eight frequency bands, each one independent — you choose how hard to push the reverb suppression in each range rather than smearing the whole signal to fix a mid-range problem. No impulse response measurement, no setup ritual, just put Deverb on your track and start tweaking.

↓ macOS — VST3 + AU ↓ Windows — VST3 Source

Free and unsigned — macOS: approve in System Settings › Privacy & Security

Formats

VST3 · AU

macOS arm64 + x86_64 · Win x64

Algorithm

Postfish

Spectral estimation — not learned

Plugin

Deverb plugin UI showing eight frequency band faders

01 — Controls

Eight bands, one control set

Each frequency band has an independent depth fader. 1× is off; 5× is maximum suppression. The Smooth control sets the analysis window length. Release controls how fast suppression tracks the reverb tail.

Leave most bands flat and only suppress where the room is most audible. A vocal in a small tiled bathroom will typically show excess energy in the 500 Hz–2 kHz range — start there.

02 — Algorithm

Spectral dereverberation

Deverb estimates and subtracts reverberant energy across eight frequency-spaced bands. You set the suppression depth per band and leave it. No measurement pass, no cloud round-trip, nothing to sign up for.

The DSP is Monty's deverb algorithm from the Postfish codebase — GPL, open, and has been doing this job since 2002. Wrapped in iPlug2 with FFTW3 for the spectral processing.

The Really
Technical Bit

Recorded somewhere you shouldn't have? Deverb reduces the room without touching the dry signal. It reads the reverb tail in real time and subtracts it — no IR capture, no cloud processing, no account. Works on dialogue, voiceover, location audio, drums. The kind of fix you want to be invisible.

Signal chain

The incoming audio accumulates in an input FIFO until a full 2,048-sample block is available. A Hann window is applied to minimise spectral leakage before the FFT. The spectrum is split into eight bark-spaced subbands, each processed by an independent gain stage, then reconstructed via IFFT and 50% overlap-add back into the time domain. The FIFO pair decouples the plugin's internal block size from the DAW's buffer size, so it works correctly at any session buffer setting.

DAW Input
double**, N frames
Input FIFO
accumulate to 2 048
Hann Window + FFT
fftwf · 2 048-pt real → complex
8-Band Split
subband_read()
Per-Band Gain
doWork() callback
IFFT + Overlap-Add
50% overlap, ×2 latency
Output FIFO
drain N frames
DAW Output
double**, N frames

Latency ≈ 93 ms at 44.1 kHz  ·  FIFO pairs decouple plugin block size from DAW buffer size

Envelope tracking & gain control

Within each subband, two envelope followers track the signal power — a fast follower (Bessel IIR, attack-tracking) that responds to direct sound transients, and a slow follower (release-only) that hangs on the reverb tail. The shaded region marks where the slow envelope exceeds the fast — the zone where suppression is active.

Signal power + dual envelopes (dB)

instantaneous power x²
fast IIR (smooth τ)
slow IIR (release τ)

The resulting gain is clamped to reduction only — the algorithm never boosts. At depth 1.7×, the peak suppression during a typical reverb tail is around 5–8 dB. The gain returns to 0 dB as the fast and slow envelopes converge, which is what gives the natural-sounding release rather than an abrupt cut.

Gain reduction over time (depth = 1.7×)

gain (dB)
0 dB

Depth response

Each of the five depth settings produces a different suppression slope. At 1×, no reduction is applied — the plugin is effectively bypassed. At 5×, a 30 dB reverberant delta drives approximately 30 dB of suppression. The response is linear in dB space: double the delta, double the reduction. In practice, most material sounds best between 1.5× and 2.5×, where suppression is audible but artefacts remain below the noise floor.

Suppression vs. reverberant delta (ΔdB)

Maximum gain reduction at each depth setting, computed at a 30 dB reverberant delta.

DepthRatiomultEndMax reduction

Per-band Gain Computation

Inside doWork(), each subband runs the same sequence: square the input to get instantaneous power, feed it into both IIR followers, convert to dB, subtract, scale by depth, convert back, clamp to ≤1, and multiply the band. All in one callback per FFT frame.

doWork() — per-band gain path

band[n] mSS.lap[i][ch] x[k]² power FAST IIR (Bessel) freefall_limited τ=smooth_ms SLOW IIR (Bessel) freefallonly1 τ=release_ms todB_a() todB_a() × 0.5 × multEnd depth scaling fromdB_a() clamp g < 1 band[n] × g[k]

Per-band State Machine

Each band cycles through three states depending on whether its depth fader is active. A two-frame priming delay prevents the IIR followers from applying gain before they have had time to stabilise — avoiding the click or zipper noise that would otherwise occur when a band is switched on.

inactiveDelay state transitions

OFF ratio=1000, multEnd=0 IIR reset, skip depth > 1× PRIMING inactiveDelay-- (2→0) multEnd=0, fade in 2 frames ACTIVE multEnd = 1−1000/ratio full gain reduction depth = 1× OFF IIR reset skip multEnd interpolates linearly over N=2048 samples on any ratio change — parameter transitions are always smoothed, never stepped.

The Gain Formula

The suppression gain applied to each subband at each frame reduces to a single expression. It combines the envelope delta, a linear depth mapping, and a clamp that enforces reduction-only behaviour.

Per-band suppression gain

G[n] = 0.5 × (todB(slow[n]) − todB(fast[n])) × multEnd
multEnd  = 1 − depth
todB(x)  = 10 × log₁₀(x)
G[n]      = min(G[n], 0)

slow[n], fast[n] — power envelope values (amplitude²) at frame n
depth — fader value 1× to 5×  ·  multEnd is negative for depth > 1, giving reduction
Final clamp ensures G[n] ≤ 0 dB at all times

Why x²?   The envelope followers operate on power — amplitude squared. Since todB(x) = 10 × log₁₀(x) and x here is already amplitude², this is equivalent to computing 20 × log₁₀(amplitude): the gain is derived from RMS amplitude in dB. The x² is not incidental — it places the suppression decision in the perceptually correct domain where equal dB steps correspond to equal perceived loudness changes, giving the algorithm its subjectively smooth behaviour.