2017-08-02 58 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 –