CoProducer Measure a mix
A black kick drum with gold-veined marble finish and brass hardware in a dark studio, a glowing gold transient waveform in front of it with faint ripples reaching out ahead of the spike, a mixing console with cyan and magenta lights behind.

Mixing · 3 November 2026 · 7 min

Linear-phase EQ softening your kick? Listen before the hit

NoDAW Labs · Lacquer Vol. 06

A linear-phase low cut doesn’t only take bass away, it moves some of it in front of the hit. In our test, a 60 Hz, 48 dB/oct linear-phase high-pass on a kick put a soft swell ahead of the transient that started 41.6 ms early and peaked 19.6 dB under the kick, while a normal minimum-phase filter with the same curve put nothing before the hit. Use minimum phase on kicks, 808s and anything with a sharp attack, and keep linear phase for jobs where it really earns its place.

You switch your EQ to linear phase because it sounds like the clean, professional option. You high-pass the kick or the drum bus, and something about the punch changes. The hit feels a little soft, like it’s leaning in instead of landing. Solo it and you might hear it: a faint whoomp just before every kick.

That’s pre-ringing, and it’s the price of linear phase.

What linear phase actually trades

A normal EQ, called minimum phase, changes the tone and shifts the timing of frequencies near the cut by a little. Everything it does happens after the sound arrives. A linear-phase EQ keeps every frequency in time with every other, which sounds like a pure win. To do that it has to look ahead and spread its filtering both ways in time, half before the sound and half after.

On a sustained pad you can’t hear it. On a kick, the part of the low end the filter removes gets smeared forward into the silence before the hit. The steeper the slope and the lower the cutoff, the longer that smear, because low frequencies and sharp filters both take longer to ring.

We wrote prering_check.py to measure it. It builds a synthetic kick (a pitch drop from 160 Hz down to 50 Hz, a 300 ms decay and a 2 ms click) with a second of silence before it. Then it high-passes it at 30, 60 and 100 Hz with slopes of 12, 24 and 48 dB/oct, once as a normal minimum-phase filter and once as a linear-phase filter with the exact same curve. It reports how early the pre-ring rises above −60 dB relative to the peak, how loud it gets, and what happens to the kick’s peak.

#!/usr/bin/env python3
"""Linear-phase vs minimum-phase low cut on a kick: how much sound arrives before the hit?
  python3 prering_check.py
A synthetic kick (pitch drop 160 -> 50 Hz, 300 ms decay, 2 ms click) is high-passed at 30, 60 and 100 Hz
with Butterworth slopes of 12, 24 and 48 dB/oct. "Minimum phase" = the plain IIR filter (what a normal EQ
does). "Linear phase" = the exact same magnitude response with zero phase, built from the IIR's
frequency response (what a linear-phase EQ does, minus its fixed latency, which DAWs compensate).
Pre-ring = output before the kick starts. Reported: how far ahead it becomes audible-ish (first sample
above -60 dB re the output peak), its peak (dB re the output peak), and the change in the kick's sample peak.
Last block: the linear-phase 60 Hz / 48 dB result slowed to 0.7x by resampling (a slowed edit)."""
import numpy as np
from scipy.signal import butter, sosfilt, sosfreqz, resample_poly

SR, PAD = 48000, 48000                                  # 1 s of silence before the hit
def kick():
    t = np.arange(int(0.6 * SR)) / SR
    f = 50 + 110 * np.exp(-t / 0.03)                    # 160 Hz falling to 50 Hz
    body = np.sin(2 * np.pi * np.cumsum(f) / SR) * np.exp(-t / 0.3)
    click = np.random.default_rng(1).standard_normal(len(t)) * np.exp(-t / 0.002) * 0.3
    x = np.concatenate([np.zeros(PAD), body + click, np.zeros(SR)])
    return 0.5 * x / np.abs(x).max()
def minphase(x, fc, order): return sosfilt(butter(order, fc, "highpass", fs=SR, output="sos"), x)
def linphase(x, fc, order):
    n = len(x); _, H = sosfreqz(butter(order, fc, "highpass", fs=SR, output="sos"), worN=n // 2 + 1, whole=False)
    return np.fft.irfft(np.fft.rfft(x) * np.abs(H), n)  # same magnitude, zero phase (latency already removed)
def report(y, ref_peak, onset=PAD, sr=SR):
    pk = np.abs(y).max(); pre = np.abs(y[:onset])
    over = np.nonzero(pre > pk * 10 ** (-60 / 20))[0]
    ms = (onset - over[0]) / sr * 1000 if len(over) else 0.0
    pre_db = 20 * np.log10(max(pre.max(), 1e-12) / pk)
    return ms, pre_db, 20 * np.log10(pk / ref_peak)

def main():
    x = kick(); ref = np.abs(x).max()
    print("Synthetic kick, high-pass filter, 48 kHz")
    print(f"{'filter':>16}{'phase':>8}{'pre-ring starts':>17}{'pre-ring peak':>15}{'kick peak':>11}")
    for fc in (30, 60, 100):
        for order, slope in ((2, 12), (4, 24), (8, 48)):
            for name, fn in (("min", minphase), ("linear", linphase)):
                ms, pdb, dpk = report(fn(x, fc, order), ref)
                pre = f"{ms:6.1f} ms early" if ms else "      none"
                pdb_s = f"{pdb:8.1f} dB" if ms else "        --"
                print(f"{fc:>4} Hz {slope:>2} dB/oct{name:>8}{pre:>17}{pdb_s:>15}{dpk:>+8.2f} dB")
    y = linphase(x, 60, 8); ms, pdb, _ = report(y, ref)
    s = resample_poly(y, 10, 7)                         # play 0.7x: 10/7 as many samples at the same rate
    ms_s, pdb_s, _ = report(s, ref, onset=int(round(PAD * 10 / 7)))
    print(f"\nLinear-phase 60 Hz 48 dB/oct, then slowed to 0.7x: pre-ring {ms:.1f} ms -> {ms_s:.1f} ms early "
          f"(peak {pdb:.1f} -> {pdb_s:.1f} dB)")

if __name__ == "__main__": main()
$ python3 prering_check.py
Synthetic kick, high-pass filter, 48 kHz
          filter   phase  pre-ring starts  pre-ring peak  kick peak
  30 Hz 12 dB/oct     min             none             --   -0.36 dB
  30 Hz 12 dB/oct  linear    22.5 ms early       -27.0 dB   -0.37 dB
  30 Hz 24 dB/oct     min             none             --   -0.12 dB
  30 Hz 24 dB/oct  linear    35.9 ms early       -26.8 dB   -0.38 dB
  30 Hz 48 dB/oct     min             none             --   -0.56 dB
  30 Hz 48 dB/oct  linear    65.9 ms early       -26.3 dB   -0.40 dB
  60 Hz 12 dB/oct     min             none             --   -0.54 dB
  60 Hz 12 dB/oct  linear    11.6 ms early       -19.9 dB   -0.79 dB
  60 Hz 24 dB/oct     min             none             --   -0.75 dB
  60 Hz 24 dB/oct  linear    25.6 ms early       -20.1 dB   -0.61 dB
  60 Hz 48 dB/oct     min             none             --   -0.98 dB
  60 Hz 48 dB/oct  linear    41.6 ms early       -19.6 dB   -0.59 dB
 100 Hz 12 dB/oct     min             none             --   -2.19 dB
 100 Hz 12 dB/oct  linear    11.0 ms early       -13.7 dB   -1.62 dB
 100 Hz 24 dB/oct     min             none             --   -2.09 dB
 100 Hz 24 dB/oct  linear    19.1 ms early       -13.8 dB   -1.20 dB
 100 Hz 48 dB/oct     min             none             --   -2.38 dB
 100 Hz 48 dB/oct  linear    30.6 ms early       -15.2 dB   -0.72 dB

Linear-phase 60 Hz 48 dB/oct, then slowed to 0.7x: pre-ring 41.6 ms -> 59.5 ms early (peak -19.6 -> -18.5 dB)

Reading the numbers

Minimum phase never rings early. Every minimum-phase row says “none.” Nothing comes out before the kick starts, no matter how steep the filter.

Linear phase always does, and the steep low ones are long. At 30 Hz the pre-ring starts 22.5 ms early with a 12 dB/oct slope, 35.9 ms with 24 dB/oct and 65.9 ms with 48 dB/oct. At 30 Hz it stays around 26 to 27 dB under the kick peak, because there isn’t much kick energy that low to smear.

Higher cutoffs make it louder but shorter. At 60 Hz, 48 dB/oct, it starts 41.6 ms early and peaks at −19.6 dB. At 100 Hz, which takes a real bite out of this kick, it’s 30.6 ms early and up at −15.2 dB, or −13.7 dB with the 12 dB/oct slope. That’s a lot of low thump arriving before the hit.

The trade is real, though. Look at the kick peak column. At 100 Hz, 48 dB/oct, the minimum-phase filter drops the kick’s peak by 2.38 dB, the linear-phase one only 0.72. The phase shift of a normal filter changes the shape of the waveform, and that’s exactly what linear phase avoids. That’s why mastering engineers reach for it.

This is one synthetic kick in solo, so treat the numbers as a model. In a dense mix, the previous bar often hides the pre-ring. It’s most obvious on intros, breakdowns, sparse beats and anything where the kick lands after silence.

When to use which

How to check it in your session

  1. Solo the kick in a sparse part and flip the EQ’s phase mode. Listen just before the hit, not to the hit. If you hear a swell or a softer front edge in linear phase, switch back.
  2. Look at it. Bounce one kick with each mode and zoom in on the waveform. Any ripple in the silence before the transient is pre-ring.
  3. If you need linear phase, lower the resolution or the slope. Many linear-phase EQs have a low, medium or high setting. Lower resolution means a shorter filter and less pre-ring, at some cost to accuracy in the lows. Some EQs also have a “natural” or mixed phase mode in between.
  4. Ask whether the kick needs the cut at all. Often the low cut belongs on everything except the kick and bass. If the kick and 808 are fighting, that’s an arrangement call more than a filter, as your kick and 808 are arguing in the same chair lays out.

Slowed versions stretch it too

If you print a slowed edit from the master, say through ScrewAI, the pre-ring slows with everything else. The test file’s 60 Hz linear-phase pre-ring went from 41.6 ms to 59.5 ms early at 0.7x and drops lower in pitch along with the rest of the song. Fix the EQ on the master before you make the slowed version, rather than hoping it hides.

What is pre-ringing on a linear-phase EQ?
Sound that comes out before the original. A linear-phase filter spreads its work both ways in time, so part of what it removes shows up ahead of a transient. In our test, a 60 Hz, 48 dB/oct high-pass on a kick started ringing 41.6 ms early.
Should I use linear-phase EQ on a kick?
Usually not for a low cut. A minimum-phase filter with the same curve put nothing before the hit in our test, while linear phase put a swell up to 19.6 dB under the kick peak in front of it.
When is linear-phase EQ better?
When phase between parallel or multi-mic paths matters, and for gentle broad moves where pre-ring is short and quiet. It also keeps the waveform shape: at 100 Hz, 48 dB/oct, it lowered our kick’s peak by 0.72 dB vs 2.38 dB for minimum phase.
Does a steeper filter mean more pre-ring?
Yes, and so does a lower cutoff. At 30 Hz, linear-phase pre-ring started 22.5 ms early at 12 dB/oct and 65.9 ms early at 48 dB/oct.

A free one-pager

The checklist we run before every release.

Loudness, true peak, mono, tails, export settings and the metadata basics, on one page. Leave your email and it opens straight away, or read it here first. No email needed for that.