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

标签 java double wav signed pcm

我有一个问题。 在 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/

相关文章:

c# - 如何提高 double 类型对于大数的精度?

delphi - 如何从声卡录制任何东西?

ffmpeg - 将 FLV 音频流与 WAV 背景音轨混合,并使用 SoX 和 FFmpeg 转换为 MP3

java - 我希望能够 "turn on"视频游戏机,但前提是电视 channel 设置为 3。我该如何执行此操作?

java - Android Studio ListView 不会显示适配器中的项目

JAVA将字符串CSV文件转换为double[]数组

c++ - 编译器如何选择给 auto 赋值?

c++ - 读取 .wav 文件并在 C++ 中应用 FFT

java - 从Java中的位置读取文本文件

Java 没有接收到按键?