2012-02-08 129 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