Skip to content

dBFS calculation issue, perhaps. #2

Open
@scott-lc

Description

@scott-lc

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 is 1/sqrt(2), multiplying rms(signal) by sqrt(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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions