Как я могу получить данные о частоте из PCM, используя FFT - PullRequest
7 голосов
/ 30 сентября 2011

У меня есть массив аудиоданных, которые я передаю читателю:

 recorder.read(audioData,0,bufferSize); 

Пример выглядит следующим образом:

AudioRecord recorder;
short[] audioData;
int bufferSize;
int samplerate = 8000;

//get the buffer size to use with this audio record
bufferSize = AudioRecord.getMinBufferSize(samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT)*3;

//instantiate the AudioRecorder
recorder = new AudioRecord(AudioSource.MIC,samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,bufferSize); 

recording = true; //variable to use start or stop recording
audioData = new short [bufferSize]; //short array that pcm data is put into.

У меня есть класс БПФ, который я нашел в Интернете, и сложный класс, чтобы пойти с ним. Я пытался в течение двух дней искать в Интернете везде, но не могу понять, как перебрать значения, хранящиеся в audioData и передать его в БПФ.

Это класс FFT, который я использую: http://www.cs.princeton.edu/introcs/97data/FFT.java и это сложный класс, чтобы пойти с ним: http://introcs.cs.princeton.edu/java/97data/Complex.java.html

Ответы [ 3 ]

3 голосов
/ 30 сентября 2011

Предполагая, что массив audioData содержит необработанные аудиоданные, вам необходимо создать объект Complex[] из массива audioData следующим образом:

Complex[] complexData = new Complex[audioData.length];
for (int i = 0; i < complexData.length; i++) {
    complextData[i] = new Complex(audioData[i], 0);
}

Теперь вы можете передать complexDataОбъект в качестве параметра для вашей функции FFT:

Complex[] fftResult = FFT.fft(complexData);
1 голос
/ 30 сентября 2011

Некоторые детали будут зависеть от цели вашего БПФ.

Длина требуемого БПФ зависит от разрешения по частоте и точности по времени (которые обратно пропорциональны), которые вы хотите в своем анализе, которые могут быть или не быть где-то рядом с длиной входного аудио буфера. Учитывая эти различия в длине, вам может потребоваться объединить несколько буферов, сегментировать один буфер или некоторую комбинацию двух, чтобы получить длину окна FFT, которая соответствует вашим требованиям анализа.

0 голосов
/ 30 сентября 2011

PCM - это метод кодирования данных.Это не имеет отношения к получению частотного анализа аудиоданных с использованием БПФ.Если вы используете Java для декодирования кодированных данных PCM, вы получите необработанные аудиоданные, которые затем можно будет передать в вашу библиотеку FFT.

...