Hi Klaus,

I can never resist these things!   Faust makes it too enjoyable :-)

I made a pass, but there is a small scaling error.  I think it can be fixed
by reducing boostFreqHz until the sine_test is nailed.
The highpass is close (and not a source of the scale error), but I'm using
Butterworth instead of whatever they used.
I glossed over the discussion of "gating" in the spec, and may have missed
something important there, but
I simply tried to make a sliding rectangular window, instead of 75%
overlap, etc.

If useful, let me know and I'll propose it for analyzers.lib!

Cheers,
Julius

import("stdfaust.lib");

// Highpass:
// At 48 kHz, this is the right highpass filter (maybe a Bessel or Thiran
filter?):
A48kHz = ( /* 1.0, */ -1.99004745483398, 0.99007225036621);
B48kHz = (1.0, -2.0, 1.0);
highpass48kHz = fi.iir(B48kHz,A48kHz);
highpass = fi.highpass(2, 40); // Butterworth highpass: roll-off is a
little too sharp

// High Shelf:
boostDB = 4;
boostFreqHz = 1430; // a little too high - they should give us this!
highshelf = fi.high_shelf(boostDB, boostFreqHz); // Looks very close, but 1
kHz gain has to be nailed

kfilter = highshelf : highpass;

// Power sum:
Tg = 0.4; // spec calls for 75% overlap of successive rectangular windows -
we're overlapping MUCH more (sliding window)
zi = an.ms_envelope_rect(Tg); // mean square: average power = energy/Tg =
integral of squared signal / Tg

// Gain vector Gv = (GL,GR,GC,GLs,GRs):
N = 5;
Gv = (1, 1, 1, 1.41, 1.41); // left GL(-30deg), right GR (30), center
GC(0), left surround GLs(-110), right surr. GRs(110)
G(i) = *(ba.take(i+1,Gv));
Lk(i) = kfilter : zi : G(i); // one channel, before summing and before
taking dB and offsetting
LkDB(i) = Lk(i) : 10 * log10 : -(0.691); // Use this for a mono input signal

// Five-channel surround input:
Lk5 = par(i,5,Lk(i)) :> 10 * log10 : -(0.691);

// sine_test = os.oscrs(1000); // should give –3.01 LKFS, with GL=GR=GC=1
(0dB) and GLs=GRs=1.41 (~1.5 dB)
sine_test = os.osc(1000);

process = sine_test : LkDB(0); // should read -3.01 LKFS - high-shelf gain
at 1 kHz is critical
// process = 0,sine_test,0,0,0 : Lk5; // should read -3.01 LKFS for left,
center, and right
// Highpass test: process = 1-1' <: highpass, highpass48kHz; // fft in
Octave
// High shelf test: process = 1-1' : highshelf; // fft in Octave

On Sat, Jul 3, 2021 at 1:08 AM Klaus Scheuermann <kla...@posteo.de> wrote:

> Hello everyone :)
>
> Would someone be up for helping me implement an LUFS loudness analyser
> in faust?
>
> Or has someone done it already?
>
> LUFS (aka LKFS) is becoming more and more the standard for loudness
> measurement in the audio industry. Youtube, Spotify and broadcast
> stations use the concept to normalize loudness. A very positive side
> effect is, that loudness-wars are basically over.
>
> I looked into it, but my programming skills clearly don't match
> the level for implementing this.
>
> Here is some resource about the topic:
>
> https://en.wikipedia.org/wiki/LKFS
>
> Specifications (in Annex 1):
>
> https://www.itu.int/dms_pubrec/itu-r/rec/bs/R-REC-BS.1770-3-201208-S!!PDF-E.pdf
>
> An implementation by 'klangfreund' in JUCE / C:
> https://github.com/klangfreund/LUFSMeter
>
> There is also a free LUFS Meter in JS / Reaper by Geraint Luff.
> (The code can be seen in reaper, but I don't know if I should paste it
> here.)
>
> Please let me know if you are up for it!
>
> Take care,
> Klaus
>
>
> _______________________________________________
> Faudiostream-users mailing list
> Faudiostream-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/faudiostream-users
>


-- 
"Anybody who knows all about nothing knows everything" -- Leonard Susskind
_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to