gpt4 book ai didi

java - 从 32 位样本大小的 WAV 创建样本数组

转载 作者:行者123 更新时间:2023-12-01 12:39:17 25 4
gpt4 key购买 nike

我得到了一个 WAV(32 位样本大小,每帧 8 字节,44100 Hz,PCM_Float),需要创建一个样本数组。这是我用于 16 位样本大小、每帧 4 字节、44100 Hz、PCM_Signed 的 Wav 的代码。

private float[] getSampleArray(byte[] eightBitByteArray) {

int newArrayLength = eightBitByteArray.length
/ (2 * calculateNumberOfChannels()) + 1;

float[] toReturn = new float[newArrayLength];
int index = 0;

for (int t = 0; t + 4 < eightBitByteArray.length; t += 2) // t+2 -> skip
//2nd channel
{
int low=((int) eightBitByteArray[t++]) & 0x00ff;
int high=((int) eightBitByteArray[t++]) << 8;
double value = Math.pow(low+high, 2);

double dB = 0;
if (value != 0) {
dB = 20.0 * Math.log10(value); // calculate decibel
}

toReturn[index] = getFloatValue(dB); //minorly important conversion
//to normalized values

index++;

}

return toReturn;
}

显然这个代码不能用于 32 位样本大小的 Wav,因为我必须在第一个 channel 中考虑 2 个字节。

有人知道如何添加其他 2 个字节(和移位)来计算幅度吗?不幸的是谷歌根本没有帮助我:/.

提前致谢。

最佳答案

像这样的事情应该可以解决问题。

for (int t = 0; t + 4 < eightBitByteArray.length; t += 4) // t+4 -> skip
//2nd channel
{
float value = ByteBuffer.wrap(eightBitByteArray, t, 4).order(ByteOrder.LITTLE_ENDIAN).getFloat();
double dB = 0;
if (value != 0) {
dB = 20.0 * Math.log10(value); // calculate decibel
}

toReturn[index] = getFloatValue(dB); //minorly important conversion
//to normalized values

index++;
}

另一方面 - 将瞬时样本转换为 dB 是无意义的。

关于java - 从 32 位样本大小的 WAV 创建样本数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25268734/

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