我正在尝试计算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
。因此dB值的公式将得到0.0dB
我无法从中获得正值,因为32768
只是最短的代表。
所以我现在的问题是如何才能获得+ 2dB的“正确”峰值?
答案 0 :(得分:1)
您的要求存在致命缺陷:模拟和数字系统中的削波定义是超出通道能够传输的最大振幅的信号。在任何一种情况下,一旦信号被剪切,恢复之前的所有信息为时已晚。
在数字系统的情况下,有两种可能的结果:要么信号饱和(在这种情况下你可能会看到一些峰值幅度的连续样本),要么签名的int包裹(在这种情况下非常大的正值)值变为非常大的负值,反之亦然)。
对事件后检测剪辑事件的主题。有许多方法是可能的: