2012-02-08 112 views
4

我想讀取.wav文件的數據在java和matlab中,並保存爲一個字節數組。閱讀wav文件java vs matlab

在Java代碼如下:

public byte[] readWav2(File file) throws UnsupportedAudioFileException, IOException { 

    AudioFormat audioFormat; 

    AudioInputStream inputAIS = AudioSystem.getAudioInputStream(file); 
    audioFormat = inputAIS.getFormat(); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    // Read the audio data into a memory buffer. 
    int nBufferSize = BUFFER_LENGTH * audioFormat.getFrameSize(); 


     byte[] abBuffer = new byte[nBufferSize]; 
     while (true) { 

      int nBytesRead = inputAIS.read(abBuffer); 

      if (nBytesRead == -1) { 
       break; 
      } 
      baos.write(abBuffer, 0, nBytesRead); 
     } 

     byte[] abAudioData = baos.toByteArray(); 


     return abAudioData; 
    } 

在MATLAB我用wavread功能:

[Y, FS] = wavread('sound.wav', 'native'); 

但我得到的結果是不同的。

在java中前20個字節:

53, 0, 19, 0, -71, -1, -80, -1, -99, -1, 10, 0, 87, 0, -69, -1, 123, -1, -77, -1 

在MATLAB:

53, 19, -71, -80, -99, 10, 87, -69, -133, -77, 38, 143, 13, -100, 39, 45, -52, -83, -82, 56 

爲什麼在Java每第二個字節是0或-1,其中在MATLAB沒有?即使我跳過0和-1的地方在Java中有123的matlab有-133?爲什麼不同?

+0

文件是立體聲嗎?您可以在此[媒體頁面](http://pscode.org/media/#sound)處獲得有關「leftright.wav」的結果?爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2012-02-08 16:28:48

+0

nope該文件是單聲道的 – Radek 2012-02-08 16:34:30

回答

5

Java正在向您返回16位帶符號的PCM數據。由於每個採樣是16位,一個字節可以保存8位,因此每個採樣在Java中跨越兩個字節。 Matlab返回的是直接的16位採樣數組。

基本上,數據是一樣的。它只是在記憶中以不同的方式佈置。

要訪問樣本從Java你可以做一些位運算更簡單的方法,如:

int firstSample = (abAudioData[0]&0xFF) | (abAudioData[1]<<8); 

另一種方式來讀取樣品與java.nio的緩衝區:

ByteBuffer bb = ByteBuffer.wrap(abAudioData); 
bb.order(ByteOrder.LITTLE_ENDIAN); 
ShortBuffer sb = bb.asShortBuffer(); 

int firstSample = sb.get(); 
+0

這是獲得與matlab代碼相同的結果 - 完美。但現在我需要將這些數據轉換爲FFT數據的雙精度數組。如何做到這一點,因爲字節存儲爲短? – Radek 2012-02-08 17:28:08

+1

我認爲你需要一個老式的循環,你通過每個'short'並將它們轉換爲'double' ... – Joni 2012-02-08 17:35:34

+0

但是,如果你將字節轉換爲double,你將得不到與當你轉換字節時相同的結果作爲短的雙倍 – Radek 2012-02-08 23:41:01