Using FFTW3


#1

Hey all

I'm trying to FFTW's fourier analysis library in a project heavily dependant on JUCE for all signal buffers. It appears that fftw's transform algorithms take standard float[] arrays as input buffers (whether calculations are made in-place or out). The AudioSampleBuffer object passed from processor to processor throughout the JUCE architecture contains all of this data, but not in a way that FFTW can read.

 

How do I get the data stream out of the AudioSampleBuffer in a form that a FFT algorithm can recognize as a valid input?

 


#2

getReadPointer() returns a float pointer, which should do the job.

If you need float[] arrays (which I understand are two dimensional float arrays), you can do something like:

const float *data[2] = { buffer.getReadPointer(0, 0), buffer.getReadPointer(1, 0) };

However they are not guaruanteed to be aligned, but I don't know if FFTW assumes alignment.


#3

 

 

Yeah, If I remember correctly, FFTW uses interleaved arrays, and the Juce returned pointer will be to a contiguous array.

Meaning, you will have to write a quick translation (cycle through the Juce array and copy the floats over to a new interleaved array for processing).  You also need to condition the array with a windowing function (see FFTW docs for that). 

 

The reason for this is that some calculation used for calculating FFTs are much faster when using interleaved data.

 

Also - FFTW is good, I would also put in a recomendation for kissFFT (which is a bit easier to use than FFTW IMHO, and arguably just as fast).  It also uses interleaved data, so you would have to do the translation either way.


#4

To add to what Aaron said, if it helps any and can apply (since I’ve no knowledge of these libraries), JUCE provides functions for interleaving and deinterleaving.