首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将有符号整数(2字节,16位)转换为双精度格式。使用Java

将有符号整数(2字节,16位)转换为双精度格式。使用Java
EN

Stack Overflow用户
提问于 2011-01-06 23:04:19
回答 3查看 3.3K关注 0票数 3

我有个问题。在Java中,我需要从wav文件中读取样本。文件格式为: wav,PCM_SIGNED,带符号整型2字节=16位,小端...该对象以字节为单位读取音频样本,我需要将这两个字节转换为一个双精度值。我试着使用这个公式,但它并不完全正确:

代码语言:javascript
复制
mono = (double)((audioBytes[k] & 0xFF) | (audioBytes[k + 1] << 8));

将计算结果与Matlab进行比较,发现Matlab中的实值与Java中转换后的实值存在差异。有谁能帮帮我吗?谢谢你,戴夫

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-07 04:58:59

您没有向我们提供足够的信息来了解为什么在Matlab和Java中会得到不同的结果。通常,您可以将短通道数据-32768..32767缩放到-1..1范围内的双精度,这看起来是您正在尝试执行的操作。您的java结果:-3.0517578125E-5对于短值-1:-1/32768是正确的。我不知道为什么你的Matlab结果会不一样。你还没有告诉我们你是如何得到你的Matlab结果的。

如果你有一个很大的字节序列(我猜你有),并且你不想担心大端和小端或者位和字节的移位,让java来为你处理:

代码语言:javascript
复制
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()调用定位自己。

票数 3
EN

Stack Overflow用户

发布于 2011-01-07 02:09:18

这是正确的方式:

代码语言:javascript
复制
double sampleValue = (double)(( bytes[0]<<8 ) | ( bytes[1]&0x00FF ));

(将指数更改为互换小/大)

票数 0
EN

Stack Overflow用户

发布于 2011-01-06 23:18:39

你不能只做most_significant byte * 256 + least_significant_byte,然后转换成双精度吗?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4616310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档