Преобразование байтового массива аудио формата WAV в плавающую точку - PullRequest
5 голосов
/ 04 июня 2011

Я читаю аудиофайл .wav, используя Java AudioInputStream. Аудиофайл подписан 16-битным PCM, с частотой дискретизации = 44100, размером кадров = 2, длиной кадра = 114048. Мне удалось получить аудиоданные в виде байтамассив, но я не уверен, какой размер я должен назначить этому байтовому массиву, чтобы я мог преобразовать его в значения точек с плавающей точкой.Я делаю некоторые аудио манипуляции с использованием алгоритма Гертцеля, который принимает ввод массива с плавающей точкой, что-то вроде "float [] x".Ниже приведен фрагмент кода, который я использую.Заранее спасибо.

 try {
 AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileIn);
  }

while ( numBytesRead != -1) {
numBytesRead = audioInputStream.read(audioBytes);

// Logic goes here
floatValue = byteArrayToFloat(audioBytes);
}

1 Ответ

10 голосов
/ 04 июня 2011

Аудио файл подписан 16-битным PCM, с частотой дискретизации = 44100, размером кадров = 2, длиной кадра = 114048.

Я предполагаю, что у вас есть только одинканал (2-байтовые выборки * 1 канал = 2-байтовые кадры).

Первый шаг - получить данные в виде последовательности 16-битного интегрального типа, который в Java равен short.

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;

...

byte[] audioBytes = ...

ShortBuffer sbuf =
    ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
short[] audioShorts = new short[sbuf.capacity()];
sbuf.get(audioShorts);

Теперь, как вы преобразуете это в float s, зависит от того, как функции в нисходящем направлении ожидают представления звука.Например, если они ожидают числа с плавающей запятой> = -1 и <= 1, вы можете сделать это: </p>

float[] audioFloats = new float[audioShorts.length];
for (int i = 0; i < audioShorts.length; i++) {
    audioFloats[i] = ((float)audioShorts[i])/0x8000;
}

К сожалению, существует множество способов представления звука.

...