delphi - 以 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) ) );
如何计算分贝?
解决方案
如果
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
,我们不可能判断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).
推荐阅读
- java - 如何在 REST GET 请求中指定空值的最佳实践
- java - 将 Matchers.eq() 与其他模拟值一起使用时出现 InvalidUseOfMatchersException
- python - Tensorflow 2 API:不推荐使用名称 tf.get_default_graph。请改用 tf.compat.v1.get_default_graph
- python - 如何在烧瓶服务器中提供 vueJS cli 应用程序
- c# - 使用 ASP.NET WebAPI C# 获取 AD 组在 Windows Server 2016 Datacenter 上不起作用
- terraform - 错误:数据 helm 存储库未按预期工作
- c# - ASP.NET Core 在 _Layout.cshtml 中使用类数据
- python-3.x - pdfkit [WinError 740] 请求的操作需要提升python3
- hadoop - Apache Hive - 执行后挂钩
- php - 我如何才能得到这种雄辩的关系呢?