Understanding loudness normalisation
LUFS, not just decibels.
Why peak-normalisation never made content actually-equal in loudness, and why every streaming service now uses LUFS.
Peak normalisation is the wrong tool.
The naive approach: find the loudest sample in the file, scale every sample so that peak hits some target (say -1 dBFS). Two podcasts processed this way can still sound dramatically different in apparent loudness — one might have many loud peaks across a quiet average, the other might be consistently loud. Peak says nothing about perceived loudness; the ear hears average energy over time, not the single highest amplitude.
LUFS is what the ear hears.
Loudness Units relative to Full Scale (LUFS, sometimes LKFS) measures perceived loudness using a frequency-weighting curve (humans hear midrange better than bass or treble) and an integration window. The result is a single number that approximates "how loud does this sound to a person". Two files at the same LUFS sound equally loud; that's the property peak-normalisation didn't have. The standard is EBU R128 (Europe) / ITU-R BS.1770 (international).
LUFS = frequency-weighted, time-integrated loudness
The streaming targets.
Every major streaming service normalises to a target LUFS. Spotify: -14 LUFS. Apple Music: -16 LUFS. YouTube: -14 LUFS. Amazon Music: -14 LUFS. Podcasts are conventionally -16 LUFS. Submit content louder than the target and the platform turns it down; quieter and (for some platforms) gets turned up. Mastering to the target is the modern norm; mastering to the highest possible peak ("the loudness war") is obsolete.
Three measurements.
The R128 standard defines three LUFS measurements. Integrated: average across the whole file. Short-term: average over a 3-second window, used for live monitoring. Momentary: average over a 0.4-second window, used for instant readout. For batch normalisation, integrated LUFS is the one that matters; live broadcast monitors all three.
A worked normalisation.
A podcast measured at -19 LUFS, target -16. Apply +3 dB of gain across the whole file; new integrated LUFS is -16. Check that the peak doesn't exceed the platform's allowed maximum (typically -1 dBTP) — if it does, apply a limiter to control the peaks without changing the overall loudness. FFmpeg's loudnorm filter does both in one pass: measure, gain, limit.
Single-pass loudnorm
ffmpeg -af loudnorm=I=-16:TP=-1.5:LRA=11
Filter measures and adjusts in one pass.
-19 LUFS in → +3 dB gain → -16 LUFS out, peak ≤ -1.5 dB
= Spotify-ready master
Two-pass for better accuracy.
Single-pass loudnorm makes the adjustment as it goes — fast, slightly imprecise. Two-pass first analyses the entire file, then encodes with the measured values baked in. The result hits the target LUFS more accurately, especially for files with widely varying loudness across their length. Slower (real-time-ish) but worth it for content you're submitting to a platform with strict requirements.
Dynamic range matters too.
LRA (loudness range) measures how much variation exists between quiet and loud sections. A podcast with 11 LRA has natural dynamics; a podcast over-compressed to 3 LRA is fatiguing to listen to. Modern normalisers expose an LRA target alongside the LUFS target — clamp the dynamic range while normalising the average. The right LRA for podcasts is 8-11; for music masters, 4-8 depending on genre; for film soundtracks, 15-20.