Java,Matlab在Wav文件中读取数据,它有何不同?

时间:2014-10-05 11:22:23

标签: java matlab audio endianness

在Matlab看起来非常简单但是一旦我尝试使用java读取Wav文件,我得到的错误数据与Matalb相比

我知道Wav文件中的44字节地址,即实际数据

使用Matlab我只需输入

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

我说" 133,000"样品 这是样本号3000~3015的部分:

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

因为有2个通道,所以第二个通道在matlab中也会显示相同的值

但我尝试使用Java代码来读取数据,不同之处我知道WAV将数据保存为小端字节

通过这个片段,我决定要读取多少字节,然后将其读入byte []数组,并使用shortBuffer和byteBuffer使其像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,&#34;请注意,我不会以第一个样本为例,因为它是零

  

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

我花了很多时间试着找出那是什么? 我不知道!

1 个答案:

答案 0 :(得分:0)

每个样本的WAV格式通常为16位 - 这些详细信息位于标题值中,您显然无法解析!所以单个16位样本作为两个字节存储在文件中 - 因此需要获得正确的字节顺序。我首先定义一个常量,比如在浮点0.6中,然后使用两种语言将其转换为16位的整数。通过再次转换回浮动来确认它的工作原理,以确保您获得原始的0.6浮动。一旦掌握了,这方面的练习就会非常有启发性。