gpt4 book ai didi

delphi - 计算声级(以 dB 为单位)

转载 作者:行者123 更新时间:2023-12-03 15:19:52 29 4
gpt4 key购买 nike

我的数学一直不太好,所以我需要帮助如何将线性值转换为 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(线性级别)。所以我尝试创建它,但结果是 18,而不是 24(或 -24)dB。

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

如何计算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) )

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 = -1 的情况下,使用定律 a log(b) = log(b^a),我们甚至可以写出

dB = 20 * Log10(linearLevel / 32767).

关于delphi - 计算声级(以 dB 为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58832372/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com