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

时间:2014-08-12 15:50:09

标签: java audio wav sampling waveform

我得到了一个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)来计算幅度吗?不幸的是谷歌根本没有帮助我:/。

提前致谢。

1 个答案:

答案 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是没有意义的。