Как получить частотные данные из PCM с помощью FFT

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

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. 

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

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

Предполагая, что массив 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); 

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

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

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