2014-10-05 81 views
1

在Matlab的看起來很很容易,但一旦我用java讀取的Wav文件試試我的MatalbJava,Matlab讀取Wav文件中的數據,它有何不同?

我知道,從WAV文件44個字節的地址,也就是實際的數據

相比得到錯誤的數據而在Matlab我只需鍵入這個

[nData] = wavread("DoorBell.wav",'native') 

,我必須說 「133000」 樣品 這是樣本數3000〜3015部分:

6743 5754 4200 2396 654 -1253 -3141 -4393 -5063 -5062 -4139 -2891 -1588 -193 482 

因爲有2通道中的第二通道出現過在MATLAB具有相同價值觀

但一個我試圖用Java代碼來讀取數據,它不同於我知道,WAV將數據保存到小尾數字節

通過這個片段我決定我有多少字節讀取,然後讀入byte []數組,並使用shortBuffer和字節緩衝區,使它象INT16樣品

dataBuffer = new byte[getDataBytes(subChunk2Size)]; 

     //get the actual data 
     randAccess.seek(44); 
     randAccess.read(dataBuffer); 
     System.out.println(dataBuffer.length); 

private static short[] bytesToShort(byte[] bytes) 
{ 
    short[] tempArr = new short[bytes.length/2]; 
    ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).asShortBuffer().get(tempArr); 
    return tempArr; 
} 
short[] samples = bytesToShort(dataBuffer); 

for (int i = 0; i < samples.length; i++) { 
      out.println(samples[i]); 
     } 

這裏的樣品從3000到3015,「請注意,我不拿第一採樣作爲例子,因爲它是零

22298 31254 26640 23561 -29182 7163 -17421 -10258 14828 15084 -10769 -18956 -13063 16383 -7679

我花了很多時間試圖找出那是什麼? 我不知道!

+0

如果您知道WAV以little-endian格式保存數據,爲什麼您在代碼中使用了'BIG_ENDIAN'? – 2014-10-05 11:43:27

+0

十六進制中的6743是0x1a57。十六進制中的22298是0x571a。嗯... – jaket 2014-10-05 11:48:19

+0

@LukeWoodward 你是對的,這似乎是我的錯,我認爲使用BIG_ENDIAN會將Little轉換成大,謝謝,我做到了! 但是,在這裏還有一個問題,不,我有一個數組與所有示例,嘗試將其寫入文件,但在文件中,我沒有所有示例,即使我循環陣列打印所有示例文件 – 2014-10-05 20:41:02

回答

0

WAV格式通常是每個採樣16位 - 這些細節在標題值中,你顯然不解析!所以一個16位樣本作爲兩個字節存儲在文件中 - 因此需要使您的字節序正確。我將首先定義一個常量,比如在浮點數0.6中,然後用這兩種語言將它轉換爲你的16位單數整數。通過再次轉換回浮動確認它的工作原理,以確保您獲得原始0.6浮動。一旦掌握,這一方面的鍛鍊我會非常有啓發性。

+0

我做過了,我知道我的特定文件位數是int16,並且我開始從數據開始的地址44字節讀取實際數據 – 2014-10-05 19:23:15