c# - 检测音频文件中的小峰值

标签 c# audio

我正在尝试计算 16 位 wav 文件的最大分贝峰值。在我目前的情况下,我不需要 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 处有一个峰值。 .峰值 var 的值现在是 32768 .所以dB值的公式会让我得到0.0dB .
我无法从中得到正值,因为 32768只是可以代表的最大短路。

所以我现在的问题是如何获得+2dB的“正确”峰值?

最佳答案

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

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

以事件后检测削波事件为主题。有多种方法是可能的:

  • 在最大和最小样本值处寻找样本的连续运行
  • 寻找样本之间信号幅度的大不连续性。真实信号一般不会有大的幅度差异 sample-sample
  • 对信号进行频域分析。削波引入了在频谱图中很明显的高频分量
  • 关于c# - 检测音频文件中的小峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22086281/

    相关文章:

    c# - Sin 和 Cos 在 C 和 C# 中的不同结果

    c# - 在哪里放置代码以将用户重定向回页面直到谓词为真?

    c# - 我可以在 C# 中读取 Outlook (2003/2007) PST 文件吗?

    c# - 尝试将具体对象转换为通用接口(interface)时出现“InvalidCastException”

    javascript - 使用 JavaScript 循环音频

    Java同时播放多个Clip

    c# - Visual Studio 单元测试生成错误

    java - 构建期间复制到 Java 资源目录时 Maven 损坏了 WAV 文件

    python - 一个频率的简单 Pygame 音频

    ios - iOS 中检查音频是否已结束播放