Hi all,

I have been working on this for quite sometime and am frustrated. I am using the GNU Scientific Library gsl. I am wanting to compute a FFT over some n that is not nessecarily a multiple of 2. I have got the FFT Radix-2 function to work with 512. The Mixed-Radix function works for some values of n but not all. There is nothing in the documentation that says n has to anything in particular. I have found a work around and that is to zero-pad my data until it is a multiple of 2 and then transform, but the output is not as clear as compared without the zero-pad. I've included a link to the documentation of gsl's FFT. I've also included my code.

http://www.gnu.org/software/gsl/manual/gsl-ref_15.html#SEC237
//////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////

//FFT with n= 575 only outputs one frequency not both the 50Hz and 120Hz

//FFT with n=512 returns both frequencies, try it if you want to see the output

const int n= 575;

double dataFFT[2*n];

gsl_fft_complex_wavetable *wavetable;

gsl_fft_complex_workspace *workspace;

int index= 0;

for (index= 0; index < n; index++)

{

REAL(dataFFT,index)= 0.0;

IMAG(dataFFT,index)= 0.0;

}

wavetable= gsl_fft_complex_wavetable_alloc (n);

workspace= gsl_fft_complex_workspace_alloc (n);

for (index= 0; indexi < wavetable->nf; index++)

{

printf ("# factor %d: %d\n", testi, wavetable->factor[testi]);

}

//setup an array of time in seconds incrementing by .001

float t[n];

int index_t= 0;

for(index_t= 0; index_t < n; index_t++)

{

t[index_t]= 0.001* index_t;

// printf("%f\n", t[index_t]);

}

//equation to calculate, two frequencies are 50Hz and 120Hz

float x[n];

int index_x= 0;

for(index_x= 0; index_x < n; index_x++)

{

x[index_x]= (sin(2*M_PI*50*t[index_x])+ sin(2*M_PI*120*t[index_x]));

// printf("%f\n", x[index_x]);

}

int index_FFT= 0;

//setup the complex dataFFT array

for (index_FFT= 0; index_FFT < n; index_FFT++)

{

REAL(dataFFT,index_FFT) = x[index_FFT];

IMAG(dataFFT,index_FFT) = 0.0;

//printf("%f +%f\n", REAL(dataFFT2, index_FFT), IMAG(dataFFT2, index_FFT));

}

//Mixed-Radix FFT function

gsl_fft_complex_forward (dataFFT, 1, n, wavetable, workspace);

//Radix-2 Function for when n=512

//gsl_fft_complex_radix2_forward (dataFFT, 1, 512);

//Output dataFFT

for (index_FFT= 0; index_FFT < n; index_FFT++)

{

printf("%f+%fi\n", REAL(dataFFT, index_FFT), IMAG(dataFFT, index_FFT));

}

gsl_fft_complex_wavetable_free (wavetable);

gsl_fft_complex_workspace_free (workspace);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

thank you,

m.
Question: Do you need to use FFT, or the "ordinary" Fourier transform would do? If you don't want to do real-time signal processing, the latter will give you the possibility to deal with any sample number. Up to a certain data rate, it's also possible to do real-time computing on the processors used nowadays.