2017-08-02 59 views
-2

我有字节[]从(16位,44100hz,2个信道)的wav文件阵列数据,如何找到的Wav数据峰值使用C#

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中的xample。

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

请建议如何计算峰值

谢谢

回答

1

对于要生成的每个酒吧,酒吧的高度应该是成正比的RMS(均方根方)该栏的时间间隔中的字节值。

所以如果轨道是44.1kHz的4:00,那么每个通道上的样本就是4 * 60 * 44.1 * 1e3 = 10584000。如果你想要100条,那么每个通道每条10584000/100 = 105840个样本。

您需要知道波形文件中的字节顺序。通常这是通道交错的小端。因此,取对应于一个采样的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 
+0

会是怎样的**时间间隔**?赛道的持续时间?你能否请添加任何示例计算。 –

+0

@MohammedYasinShaik查看我的编辑... – Nick

+0

很好的解释,同时我发现了另一个链接,可以创建每44100像素的组/批量,并从批处理中获得最大值。 https://stackoverflow.com/questions/13629277/analyzing-wav-and-drawing-a-graph –