6 comments

[ 2.8 ms ] story [ 30.2 ms ] thread
Nice. EBUR128 is a great loudness standard. To my ears it feels the best mixing audio when you take into account the flexibility of your maximum true peak while maintaining an average (I go for -14 lufs).
This is, so far, an excellent write up. The motivation section is great, it’s clear, acknowledges that the C version is probably fine and simply states the authors wanted to gain more insights into the process of porting C code. If the rest of this series is half as good as this instalment, I’m eager and excited to read it. A real breath of fresh air. Thank you.
Would newer standards use the Mel scale instead?
I don't think EBU R128 is ancient, or anything. The units are LUFS, which is basically dB with an offset. I'm not an expert here, but I know the loudness measurement is perceptual. I ported existing EBU R128 code to Swift to measure loudness a while back, and I recall there was at least one filtering stage to account for quirks in human hearing.
The Mel scale attempts to describe how humans perceive frequency difference at different frequencies. When using a mel-scaled filterbank this determines the position of each filter on the frequency axis. Which is closer to logarithmic than linear. Mel-scale is commonly used in spectrograms when doing machine learning on audio. Common alternatives would be the Bark scale, 1/3 octave filters, or Gammatone filters.

The spacing of filters is not the most critical in a loudness calculation though, but instead what loudness weight to have at the different frequencies. In EBU R128 the k-weighted curve is used. This is very smooth across frequencies. So if one were to implemented this in spectrogram (time-frequency) domain with a filterbank, one could do a decent job in any of the above mentioned frequency scales. If a standard would recommend something like that, I think 1/3 octave bands would be chosen, because it is standardized in IEC 61260. Whereas Mel scale is not standardized by any formal body (that I know).

But I believe the k-weighted in EMU R128 is is most commonly implemented by in the time-domain, which means that there is no need to have a filterbank with discrete frequency resolution.