首页 > 解决方案 > 以 dB 为单位的声级计算

问题描述

我的数学从来都不好,所以我需要帮助如何将线性值转换为 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。

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

如何计算分贝?

标签: delphimathaudio

解决方案


如果

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) )

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).

推荐阅读