以double格式转换signed int(2bytes,16 bits)。用Java

时间:2011-01-06 15:04:19

标签: java double wav signed pcm

我遇到了问题。 在Java中,我需要从wav文件中读取样本。 文件格式为:wav,PCM_SIGNED,2bytes = 16bits的signed int,little endian ... 该对象读取BYTES中的音频样本,我需要将这两个字节转换为一个double值。 我尝试使用这个公式,但这不完全正确:

mono = (double)((audioBytes[k] & 0xFF) | (audioBytes[k + 1] << 8));

将结果与Matlab进行比较我总是注意到Matlab中的实际值与Java中的转换值之间存在差异。 有人能帮帮我吗? 谢谢, 戴夫

3 个答案:

答案 0 :(得分:2)

您还没有向我们提供足够的信息来了解您在Matlab和Java中获得不同结果的原因。通常你将短通道数据[-32768..32767]缩放到[-1..1]范围内的双倍,看起来你正试图这样做。您的java结果:-3.0517578125E-5对于短值-1:-1/32768是正确的。我不知道为什么你的Matlab结果不同。您尚未向我们展示您如何获得Matlab结果。

如果你有一个很大的字节序列(我猜你这么做),你不想担心BIG-ENDIAN vs LITTLE-ENDIAN或者改变位和字节,让java来处理它你:

import java.nio.*;
...
ByteBuffer buf = ByteBuffer.wrap(audioBytes);
buf.order(ByteOrder.LITTLE_ENDIAN);

while (buf.remaining() >= 2) {
    short s = buf.getShort();
    double mono = (double) s;
    double mono_norm = mono / 32768.0;
    ...
}

ByteBuffer.getShort()读取缓冲区的下两个字节,处理Little-Endian排序,将字节转换为short,并为下一个getXXX()调用定位自己。

答案 1 :(得分:0)

答案 2 :(得分:-1)

你是不是只做了最重要的字节* 256 + least_significant_byte,然后再转为加倍?