以dB为单位的声级计算

时间:2019-11-13 07:40:59

标签: delphi math audio

我从不擅长数学,所以我需要帮助如何将线性值转换为dB。

首先,我向您展示如何从-24dB计算线性值。

var dB, linearLevel: integer;
begin
dB := -24;
linearLevel := Round( 1/exp( 2.30258509299 * (abs(dB)/20) ) *32767);
end;

1/exp( 2.30258509299 * (abs(-24)/20) ) ;是归一化值。

要转换为样本值,请使用1/exp(...)*32767

我的问题在这里:转换回来

有人告诉我要使用公式20*log10(linearLevel)。所以我尝试创建它,但结果是18 dB,而不是24(或-24)dB。

linearValue := 2067; // the result of the formula above    
db := round( exp( 20*2.30258509299*(linearLevel / 32767) ) );

如何计算dB?

1 个答案:

答案 0 :(得分:10)

如果

linearLevel := Round( 1/exp( 2.30258509299 * (abs(dB)/20) ) * 32767);

由于四舍五入,我们丢失了信息(在数学语言中,Round函数不是 injective )。因此,给定一个linearLevel值,就不可能找回原始的dB值。因此,让我们考虑

linearLevel := 1/exp( 2.30258509299 * (abs(dB)/20) ) * 32767;

相反。这意味着

linearLevel / 32767 := 1/exp( 2.30258509299 * (abs(dB)/20) )

32767 / linearLevel := exp( 2.30258509299 * (abs(dB)/20) )

ln(32767 / linearLevel) := 2.30258509299 * (abs(dB)/20)

ln(32767 / linearLevel) / 2.30258509299 := abs(dB)/20

20 * ln(32767 / linearLevel) / 2.30258509299 := abs(dB).

在这里,我们再次遇到问题,因为绝对值函数不是内射的。如果abs(dB)7,我们可能无法判断dB7还是-7

但是,如果我们假设dB是非正数,那么我们终于有了

dB = -20 * ln(32767 / linearLevel) / 2.30258509299.

简化

由于2.30258509299ln(10),因此是

dB = -20 * ln(32767 / linearLevel) / ln(10).

但是log10(x) = ln(x) / ln(10),所以我们可以写

dB = -20 * Log10(32767 / linearLevel)

Log10单元中找到Math函数的位置。

此外,在a log(b) = log(b^a)情况下使用法律a = -1,我们甚至可以写作

dB = 20 * Log10(linearLevel / 32767).