Search code examples
javaaudiowavsamplingwaveform

Create sample array from 32bit sample size WAV


I got a WAV (32 bit sample size, 8 byte per frame, 44100 Hz, PCM_Float), which in need to create a sample array of. This is the code I have used for a Wav with 16 bit sample size, 4 byte per frame, 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;
}

Obviously this code cant work for the 32bits sample size Wav, as I have to consider 2 more bytes in the first channel.

Does anybody know how the 2 other bytes have to be added (and shiftet) to calculate the amplitude? Unfortunately google didnt help me at all :/.

Thanks in advance.


Solution

  • Something like this should do the trick.

    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++;
    }
    

    On another note - converting instantaneous samples to dB is nonsensical.