Hi Julius, Hm, I think the averaging time should not matter with continuous sine tones coming in, right? (According to specs, 0.4 is the value for ‘momentary’ and 3 for ’short term’.)
Some questions about your test-program: 1. how does this help if we need reference sine tones from another source? I did a series of test tones in Reaper, all normalised to -18lufs. Here ist the test-audio: https://cloud.4ohm.de/s/c7ynWemXS9eXibH 2. at 1000Hz and levels above -45db, the lufs readout seems plausible. Below -45dbfs, the meter falls to -69lufs. I don’t understand. 3. probably just some coding style, but does amp = 10^(level/20); equals amp = level : ba.db2linear; ? 4. with amp = level : ba.db2linear; meter drops to -69lufs below -40dbfs at 1000Hz… Thanks for investigating with me :) Klaus Klaus Scheuermann kla...@posteo.de +491716565511 @schlunk:matrix.org 4ohm.de trummerschlunk.de > On 11. May 2022, at 04:50, Julius Smith <julius.sm...@gmail.com> wrote: > > Hi Klaus, > > Could the averaging time be too small? I'm worried about the line > > Tg = 0.4; // 3 second window for 'short-term' measurement > > The comment seems to indicate it should be "Tg = 3;", i.e., 3 seconds of > averaging instead of 0.4 s. > > Below is an expansion of your test program that allows for more exploration. > > Cheers, > Julius > > import("stdfaust.lib"); > > freq = hslider("[0] Test Sine Frequency (Hz) [unit:Hz]",1000,30,16000,1); > level = hslider("[1] Test Sine Level (dBFS) [unit:dBFS]",-10,-80,0,0.1); > avg = hslider("[2] Averaging Time (s) [unit:sec]",3,0.01,10,0.1); > > amp = 10^(level/20); > testSignal = amp * os.osc(freq); > > process = testSignal <: _,_ : lk2 : vbargraph("[3] LUFS S",-40,0) : *(1e-7); > > //Tg = 0.4; // 3 second window for 'short-term' measurement > Tg = avg; > zi = an.ms_envelope_rect(Tg); // mean square: average power = energy/Tg = > integral of squared signal / Tg > kfilter = fi.highpass(1, 60) : fi.high_shelf(4, 1800); > > // 2-channel > lk2 = par(i,2,kfilter : zi) :> 10 * log10(max(ma.EPSILON)) : -(0.691); > > > On Tue, May 10, 2022 at 7:00 AM Klaus Scheuermann <kla...@posteo.de > <mailto:kla...@posteo.de>> wrote: > Hi Julius, > > this is, of course, the way to go. > > I did some test with a series of sines, each at -18lufs, and found these > filter settings to be quite close (except for the 30Hz): > kfilter = fi.highpass(1, 60) : fi.high_shelf(4, 1800); > > Hz lufs > 30 -16.693 > 60 -18.111 > 80 -18.204 > 100 -18.211 > 130 -18.177 > 180 -18.133 > 250 -18.113 > 300 -18.099 > 400 -18.099 > 600 -18.169 > 1000 -18.405 > 2000 -18.241 > 3000 -17.894 > 4000 -17.784 > 6000 -17.503 > 8000 -18.083 > 10000 -18.026 > 12000 -18.035 > 14000 -17.784 > 16000 -18.083 > > What I don't quite understand is why the values read a little different, > every time I do the test with same filter settings and same sines. (I am on > faustide.grame.fr <http://faustide.grame.fr/>). > > For my application, this should work fine. Out of curiosity, why do I > approximate the filters? So that it works on all samplerates? > > Full test code is this: > import("stdfaust.lib"); > > process = _,_ : lk2 : vbargraph("LUFS S",-40,0); > > Tg = 0.4; // 3 second window for 'short-term' measurement > zi = an.ms_envelope_rect(Tg); // mean square: average power = energy/Tg = > integral of squared signal / Tg > kfilter = fi.highpass(1, 60) : fi.high_shelf(4, 1800); > > > // 2-channel > lk2 = par(i,2,kfilter : zi) :> 10 * log10(max(ma.EPSILON)) : -(0.691); > > Thanks!! > Klaus > > > > > On Sun, 2022-05-08 at 13:17 -0700, Julius Smith wrote: >> Hi Klaus, >> >> To go after this, it would be useful to measure the discrepancy for >> some number of sinusoidal frequencies across the audio band, with at >> least one example including both single-channel and multichannel >> input. >> Based on the filter approximations used, I would predict a measurable >> discrepancy around 1 kHz (guessed transition-frequency tuning), and >> very high frequencies (due to bilinear transform frequency-warping). >> >> The high-frequency discrepancy should go away with oversampling, even 2x. >> >> Glad to hear noise is looking good! >> >> - Julius >> >> On Sat, Jul 3, 2021 at 1:08 AM Klaus Scheuermann <kla...@posteo.de >> <mailto: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 <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 >>> >>> <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 >>> <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 >>> <mailto:Faudiostream-users@lists.sourceforge.net> >>> https://lists.sourceforge.net/lists/listinfo/faudiostream-users >>> <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