我有一个问题。 在Java中,我需要从一个wav文件中读取样本。 文件格式为:2字节= 16位,小端的WAV,PCM_SIGNED,符号int ... 对象读取字节的音频采样,我需要这两个字节转换成一个double值。 我试图使用这个公式,但它不是完全正确的:

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

比较用Matlab我的结果总是注意到在Matlab中实值和转换后的一个用Java之间的差异。 任何人能帮助我吗? 谢谢, 戴夫

有帮助吗?

解决方案

您没有给我们足够的信息,知道为什么你要在Matlab和Java不同的结果。通常你缩放短通道数据[-32768..32767]为双范围在[-1..1]它看起来像您正在尝试做的。您的Java结果:-3.0517578125E-5是短值-1正确的:-1/32768。我不知道为什么你的Matlab的结果是不同的。你还没有告诉我们你是如何在你的Matlab的结果到达。

如果你有个字节(我猜你这样做)的一个大的序列,你不想对大端VS小端或移位,比特和字节的担心,让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( )读取缓冲器的下两个字节,取小端排序的护理,字节转换为短,并且位置本身用于下一个的getXXX()调用。

其他提示

这是正确的方法:

double sampleValue = (double)(( bytes[0]<<8 ) | ( bytes[1]&0x00FF ));

(更改索引来交换小/大)

广东话你只是做most_significant字节* 256 + least_significant_byte再投翻番?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top