阅读wav文件java vs matlab

Rad*_*dek 4 java matlab javasound

我试图在java和matlab中读取.wav文件的数据并保存为字节数组.

在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;
    }
Run Code Online (Sandbox Code Playgroud)

在matlab中我使用的是wavread函数:

[Y, FS] = wavread('sound.wav', 'native');
Run Code Online (Sandbox Code Playgroud)

但我得到的结果是不同的.

在java中前20个字节:

53, 0, 19, 0, -71, -1, -80, -1, -99, -1, 10, 0, 87, 0, -69, -1, 123, -1, -77, -1
Run Code Online (Sandbox Code Playgroud)

在matlab中:

53, 19, -71, -80, -99, 10, 87, -69, -133, -77, 38, 143, 13, -100, 39, 45, -52, -83, -82, 56
Run Code Online (Sandbox Code Playgroud)

为什么java中的每个第二个字节都是0或-1,在matlab中没有?即使我跳过0和-1的java在java中有123为matlab有-133?它为什么不同?

Jon*_*oni 5

Java正在为您返回16位带符号的PCM数据.由于每个样本为16位且一个字节保存8位,因此每个样本在Java中跨越两个字节.Matlab返回的是直接16位样本的数组.

基本上,数据是相同的.它在内存中的布局不同.

要以更简单的方式从Java访问示例,您可以执行一些按位算术,如下所示:

int firstSample = (abAudioData[0]&0xFF) | (abAudioData[1]<<8);
Run Code Online (Sandbox Code Playgroud)

读取样本的另一种方法是使用java.nio缓冲区:

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

int firstSample = sb.get();
Run Code Online (Sandbox Code Playgroud)