2015-11-19 112 views
-1

使用如何将-1.0和+1.0之间的浮点数转换为声压dB(A)?

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

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

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

+0

你期望看到什么值 - 什么范围,以什么格式? –

+0

@ B.ClayShannon我期望值从-144.0到0. – Zurechtweiser

+0

dB(A)的声压? –

回答

-1

没有答案。

对于总沉默(深空或全真空),声压级可能为0,但负值无效。

+1

我建议你做一些关于dB尺度的研究。负值是合法的。 –

+1

另一方面,人们可能会发现完美真空中的空气压力为* 0帕斯卡*。 – marko

+0

@PeterM我建议你做一些关于声压问题的研究。 – Gustav

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)

现在,分贝也恰好是一个频率加权的规模,所以你需要应用过滤器描述here到样本以获得真正准确的值。