我得到了一个WAV(32位样本大小,每帧8个字节,44100 Hz,PCM_Float),这需要创建一个样本数组。这是我用于16位样本大小的Wav的代码,每帧4字节,44100 Hz,PCM_Signed。
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,因为我必须考虑第一个通道中的2个字节。
有人知道如何添加其他两个字节(和shiftet)来计算幅度吗?不幸的是谷歌根本没有帮助我:/。
提前致谢。
答案 0 :(得分:1)
这样的事情应该可以解决问题。
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是没有意义的。