2012-04-24 58 views
0

我正在撰寫關於和絃檢測的論文。在努力奮鬥之後,我發現我的問題的根源在於使用基於C#的程序獲取wav文件的振幅。從WAV文件中檢索幅度數組,不返回完整數據

我用這個代碼檢索振幅:

public WavProcessing(String fileNameWithPath) 
     { 
      _fileNameWithPath = fileNameWithPath; 

     } 
public void Initialization() 
     { 
      AssignWaveHeaderData(); 
      streamBuffer = File.ReadAllBytes(_fileNameWithPath); 
      fftBufferSize = 16384; 
      fftBufferSize2 = fftBufferSize/2; 

     } 
private void getAmplitude() 
     { 
      waveData = new short[numOfSamples]; 
      var xsample = new short[numOfSamples]; 
      var x = 0; 
      var str = ""; 

      for (var i = 44 ; i <= waveData.Length; i = i + 2) //44 because the wave data   starts at 44th byte. 
      { 
       waveData[x] = BitConverter.ToInt16(streamBuffer,i); 
       x++; 

      } 

    } 

代碼在第一工作正常,我與這也是一個和絃檢測程序基於Delphi的程序進行了比較。但是我沒有注意到的是,我的代碼實際上只是檢索了振幅的一半數組。

例如:我打開一個和絃C wav文件到我的C#程序時,我得到了振幅這樣

[0] -279 
[1] -262 
[2] -231 
[3] -216 
[4] -199 
[5] -185 
[6] -178 
[7] -186 
[8] -217 
[9] -237 
[10] -267 
[11] -298 
[12] -319 
[13] -348 
[14] -374 
[15] -373 
[16] -376 
[17] -366 
[18] -357 
[19] -340 
[20] -319 
[21] -312 
[22] -300 
[23] -301 
[24] -308 
[25] -321 
[26] -339 
... 
[361042] 1950 
[361043] 0 
[361044] 0 
... 
[722128] 0 

你可以看到,在啓動361043-RD數組,它只返回零數組...它是大約只有全流大小的一半(其中722128)

與此同時,在某人的德爾福計劃(我用這個作爲我的參考),其代碼如下:

procedure TForm1.openfilewave(NamaFile : string); 
var 
    Stream : TFileStream; 
    i, start, endwave : Integer; 
begin 
    Application.ProcessMessages; 
    Stream := TFileStream.Create(FileName, fmOpenRead); 
    FillChar(wavehdr, SizeOf(wavehdr), 0); 
    Stream.Read(wavehdr, SizeOf(wavehdr)); 

    SetLength(wavedata[0].Data, Round(wavehdr.chunkSize/wavehdr.BytesPerSample)); 

    for i := 0 to High(wavedata[0].Data) do 
      begin 
      Stream.Read(wavedata[0].Data[i], 2); 
      end; 
    end; 

返回振幅的全陣列(相同的wav文件),如:

0 -- -279 
1 -- -262 
2 -- -231 
3 -- -216 
4 -- -199 
5 -- -185 
6 -- -178 
7 -- -186 
8 -- -217 
9 -- -237 
10 -- -267 
11 -- -298 
12 -- -319 
13 -- -348 
14 -- -374 
15 -- -373 
16 -- -376 
17 -- -366 
18 -- -357 
19 -- -340 
20 -- -319 
... 
361042 -- 1950 
361043 -- 1819  << not returning zero value 
361044 -- 1655 
361045 -- 1476 
... 
722100 -- 165 
722101 -- 142 
722102 -- 117 
722103 -- 91 
722104 -- 68 
722105 -- 37 
722106 -- 11 
722107 -- -6 
722108 -- -27 
722109 -- -36 
722110 -- 0 
722111 -- 0 
... 
722128 -- 0 
在於Delphi的程序

,振幅的全陣列被返回,從而爲下一個的計算正確的值。

+0

您沒有在C#版本中顯示任何*閱讀*代碼。什麼是'streamBuffer',你是如何填充它的? – 2012-04-24 06:35:41

+0

好吧,讓我編輯它 – 2012-04-24 07:00:44

+0

那裏,我用File.ReadAllBytes。對不起,我錯過了。 :) – 2012-04-24 07:03:00

回答

1

這就是問題所在:

for (var i = 44; i <= waveData.Length; i = i + 2) 
{ 
    waveData[x] = BitConverter.ToInt16(streamBuffer,i); 
    x++; 
} 

waveDatastreamBuffer一半大小 - 你應該使用:

for (var i = 44; i < streamBuffer.Length; i = i + 2) 

或許簡化事情有點像這樣,只使用一個變量:

for (int x = 0; x < waveData.Length; x++) 
{ 
    waveData[x] = BitConverter.ToInt16(streamBuffer, x * 2 + 44); 
} 
+0

非常感謝!我沒有注意到它.... – 2012-04-24 09:53:35