How can I get frequency data from PCM using FFT

Ben Taliadoros picture Ben Taliadoros · Sep 30, 2011 · Viewed 7.9k times · Source

I have an array of audio data I am passing to a reader:

 recorder.read(audioData,0,bufferSize); 

The instantiation is as follows:

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.

I have a FFT class I have found online and a complex class to go with it. I have tried for two days looking online everywhere but cant work out how to loop through the values stored in audioData and pass it to the FFT.

This is the FFT class I am using: http://www.cs.princeton.edu/introcs/97data/FFT.java and this is the complex class to go with it: http://introcs.cs.princeton.edu/java/97data/Complex.java.html

Answer

Hamed picture Hamed · Sep 30, 2011

Assuming the audioData array contains the raw audio data, you need to create a Complex[] object from the audioData array as such:

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

Now you can pass your complexData object as a parameter to your FFT function:

Complex[] fftResult = FFT.fft(complexData);