我有个问题。在Java中,我需要从wav文件中读取样本。文件格式为: wav,PCM_SIGNED,带符号整型2字节=16位,小端...该对象以字节为单位读取音频样本,我需要将这两个字节转换为一个双精度值。我试着使用这个公式,但它并不完全正确:
mono = (double)((audioBytes[k] & 0xFF) | (audioBytes[k + 1] << 8));将计算结果与Matlab进行比较,发现Matlab中的实值与Java中转换后的实值存在差异。有谁能帮帮我吗?谢谢你,戴夫
发布于 2011-01-07 04:58:59
您没有向我们提供足够的信息来了解为什么在Matlab和Java中会得到不同的结果。通常,您可以将短通道数据-32768..32767缩放到-1..1范围内的双精度,这看起来是您正在尝试执行的操作。您的java结果:-3.0517578125E-5对于短值-1:-1/32768是正确的。我不知道为什么你的Matlab结果会不一样。你还没有告诉我们你是如何得到你的Matlab结果的。
如果你有一个很大的字节序列(我猜你有),并且你不想担心大端和小端或者位和字节的移位,让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()调用定位自己。
发布于 2011-01-07 02:09:18
这是正确的方式:
double sampleValue = (double)(( bytes[0]<<8 ) | ( bytes[1]&0x00FF ));(将指数更改为互换小/大)
发布于 2011-01-06 23:18:39
你不能只做most_significant byte * 256 + least_significant_byte,然后转换成双精度吗?
https://stackoverflow.com/questions/4616310
复制相似问题