Question asked by Ethel on Apr 19, 2010

hi, recently I'am learning about the FFT. I have some questions about the example code given in the ifft_fr16(...) help document. The example code is as follows:

#include <filter.h>

#define  N_FFT 64

complex_fract16   in[N_FFT];

complex_fract16   out_cfft[N_FFT];

complex_fract16   out_ifft[N_FFT];

complex_fract16   twiddle[N_FFT/2];

int               blk_exp;

void ifft_fr16_example(void)

{

int  i;

/*  Generate DC signal */

for(  i = 0; i < N_FFT; i++ )

{

in[i].re = 0x100;

in[i].im = 0x0;

}

/*  Populate twiddle table */

/*  Compute Fast Fourier Transform */

cfft_fr16(in, out_cfft, twiddle, 1, N_FFT, &blk_exp,  0);

/* Reverse static scaling applied by cfft_fr16()  function

Apply the shift operation before the call to  the

ifft_fr16() function only if all the values in  out_cfft

=  0x100. Otherwise, perform the shift operation after the

ifft_fr16() function has been computed.

*/

for(  i = 0; i < N_FFT; i++ )

{

out_cfft[i].re = out_cfft[i].re << 6; /*  log2(N_FFT) = 6 */

out_cfft[i].im = out_cfft[i].im << 6;

}

/* Compute Inverse Fast Fourier Transform

The output signal from the ifft function will be the  same

as the DC signal of magnitude 0x100 which was passed  into

the cfft function.

*/

ifft_fr16(out_cfft, out_ifft, twiddle, 1, N_FFT,  &blk_exp, 0);

}

Here is my question:

(1)as the document said, cfft_fr16 will scale the intermediate result according to the scale mode to prevent overflow. But there is a for-loop following the cfft_fr16 function, I think the result will be overflow again. I can't understand it.

(2) the annotation part that just above the for-loop say if all the values in out_cfft = 0x100, user should apply the shift operation before the call to the ifft_fr16, otherwise, perform the shift operation after the call to ifft_fr16. What is the reason? In fact, I put the shift code after the call to the ifft_fr16, I also get the right result.

(3)when I change the N_FFT >=256, the result turns to be 0.

(4)Sometimes I think we should apply the shift operation after the call to cfft_fr16 and the call to ifft_fr16, cause the two function both scale  the intermediate results. But it won't be correct, right? cause with just one shift operation, we get the right result. I just can't understand it.

(5)when I change the scale mode to 2 and 3, and 6 in for-loop to blk_exp, neither I put the shift code before the call to ifft_fr16 nor I put the shift code after the call to ifft_fr16 wouldn't get the right answer.