Delphi 以dB为单位的声级计算
我的数学从来都不好,所以我需要帮助如何将线性值转换为dB 首先,我向您展示如何从-24dB计算线性值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 我的问题是:转换
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).