Delphi 以dB为单位的声级计算

Delphi 以dB为单位的声级计算,delphi,math,audio,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 我的问题是:转换

我的数学从来都不好,所以我需要帮助如何将线性值转换为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而不是24(或-24)分贝

如何计算dB?

如果

linearLevel := Round( 1/exp( 2.30258509299 * (abs(dB)/20) ) * 32767);
由于舍入,我们丢失了信息(在数学语言中,
Round
函数不是内射函数)。因此,给定一个
linearLevel
值,就不可能恢复原始
dB
值。因此,让我们考虑一下

linearLevel := 1/exp( 2.30258509299 * (abs(dB)/20) ) * 32767;
相反。这意味着

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

这里我们又遇到了一个问题,因为绝对值函数不是内射函数。如果
abs(dB)
7
,我们不可能判断
dB
7
还是
-7

但是如果我们假设
dB
是非正的,我们最终得到

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

因为
2.30258509299
ln(10)
,所以这是

dB = -20 * ln(32767 / linearLevel) / ln(10).
但是
log10(x)=ln(x)/ln(10)
,所以我们可以编写

dB = -20 * Log10(32767 / linearLevel)
其中
Log10
函数位于
Math
单元中

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

dB = 20 * Log10(linearLevel / 32767).

非常感谢。计算的过程帮助我理解了它是如何工作的。我希望有一天我会用这个数学。@JohnyBony:很高兴我能帮上忙。我现在看到,您已经将
dB
声明为一个整数,因此需要添加一个最后的
Round
使其生效:
dB=Round(-20…
。只需对数字
2.30258509299
进行注释。它是
Ln(10)的近似值
,用于将自然对数转换为基于10的
log
。我不懂对数,我没有关于学校的主题。我创建的数字。事实上:log(X)=ln(X)/ln(10)。更一般地说,logN(X)=ln(X)/ln(N)。因此在本例中,
ln(32767/linearLevel)/2.30258509299
可以简化为
Log10(32767/linearLevel)
Log10
函数可在
数学
单元中找到。
20 * ln(32767 / linearLevel) / 2.30258509299 := abs(dB).
dB = -20 * ln(32767 / linearLevel) / 2.30258509299.
dB = -20 * ln(32767 / linearLevel) / ln(10).
dB = -20 * Log10(32767 / linearLevel)
dB = 20 * Log10(linearLevel / 32767).