我从不擅长数学,所以我需要帮助如何将线性值转换为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?
答案 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
,我们可能无法判断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 log(b) = log(b^a)
情况下使用法律a = -1
,我们甚至可以写作
dB = 20 * Log10(linearLevel / 32767).