2014-10-05 80 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