Правильный способ конвертировать 16-битные данные PCM Wave в плавающее - PullRequest
4 голосов
/ 07 января 2011

У меня есть волновой файл в 16-битной форме PCM. У меня есть необработанные данные в byte[] и метод извлечения выборок, и мне нужны они в формате с плавающей запятой, то есть float[], чтобы выполнить преобразование Фурье. Вот мой код, это выглядит правильно? Я работаю на Android, поэтому javax.sound.sampled и т. Д. Недоступно.

private static short getSample(byte[] buffer, int position) {
  return (short) (((buffer[position + 1] & 0xff) << 8) | (buffer[position] & 0xff));
}

...

float[] samples = new float[samplesLength];
  for (int i = 0;i<input.length/2;i+=2){
    samples[i/2] = (float)getSample(input,i) / (float)Short.MAX_VALUE;
  }

Ответы [ 3 ]

6 голосов
/ 08 января 2011

У меня было похожее решение, но ИМХО немного чище.К сожалению, насколько мне известно, хорошего библиотечного метода нет: * Предполагается, что четные байты являются младшими байтами

private static float[] bytesToFloats(byte[] bytes) {
    float[] floats = new float[bytes.length / 2];
    for(int i=0; i < bytes.length; i+=2) {
        floats[i/2] = bytes[i] | (bytes[i+1] << 8);
    }
    return floats;
}
3 голосов
/ 31 мая 2011

Вы можете попробовать использовать API ByteBuffer. http://developer.android.com/reference/java/nio/ByteBuffer.html#asFloatBuffer()

2 голосов
/ 17 марта 2015

Как указывает герцспрунг, ответ jk.работает только для неподписанного PCM.На Android PCM16 имеет знак с прямым порядком байтов, поэтому вам необходимо учитывать потенциально отрицательное значение, закодированное в дополнении до двух .Это означает, что нам нужно проверить, больше ли старший байт 127, и если это так, сначала вычесть из него 256, а затем умножить на 256.

private static float[] bytesToFloats(byte[] bytes) {
    float[] floats = new float[bytes.length / 2];
    for(int i=0; i < bytes.length; i+=2) {
        floats[i/2] = bytes[i] | (bytes[i+1] < 128 ? (bytes[i+1] << 8) : ((bytes[i+1] - 256) << 8));
    }
    return floats;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...