检测音频文件中的小峰值

时间:2014-02-28 04:35:02

标签: c# audio

我正在尝试计算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的“正确”峰值?

1 个答案:

答案 0 :(得分:1)

您的要求存在致命缺陷:模拟和数字系统中的削波定义是超出通道能够传输的最大振幅的信号。在任何一种情况下,一旦信号被剪切,恢复之前的所有信息为时已晚。

在数字系统的情况下,有两种可能的结果:要么信号饱和(在这种情况下你可能会看到一些峰值幅度的连续样本),要么签名的int包裹(在这种情况下非常大的正值)值变为非常大的负值,反之亦然)。

对事件后检测剪辑事件的主题。有许多方法是可能的:

  • 查看最大和最小样本值的连续样本运行
  • 查找样本之间信号幅度的大不连续性。实际信号不具有大幅度差异样本样本
  • 对信号执行频域分析。剪切引入了在频谱图中显而易见的高频分量