【发布时间】:2014-02-28 04:35:02
【问题描述】:
我正在尝试计算 16 位 wav 文件的最大声音峰值(以 dB 为单位)。在我目前的情况下,我不需要 RMS 值。只是文件中最响亮的峰值的 dB 值,因为一项要求是检测其中有错误的 wav 文件。例如,最响亮的峰值位于+2dB。
我在这个帖子中尝试过:get peak out of wave
这是我的代码:
var streamBuffer = File.ReadAllBytes(@"C:\peakTest.wav");
double peak = 0;
for (var i = 44; i < streamBuffer.Length; i = i + 2)
{
var sample = BitConverter.ToInt16(streamBuffer, i);
if (sample > peak)
peak = sample;
else if (sample < -peak)
peak = -sample;
}
var db = 20 * Math.Log10(peak / short.MaxValue);
我手动修改了这个文件,所以在+2dB 有一个峰值。峰值变量的值现在是32768。所以分贝值的公式会让我得到0.0dB。
我无法从中得到正值,因为 32768 只是可以表示的最大短。
所以我现在的问题是如何获得 +2dB 的“正确”峰值?
【问题讨论】:
-
32768 刚好在
short的游侠之外,它的值可以从 -32768 到 32767。也就是说,只需在计算分贝的行设置一个断点,然后查看值peak变量。是您期望的值吗? -
第一个:除非你使用浮点数,否则不可能超过 0dB,第二个:你的算法是错误的,初始“峰值”值应该是第一个样本,第三个你的 if 块很傻,第四个你不仅要获得一个样本块的 RMS。
-
好吧,我尝试了上面链接中的代码......但是你能给我一个提示,然后请告诉我如何正确地做吗?我想检测文件中是否存在过载,为此我需要可以大于 0dB 的绝对峰值。