我正在撰寫關於和絃檢測的論文。在努力奮鬥之後,我發現我的問題的根源在於使用基於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的程序
,振幅的全陣列被返回,從而爲下一個的計算正確的值。
您沒有在C#版本中顯示任何*閱讀*代碼。什麼是'streamBuffer',你是如何填充它的? – 2012-04-24 06:35:41
好吧,讓我編輯它 – 2012-04-24 07:00:44
那裏,我用File.ReadAllBytes。對不起,我錯過了。 :) – 2012-04-24 07:03:00