Description
It has been decades since I was in a signal processing class, so I am certainly not a subject matter expert. As such, I am opening this issue more out of curiosity as to your opinion on the specification.
Referring to your dBFS
calculation here, I see this computation used in a myriad of other projects:
dbfs_value = 20 * Math.log10(rms(signal))
However, you do not "offset" the dBFS calculation by +3dB
as described here:
value_dBFS = 20*log10(rms(signal) * sqrt(2))
= 20*log10(rms(signal)) + 3.0103
The explanation for the offset given here seems fairly compelling:
The reason for the
sqrt(2)
is that the definition of dBFS is explicitly designed such that the dBFS value of a full-scale sine wave equals 0. Since the RMS of the full-scale sine wave is1/sqrt(2)
, multiplyingrms(signal)
bysqrt(2)
ensures that the formula evaluates to 0 when signal is a full-scale sine wave.
There even seems to be some confusion about this in the industry, listing a few DAWs that differ on their calculation of 0 dBFS
.
Searching through GitHub, I did find one project that uses this 3dB
normalization factor:
// Normalised RMS - this value is normalised to a 997 Hz Sine Wave at 0dbFS
// More info: https://en.wikipedia.org/wiki/DBFS
const normalisationFactor = 3.01
const RMSPowerDecibels =
20 * Math.log10(Math.sqrt(sumOfSquares / waveFormValue.length)) + normalisationFactor
I would appreciate hearing your thoughts on this. Thanks.