gpt4 book ai didi

java - 以 double 格式转换有符号整数(2 字节,16 位)。使用Java

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:17:53 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

如果您有大量字节序列(我猜您有),并且您不想担心 BIG-ENDIAN 与 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 排序,将字节转换为短字节,并为下一个 getXXX() 调用定位自身。

关于java - 以 double 格式转换有符号整数(2 字节,16 位)。使用Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4616310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com