我正在尝试计算 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 能够传送的最大幅度的信号。在任何一种情况下,一旦信号被削波,就为时已晚,无法恢复之前包含的所有信息。
在数字系统的情况下,有两种可能的结果:信号饱和(在这种情况下,您可能会在峰值幅度处看到许多连续样本)或有符号整数回绕(在这种情况下,非常大的正值变得非常大的负数,反之亦然)。
以事件后检测削波事件为主题。有多种方法是可能的:
关于c# - 检测音频文件中的小峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22086281/