0

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.

JasonMArcher
  • 14,195
  • 22
  • 56
  • 52
Corn
  • 47
  • 7

1 Answers1

1

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.

jaket
  • 9,140
  • 2
  • 25
  • 44
  • thank you very much! unfortunately they changed the upvote system, thus I cant upvot your answer – Corn Aug 12 '14 at 18:19