Loudness research: measurement, automatic balance and true peaks
Separating ITU/EBU measurement from SignalExchange’s original musical gain-control policy.
Technical research · edition 2 · reviewed 2026-10-24

Prismal Labs native editor capture, illustrating the corresponding software project. View full-size image
What we found
The loudness research separated measurement from control policy. A BS.1770 reading can be correct while an automatic mixer still chases rests, overreacts to transients or overspends its power budget. We therefore treated source qualification, fixed/manual contributions, weighted allocation and gain movement as independent design decisions.
The reusable finding is a normalized power allocator with explicit silence and crest history. It feeds a separate final audio-path meter/limiter. Discovering a Child over the control bus does not route that Child's audio through the Master or prove anything about the final sum.
Allocate the remaining power, not a separate target per track
Every 100 ms, the owning Master reads at most 64 fixed-size snapshots. A source is active when its
400 ms K-weighted Momentary Loudness is at least the configurable Activity Threshold (-55 LUFS
by default) and its heartbeat is current. Fixed
manual or bypassed rows consume measured post-gain power first. For the remaining automatic
channel weights b_i in dB, define w_i = 10^(b_i/10), W = sum(w_i), and let T_rem and
C_rem be the target-loudness and peak-power budgets left after fixed rows. For each active
automatic channel:
With every weight at 0 dB, this reduces to -10 log10(N). A positive weight moves power toward a
featured source and away from its peers; normalization by W means the predicted aggregate target
does not rise. A single active source is unchanged by its absolute weight. Active manual overrides
are measured after their fixed gain and consume that power first; automatic channels share only the
remaining target and peak budgets. The stored weight of a manual channel takes effect again only
when that channel returns to automatic mode.
The desired result is clamped to -24 dB and the configurable Maximum Boost (+12 dB by default).
Boost waits 1.2 seconds of activity and moves at the selected Response rate; normal cuts move at
max(12 dB/s, 4 x Response), and a predicted ceiling violation cuts immediately. Each Child
publishes a fast activity flag from its unsmoothed block RMS,
so a gap enters hold without waiting for the 400 ms loudness window to decay. Once open, the loudness
detector closes 3 LU below its opening threshold and holds the current gain for the configurable
Silence Hold (0.8 s by default) whenever the fast signal is absent or the lower threshold is
crossed. This keeps rests and decaying notes from
causing rapid target redistribution or gain chasing, while sustained inactivity still returns the
channel toward unity. A manual row gesture opts that Child out. This is intentionally slow gain
riding rather than transient compression, preserving instrument attacks and reducing audible pumping.
That original control law remains available as Live Ride. The optional Stable Level law is
intended for mixed instrumental inputs whose event-to-event dynamics should remain intact. It
derives the same weighted target from a configurable 2-30 second smoothed source-level estimate (8 seconds by default) rather than directly
from each 400 ms reading, retains learned sources in the allocation while they rest, and holds
changes inside the configurable Stable Deadband (1 dB by default). It fills one complete selected
window before ordinary correction and caps that correction at the configurable Stable Speed
(0.5 dB/s by default). Crest history is held for at least that same window and a
recurring crest within 0.5 dB refreshes the hold, preventing gain recovery from following the spaces
between transients. Only a real instantaneous ceiling violation bypasses the slow rate. A
deterministic three-source drum/synth/guitar test compares cumulative trim movement against Live
Ride and verifies that learned trims remain unchanged through a five-second rest. A separate
5.3-second sparse-crest loop regression verifies stable trim inside a 20-second window.
Evidence: SignalExchange/AUTO_BALANCE_RESEARCH.md.
A worked allocation example
For three active automatic sources with weights 0, 0 and +3 dB, the linear weights are approximately 1, 1 and 1.995, so W≈3.995 and 10*log10(W)≈6.015 dB. With a remaining target of −20 LUFS, their allocated targets are about −26.015, −26.015 and −23.015 LUFS. The featured source gets a larger share without raising the predicted total power budget.
With one source, its own weight cancels in b_i-10*log10(10^(b_i/10)), so changing that absolute weight does not raise the group's target. Manual rows consume measured post-gain power before automatic allocation. These are power-budget calculations; actual correlated audio summing, downstream effects and peak reconstruction still require measurement on the real output.
Measure the audio that actually reaches the output
Every Child applies the BS.1770 K-weighting response to its pre-gain stereo input and accumulates energy in an exact 400 ms sliding rectangular window. The resulting Momentary value is published to the Master. There is no loudness gate on this measurement; Activity Threshold is a product control gate used only to decide whether automatic gain should act.
Independently, the Master measures its post-limiter mono/stereo programme output. It maintains ungated 400 ms and 3 s windows, constructs Integrated gating blocks every 100 ms, and samples LRA at 10 Hz. Constant-memory 0.01 LU histograms retain counts and exact power sums, allowing every live Integrated update to recalculate the relative gate without audio-thread allocation. Pausing excludes audio from I/LRA and programme maxima while current M/S remain live. Reset clears I, LRA, maximum M/S, and maximum true peak simultaneously in either transport state.
This is an audio-path measurement, not a reconstruction from Child measurements. The shared bus
carries pre-trim measurement summaries and control commands only; it does not carry sample audio
and cannot represent unregistered tracks, downstream processing, summing, or final-bus gain. A
conforming programme reading therefore requires Master to be inserted on the actual main output or
measured group. Active Child rows alongside -inf EBU readings mean the control path is alive while
the Master audio input is silent or unrouted.
The Master limiter sidechain reconstructs inter-sample peaks with a fixed 49-tap polyphase FIR:
- 4x below 96 kHz;
- 2x from 96 kHz to below 192 kHz;
- native sample rate at 192 kHz and above.
It uses a stereo-linked 5 ms lookahead and a final PCM sample clamp. This safety stage is designed to respect the selected production ceiling. It is not advertised as a certified delivery limiter.
Evidence: SignalExchange/CONFORMANCE.md.
What the independent fixtures established
When the private test fixtures are installed, CTest registers two optional runners.
| Runner | Covered EBU Tech 3341 cases | Acceptance used | Current result |
|---|---|---|---|
SignalExchangeEbuLoudnessConformance | Integrated 1-5, 7, 8; Short-term 1, 2, 9, all case 10 alignments, all case 11 live levels; Momentary 1, 2, 12, all case 13 alignments, all case 14 live levels; LRA 1-6 | ±0.1 LU loudness; ±1 LU LRA | Pass |
SignalExchangeEbuTruePeakConformance | 15-23 | expected value +0.2/-0.4 dB | Pass |
The local archive used to establish this evidence was 91,631,421 bytes with SHA-256:
The official material is copyrighted by the EBU, used for technical testing only, excluded by
Git, and not distributed with SignalExchange. The runners are registered only when the expected
files exist under build/test-fixtures/ebu/files.
A second processor-level concert simulation runs eight real Children for 28 seconds with different
spectra and input levels, changing three-/seven-/two-source ensembles, a 200 ms musical rest, a
four-second rest, irregular 64–1024-sample blocks, a persistent ambient-noise channel, and a clipped
stereo transient. Its current deterministic result settles at -19.56 LUFS, leaves the noise-only
channel unboosted, preserves gain through the short rest, returns the long-resting channel to unity,
and measures no more than the selected -6 dBFS output true-peak ceiling.
The host-lifecycle regression suspends and reactivates both processor types, proving that the Child's
Momentary history and the Master's delayed audio cannot cross that boundary. A separate global
allocator audit warms all lazy paths and then observes 2,000 Child-to-Master process() callback
pairs with zero C++ heap allocations.
Evidence: SignalExchange/CONFORMANCE.md.
Applying the findings
Use slow, qualified boosts and a separate immediate attenuation path for a real ceiling violation. Test silence with both a slow loudness window and a fast activity indicator so the controller does not boost a decaying window after the musician has stopped. Hold crest history across sparse repeats to avoid recovering gain between transients.
Compare Live Ride and a learned Stable Level policy on the same multi-source schedule. Measure cumulative trim movement, rests, entrances and manual handoffs, not merely the final loudness. Then route the actual summed audio through the final meter and true-peak stage. IPC connectivity and a sample-peak ceiling cannot substitute for that final path.
Limits and open questions
The −20 LUFS working mix target is not the EBU −23 LUFS full-program delivery reference. The allocation law is product-specific, and applicable fixture passes do not constitute product certification or universal broadcast acceptance. Private EBU test audio is not redistributed. Host routing and native output measurements remain separate evidence from deterministic processor tests.
Research illustrations

Prismal Labs native editor capture, illustrating the corresponding software project. View full-size image
Primary references
- ITU-R BS.1770-5: loudness and true-peak measurement
- EBU Tech 3341: EBU Mode metering
- EBU R 128: loudness normalization
Research provenance
The methods and results above are drawn from these retained research records. Dates and product versions inside the article identify the scope of each experiment; publication review does not mean the hardware or numerical tests were rerun.
SignalExchange/AUTO_BALANCE_RESEARCH.md— SHA-2564357e8bc83791e7f74eb46adb62a2da769396eb99498ee53f85ec66fa7ad6deaSignalExchange/CONFORMANCE.md— SHA-256a26114e7fa54bd1df1c776f94ee72710e70b940a71cb5b64e3d549aa014381e9
