【问题标题】:Reading a wav file java vs matlab读取 wav 文件 java vs matlab
【发布时间】:2012-02-08 16:02:54
【问题描述】:

我正在尝试在 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;
    }

在 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?为什么不一样?

【问题讨论】:

  • 文件是立体的吗?在此media page 上可用的leftright.wav 得到什么结果?为了尽快获得更好的帮助,请发帖SSCCE

标签: java matlab javasound


【解决方案1】:

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();

【讨论】:

  • 得到与 matlab 代码相同的结果 - 完美。但现在我需要转换这些数据,将其存储为双精度数组以进行 FFT 处理。由于字节存储为短字节,如何做到这一点?
  • 我认为您需要一个老式循环,在其中遍历每个 short 并将它们转换为 double...
  • 但是如果你将字节转换为双精度,你将不会得到与将保存为短字节的字节转换为双精度时相同的结果
  • 不,你当然不知道。对于 FFT,您希望将每个 16 位样本(Java 中:short)转换为 double
猜你喜欢
  • 2011-07-09
  • 2013-05-30
  • 1970-01-01
  • 2014-11-29
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 2011-03-18
相关资源
最近更新 更多