gpt4 book ai didi

java - 将wav音频格式字节数组转换为 float

转载 作者:搜寻专家 更新时间:2023-10-31 19:30:50 25 4
gpt4 key购买 nike

我正在使用 Java AudioInputStream 读取 .wav 音频文件。音频文件是 16 位 PCM 签名的,采样率 = 44100,帧大小 = 2,帧长度 = 114048。我设法以字节的形式获取音频数据数组,但我不确定应该为这个字节数组分配多少大小,以便我可以将它转换为 floatinf 点值。我正在使用 Goertzel 算法进行一些音频处理,该算法接受 float 组的输入,例如“float[] x”。下面是我正在使用的一些代码片段。提前致谢。

 try {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileIn);
}

while ( numBytesRead != -1) {
numBytesRead = audioInputStream.read(audioBytes);

// Logic goes here
floatValue = byteArrayToFloat(audioBytes);
}

最佳答案

The audio file is 16 bit PCM signed, with samplerate = 44100, framesize = 2, framelength= 114048.

我从上面假设你只有一个 channel (2 字节样本 * 1 channel = 2 字节帧)。

第一步是获取数据作为 16 位整数类型的序列,这在 Java 中是 short

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;

...

byte[] audioBytes = ...

ShortBuffer sbuf =
ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
short[] audioShorts = new short[sbuf.capacity()];
sbuf.get(audioShorts);

现在如何将其转换为 float 取决于下游函数期望如何表示音频。例如,如果他们期望 float >= -1 和 <= 1,那么你可以这样做:

float[] audioFloats = new float[audioShorts.length];
for (int i = 0; i < audioShorts.length; i++) {
audioFloats[i] = ((float)audioShorts[i])/0x8000;
}

不幸的是,有很多方法可以表示音频。

关于java - 将wav音频格式字节数组转换为 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6235016/

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