【问题标题】:How to convert a float between -1.0 and +1.0 to dB(A) of sound pressure? [duplicate]如何将 -1.0 和 +1.0 之间的浮点数转换为 dB(A) 声压? [复制]
【发布时间】:2016-02-22 05:10:17
【问题描述】:

使用

WaveFileReader wfr = new WaveFileReader(file); 
float[] d = wfr.ReadNextSampleFrame();

我得到一个浮点数组d。当使用foreach (float s in d) 迭代d 时,我得到-1.0 和+1.0 之间的浮点数。如何将它们转换为声压 dB(A)?

编辑:我使用double db = 20 * Math.Log10(Math.Abs(s));解决了它

【问题讨论】:

  • 您希望看到什么值 - 什么范围,什么格式?
  • @B.ClayShannon 我期望值从 -144.0 到 0。
  • 声压dB(A)?
  • @AlexanderTorstling 是的。
  • @B.ClayShannon 你的说法毫无意义。

标签: c# audio floating-point naudio decibel


【解决方案1】:

dBA 标度是相对气压的量度。

在这种情况下,我们谈论的是一种音频再现系统,该系统在其输入端进行采样,并具有某种类型的设备来产生声压波。

假设系统是linear system,则整个系统将有一个增益值,这取决于电气和物理设计特性。

Output = Gain * input

为了计算任何给定输入的声压值,您需要进行实验以测量给定输入值的系统输出压力。

考虑到采样值在 DAC 的输出端变成输出电压,并且系统的输出功率与声压成正比:

(1) V=IR(2) P = IV,稍微重新排列我们发现P=V*V/R

因此,功率随电压(或样本值)的平方而变化。

分贝值是一种相对测量:

Sdb = 10*log10(S/Sref)

Sref 参考测量点在哪里。

由于我们在输入和输出之间存在幂关系,我们得到

Sdb = 10*log10(S*S/Sref) == 20*log10(S/Sref)

现在,dBA 也恰好是频率加权标度,因此您需要将here 描述的过滤器应用于样本以获得真正准确的值。

【讨论】:

    【解决方案2】:

    对此没有答案。

    对于完全静音(深空或完全真空),声压级可能为 0,但负值没有意义。

    【讨论】:

    • 我建议您对 dB 标度进行一些研究。负值是合法的。
    • 另一方面,人们可能会发现完美真空中的空气压力为 0 帕斯卡
    • @PeterM 我建议你对声压进行一些研究,这就是问题所在。
    猜你喜欢
    • 2020-03-15
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2016-03-17
    相关资源
    最近更新 更多