R128GAIN: An EBU R128 compliant loudness scanner |
R128GAIN: An EBU R128 compliant loudness scanner |
Jan 5 2011, 19:38
Post
#1
|
|
![]() Group: Members Posts: 395 Joined: 13-June 10 Member No.: 81467 |
I've just uploaded on sourceforge a first version of r128gain, an EBU R128 (http://tech.ebu.ch/loudness) compliant loudness scanner:
http://sourceforge.net/projects/r128gain/files/
|
|
|
|
![]() |
Jan 5 2011, 23:23
Post
#2
|
|
|
Group: Developer Posts: 618 Joined: 6-December 08 From: Erlangen Germany Member No.: 64012 |
Wow, thank you so much for this tool! I was already mentally preparing myself to have to write my own R128 scanner, but here it is! And in version 0.2, it already does all I need.
Having said that... When I pass a file path with spaces and without "enclosing quotes", or a file which doesn't exist, it prints an assert and crashes. Other than that, it seems to analyze as expected, but I have some questions after looking at the source code.
Thanks again for your work! Chris -------------------- If I don't reply to your reply, it means I agree with you.
|
|
|
|
Jan 6 2011, 00:46
Post
#3
|
|
![]() Group: Members Posts: 395 Joined: 13-June 10 Member No.: 81467 |
Wow, thank you so much for this tool! I was already mentally preparing myself to have to write my own R128 scanner, but here it is! And in version 0.2, it already does all I need. Thanks When I pass a file path with spaces and without "enclosing quotes", or a file which doesn't exist, it prints an assert and crashes. The scanner is heavily based on SoX (http://sox.sourceforge.net/). This is SoX philosophy: use assert() in production code, i.e. if a pre-condition isn't fulfilled just die.
48 kHz is due to BS 1770 because they define filter coefficients for that sample rate only. R-REC-BS.1770-1-200709-I!!PDF-E.pdf states: QUOTE These filter coefficients are for a sampling rate of 48 kHz. Implementations at other sampling rates will require different coefficient values, which should be chosen to provide the same frequency response that the specified filter provides at 48 kHz. The values of these coefficients may need to be quantized due to the internal precision of the available hardware. Tests have shown that the performance of the algorithm is not sensitive to small variations in these coefficients. It is not obvious for me how to quantize the given coefficients with respect to other sample frequencies, hence I decided to re-sample to 48 kHz On the other hand R-REC-BS.1770-1-200709-I!!PDF-E.pdf states regarding true peak determination: QUOTE
The current version of R128GAIN combines all this in order to avoid multiple passes:
The way I understand R128 is: Pass 1: analyze entire file/album, compute loudness taking into account the absolute gate of -70 LUFS. Pass 2: analyze entire file/album again, this time also taking into account the relative loudness gate derived from the result of pass 1. Is that how you implemented it? tech3341.pdf states: QUOTE
R128GAIN interprets this as follows:
|
|
|
|
Jan 6 2011, 15:23
Post
#4
|
|
|
Group: Developer Posts: 618 Joined: 6-December 08 From: Erlangen Germany Member No.: 64012 |
It is not obvious for me how to quantize the given coefficients with respect to other sample frequencies, hence I decided to re-sample to 48 kHz For 44.1 kHz, I resampled the 48-kHz filter impulse responses and tried to find new coefficients which match the given transfer function. Here is what I got: RLB: numerator = [1 -2 1], denominator = [1 -1.9891 0.98913], accurate to ~0.02 dB above 50 Hz Pre: numerator = [1.535 -2.633 1.151], denominator = [1 -1.647 0.701], accurate to ~0.05 dB, will tune it a bit more soon QUOTE R128GAIN interprets this as follows:
Sorry, but I don't think that's correct. Look at Tech doc 3341, Annex 1. I think the 8 LU is relative to the entire file/album (summation in equation 7, the Jg are the set of 400-ms gating blocks). Chris This post has been edited by C.R.Helmrich: Jan 6 2011, 15:35 -------------------- If I don't reply to your reply, it means I agree with you.
|
|
|
|
Jan 6 2011, 16:03
Post
#5
|
|
![]() Group: Members Posts: 395 Joined: 13-June 10 Member No.: 81467 |
QUOTE R128GAIN interprets this as follows:
Sorry, but I don't think that's correct. Look at Tech doc 3341, Annex 1. I think the 8 LU is relative to the entire file/album (summation in equation 7). What R128GAIN does is the following (in principle):
Hopefully EBU Tech Doc 3343 ‘Practical Guidelines for Production and Implementation in accordance with EBU R 128’will clarify this, if published some day. |
|
|
|
Jan 7 2011, 21:34
Post
#6
|
|
|
Group: Members Posts: 698 Joined: 6-March 10 Member No.: 78779 |
What R128GAIN does is the following (in principle):
I agree with C.R.H. that this interpretation doesn't seem to follow Tech 3341, Annex 1.
I think it would be simpler to work with block indices (a list, array, or bitmap) than a ring buffer.* Read the input stream two times block by block and skip the calculated indices. Usually, with the buffering left to the OS, you should be reading the second pass from memory automatically. PS The wording in Annex 1 could be better. Especially the "gated loudness" LKG in (6) and (8) should use different symbols. But mathematically it is not ambiguous. It took me over an hour to crunch the whole thing, though. * Of course, you can still use something as a ring buffer for I/O. But I would put a block-wise abstraction layer on top of it to make the overall design simpler. This post has been edited by googlebot: Jan 7 2011, 22:14 |
|
|
|
Jan 7 2011, 22:17
Post
#7
|
|
![]() Group: Members Posts: 395 Joined: 13-June 10 Member No.: 81467 |
I agree with C.R.H. that this interpretation doesn't seem to follow Tech 3341, Annex 1. Probably you're both are right, I have to think about it. What I have in mind (probably not correct) is the following:
What do you mean by "loudness of a set of blocks"? Doesn't it imply to count samples more than once? It seems to me that what I've implemented is the limit of what you get if you let go the overlap to 100%. If this is true than it would be fully compliant because they require 50% at a minimum. This post has been edited by pbelkner: Jan 7 2011, 22:21 |
|
|
|
pbelkner R128GAIN: An EBU R128 compliant loudness scanner Jan 5 2011, 19:38
googlebot Didn't try the tool, yet, but had a look at th... Jan 5 2011, 20:13
pbelkner QUOTE (googlebot @ Jan 5 2011, 21:13) Did... Jan 5 2011, 21:32
googlebot QUOTE (pbelkner @ Jan 7 2011, 22:17) It s... Jan 7 2011, 22:35
pbelkner QUOTE (googlebot @ Jan 7 2011, 23:35) PS ... Jan 7 2011, 23:21
C.R.Helmrich QUOTE (pbelkner @ Jan 8 2011, 00:21) Many... Jan 8 2011, 14:29
pbelkner QUOTE (C.R.Helmrich @ Jan 8 2011, 15:29) ... Jan 10 2011, 17:38
pbelkner QUOTE (pbelkner @ Jan 10 2011, 18:38) The... Jan 10 2011, 18:01
C.R.Helmrich Exactly, and if you pull out the "/n" in... Jan 10 2011, 18:20
Fandango On a completely other note... What about patents? ... Jan 6 2011, 01:53
mudlord QUOTE (Fandango @ Jan 5 2011, 18:53) On a... Jan 6 2011, 13:22
cpchan QUOTE (mudlord @ Jan 6 2011, 08:22) The o... Jan 6 2011, 13:44
mudlord QUOTE (cpchan @ Jan 6 2011, 07:44) QUOTE ... Jan 6 2011, 13:46
Notat Congratulations on this!
I know that BS.1770 ... Jan 6 2011, 02:37
mudlord What is the license for the tool? Jan 6 2011, 03:42
A_Man_Eating_Duck i can't for the life of me get this app to jus... Jan 6 2011, 08:14
pbelkner QUOTE (A_Man_Eating_Duck @ Jan 6 2011, 09... Jan 6 2011, 09:34
pbelkner QUOTE (Fandango @ Jan 6 2011, 02:53) On a... Jan 6 2011, 09:19
mudlord QUOTE (pbelkner @ Jan 6 2011, 02:19) It... Jan 6 2011, 13:20
pbelkner QUOTE (mudlord @ Jan 6 2011, 14:20) QUOTE... Jan 6 2011, 15:26
Soap QUOTE (pbelkner @ Jan 6 2011, 09:26) Both... Jan 6 2011, 15:53
cpchan QUOTE (Soap @ Jan 6 2011, 10:53) ffmepg i... Jan 6 2011, 16:09
pbelkner QUOTE (Soap @ Jan 6 2011, 16:53) QUOTE (p... Jan 6 2011, 16:13
Soap QUOTE (pbelkner @ Jan 6 2011, 10:13) QUOT... Jan 6 2011, 16:21
pbelkner QUOTE (Soap @ Jan 6 2011, 17:21) QUOTE (p... Jan 6 2011, 16:49
saratoga QUOTE (pbelkner @ Jan 6 2011, 10:49) QUOT... Jan 6 2011, 18:37
cpchan QUOTE (saratoga @ Jan 6 2011, 13:37) That... Jan 7 2011, 01:39
Zao Note that "use" in mudlord's post is... Jan 6 2011, 13:29
cpchan QUOTE (Zao @ Jan 6 2011, 08:29) If you ev... Jan 6 2011, 13:48
Zao QUOTE (cpchan @ Jan 6 2011, 13:48) QUOTE ... Jan 6 2011, 13:52
cpchan QUOTE (Zao @ Jan 6 2011, 08:52) If more k... Jan 6 2011, 13:59
Zao Even if the end artifact is a program, this preven... Jan 6 2011, 13:47
cpchan QUOTE (Zao @ Jan 6 2011, 08:47) Even if t... Jan 6 2011, 13:52
Zao QUOTE (cpchan @ Jan 6 2011, 13:52) What i... Jan 6 2011, 13:54
Zao If a developer uses a library with one of the usua... Jan 6 2011, 14:02
cpchan QUOTE (Zao @ Jan 6 2011, 09:02) If a deve... Jan 6 2011, 14:14
lvqcl Please remember that QUOTE (pbelkner @ Jan 6 ... Jan 6 2011, 14:10
Zao You cannot always dynamically link to a library, a... Jan 6 2011, 14:16
cpchan QUOTE (Zao @ Jan 6 2011, 09:16) You canno... Jan 6 2011, 14:33
mudlord QUOTE (cpchan @ Jan 6 2011, 08:33) QUOTE ... Jan 7 2011, 07:19
googlebot QUOTE (mudlord @ Jan 7 2011, 07:19)To avo... Jan 7 2011, 10:46
2Bdecided QUOTE (googlebot @ Jan 7 2011, 09:46) No ... Jan 7 2011, 17:45
GHammer Seven of 38 posts on software licensing.
Geesh... Jan 7 2011, 04:39
mudlord QUOTE (GHammer @ Jan 6 2011, 21:39) Seven... Jan 7 2011, 07:14
romor Bad talk. You are free to see his posts if you wan... Jan 7 2011, 15:57
Soap forget it. Jan 7 2011, 16:43
staale Hi,
Just wanted to add that we've released ou... Jan 7 2011, 17:08
googlebot Forget this, too. Else the joke doesn't work o... Jan 7 2011, 17:02
jangk Hello,
back to audio issues again.
Thank you pbel... Jan 7 2011, 17:27
pbelkner QUOTE (jangk @ Jan 7 2011, 18:27) Am I mi... Jan 7 2011, 18:13
jangk QUOTE (pbelkner @ Jan 7 2011, 18:13) QUOT... Jan 7 2011, 19:13
pbelkner QUOTE (jangk @ Jan 7 2011, 20:13) Anyhow,... Jan 7 2011, 19:56
mudlord QUOTE How about you program your own lib or shut u... Jan 7 2011, 18:57
jdoering Please pardon the noob here; hopefully I'm kee... Jan 8 2011, 00:28
googlebot Completely agree! One doesn't really have ... Jan 8 2011, 01:51
pbelkner QUOTE (jdoering @ Jan 8 2011, 01:28) But ... Jan 8 2011, 09:32
Notat I have it on good authority that the calculation c... Jan 8 2011, 18:42
googlebot A fully standard compliant single-pass outline is ... Jan 8 2011, 19:40
pbelkner v0.3 released
I've just uploaded the new vers... Jan 9 2011, 18:47
googlebot QUOTE (pbelkner @ Jan 9 2011, 18:47) CODE... Jan 12 2011, 20:26
pbelkner QUOTE (googlebot @ Jan 12 2011, 21:26) QU... Jan 13 2011, 10:26
googlebot Works perfectly, great job! Even for multichan... Jan 10 2011, 09:58
googlebot Just out of curiosity, where does that 0.4 come fr... Jan 10 2011, 18:35
jdoering QUOTE (googlebot @ Jan 10 2011, 09:35) Ju... Jan 10 2011, 19:27
googlebot Duh. My bad! Jan 10 2011, 21:40
Fandango I have a proposal.
New standard tag fields:
EBU_... Jan 11 2011, 23:14
Notat QUOTE (Fandango @ Jan 11 2011, 15:14) Wit... Jan 12 2011, 04:11
Fandango QUOTE (Notat @ Jan 12 2011, 04:11) QUOTE ... Jan 13 2011, 16:21
pbelkner QUOTE (Fandango @ Jan 13 2011, 17:21) But... Jan 13 2011, 17:01

2Bdecided QUOTE (pbelkner @ Jan 13 2011, 16:01) EBU... Jan 13 2011, 17:24
2Bdecided QUOTE (Fandango @ Jan 13 2011, 15:21) Mos... Jan 13 2011, 17:20
Fandango PS: I'd say that using GAIN in your prefix is ... Jan 12 2011, 02:02
jdoering I had been hoping that the written tags were being... Jan 12 2011, 06:40
pbelkner QUOTE (jdoering @ Jan 12 2011, 07:40) I h... Jan 12 2011, 10:21
jdoering QUOTE (pbelkner @ Jan 12 2011, 01:21) QUO... Jan 12 2011, 21:24
pbelkner QUOTE (jdoering @ Jan 12 2011, 22:24) I t... Jan 13 2011, 11:01
jdoering Just compared r128gain output versus ReplayGain fo... Jan 12 2011, 10:18
googlebot I think you both have a valid point.
I also think... Jan 12 2011, 12:58
pbelkner QUOTE (googlebot @ Jan 12 2011, 13:58) =... Jan 12 2011, 13:14

C.R.Helmrich QUOTE (pbelkner @ Jan 12 2011, 14:14) QUO... Jan 12 2011, 18:27


Notat QUOTE (C.R.Helmrich @ Jan 12 2011, 10:27)... Jan 13 2011, 02:57


jdoering QUOTE (Notat @ Jan 12 2011, 17:57) QUOTE ... Jan 13 2011, 06:21


C.R.Helmrich QUOTE (jdoering @ Jan 13 2011, 07:21) I... Jan 13 2011, 10:25


pbelkner QUOTE (C.R.Helmrich @ Jan 13 2011, 11:25)... Jan 13 2011, 10:37

2Bdecided QUOTE (pbelkner @ Jan 12 2011, 12:14) QUO... Jan 13 2011, 11:23

Notat QUOTE (2Bdecided @ Jan 13 2011, 03:23) Yo... Jan 13 2011, 15:41
pbelkner QUOTE (googlebot @ Jan 12 2011, 13:58) PS... Jan 12 2011, 17:07
googlebot How large are the expected differences? Is there a... Jan 12 2011, 18:46
C.R.Helmrich True. I guess for the averaging we should leave ou... Jan 12 2011, 19:00
Raiden What is so special about pink noise? How does pink... Jan 13 2011, 11:44
googlebot Pink noise has equal energy over all octaves. It... Jan 13 2011, 12:02
jangk Thank you Notat for the link to AES "Loudness... Jan 13 2011, 13:57
benski I'm with David.
I think we should verify the ... Jan 13 2011, 17:27
Fandango So if the old tags are used, how do I know whether... Jan 13 2011, 18:22![]() ![]() |
|
Lo-Fi Version | Time is now: 21st May 2013 - 13:54 |