【问题标题】:Java , Matlab reading Data in Wav File , How it differs?Java,Matlab 读取 Wav 文件中的数据,有何不同?
【发布时间】:2014-11-29 21:08:11
【问题描述】:

在 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 将数据保存到小端字节中

通过这个 sn-p 我决定我必须读取多少字节,然后将其读入 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 的样本,“请注意,我不以第一个样本为例,因为它是零

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

我花了很多时间试图弄清楚那是什么? 我不知道!

【问题讨论】:

  • 如果您知道 WAV 以 little-endian 格式保存数据,那您为什么在代码中使用 BIG_ENDIAN
  • 6743(十六进制)是 0x1a57。十六进制的 22298 是 0x571a。嗯……
  • @LukeWoodward 你说得对,看来是我的错,我认为使用 BIG_ENDIAN 会将 Little 转换为 big ,谢谢,我做到了!但是这里还有一个问题,不,我有一个包含所有样本的数组,尝试将其写入文件,但是在文件中我没有所有样本,即使我循环遍历数组以将所有样本打印到文件
  • @AhmedAdel:如果您还有其他问题要问,请单独提出问题。

标签: java matlab audio endianness


【解决方案1】:

WAV 格式通常是每个样本 16 位 - 这些细节在您显然没有解析的标头值中!因此单个 16 位样本以两个字节的形式存储在文件中 - 因此需要让您的字节序正确。我将首先定义一个常量,例如浮点 0.6,然后使用两种语言将其转换为 16 位单数整数。通过再次转换回浮点数来确认它是否有效,以确保您获得原始的 0.6 浮点数。一旦掌握了,这方面的练习我就很有启发了。

【讨论】:

  • 我做到了,我知道我的每个样本的特定文件位是 int16,我开始从数据开始的地址 44 字节读取实际数据
猜你喜欢
  • 1970-01-01
  • 2012-07-19
  • 2013-05-30
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 2015-10-20
相关资源
最近更新 更多