检测音频文件中的小峰值

Posted

技术标签:

【中文标题】检测音频文件中的小峰值【英文标题】:Detect small Peaks in Audio file 【发布时间】: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 的绝对峰值。 【参考方案1】:

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

在数字系统的情况下,有两种可能的结果:信号饱和(在这种情况下,您可能会在峰值幅度处看到许多连续样本)或有符号整数回绕(在这种情况下非常大的正值变成非常大的负值,反之亦然)。

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

在最大和最小样本值处寻找样本的连续运行 寻找样本之间信号幅度的大不连续性。真实信号样本间的幅度差异往往不大 对信号执行频域分析。削波会引入在频谱图中很明显的高频分量

【讨论】:

以上是关于检测音频文件中的小峰值的主要内容,如果未能解决你的问题,请参考以下文章

检测音频文件中的低频音

使用 C# 检测 WAV 文件中的音频静音

如何使用 Sox 检测音频文件中的响亮声音?

检测原始音频 (PCM) 中的特定频率/音调

如何检测 SUSE Linux 系统中的音频可用性

如何使用 Javascript 从按钮值中选择音频文件