如何使用C#从Wav数据中查找峰值

时间:2017-08-02 17:02:39

标签: c# algorithm wav

我有来自(16bit,44100hz,2个频道)wav文件的Byte []数组数据,

string WavFile = @"C:\Users\test.wav";
            WaveReader wr = new WaveReader(File.OpenRead(WavFile));
            IntPtr format = wr.ReadFormat();
            byte[] input = wr.ReadData();

我想使用

生成如下的浮动峰值
  

-0.00445556640625,0.010162353515625,-0.0069580078125,0.00408935546875,-0.00604248046875,0.003143310546875,-0.001953125,0.00140380859375,-0.00189208984375

这是linux中的峰值生成器示例。

https://github.com/benallfree/wavesurfer-peakbuilder

请建议如何计算峰值

谢谢

1 个答案:

答案 0 :(得分:1)

对于要生成的每个条形,条形的高度应与该条形的时间间隔中字节的RMS(均方根)值成比例。

因此,如果轨道是44.00kHz的4:00,则每个通道上的4 * 60 * 44.1 * 1e3 = 10584000个样本。如果你想要100个柱,那么每个通道的每个通道10584000/100 = 105840个样本。

您需要知道wave文件中的字节顺序。通常情况下,这个频道是一个小尾数。因此,取对应于样本的2个字节并组装它们。 (像(input[1] << 8) | input[0]之类的东西。)你应该得到两个整数数组,每个数组10584000个样本。然后从维基百科中获取RMS公式,并将其应用于105840个样本的块,以生成100个数字,表示条形的高度(在每个通道上)。

PCM样本的包装格式(另见http://www.neurophys.wisc.edu/auditory/riff-format.txt

                                Sample 1

             Channel 0    Channel 0   Channel 1    Channel 1
              (left)       (left)      (right)      (right)
             low-order   high-order   low-order   high-order
               byte         byte         byte        byte


                    Data Packing for 16-Bit Stereo PCM