Page 1 of 1

How to do FFT and IFFT to get original signal??

Posted: Thu Jul 04, 2019 12:44 pm
by link0513
Hi, There is a problem about FFT and IFFT.
Using dsp_fft_bit_reverse_and_forward_real() function can get the frequency spectrum but using its result for dsp_fft_bit_reverse_and_inverse_real() function can't get the original signal. It seem is lack of the signal phase message. So where I can get the information of the phase and to recover the original signal?

Below is the code:
dsp_fft_bit_reverse_and_forward_real(sample,128,dsp_sine_128,dsp_sine_64);
dsp_fft_bit_reverse_and_inverse_real(sample,128,dsp_sine_128,dsp_sine_64);

Re: How to do FFT and IFFT to get original signal??

Posted: Fri Jul 05, 2019 12:01 pm
by CousinItt
See the example project app_fft in the xCORE-200 DSP Elements Library [AN00209] which does that.

I can't see any code for dsp_fft_bit_reverse_and_forward_real.

Re: How to do FFT and IFFT to get original signal??

Posted: Mon Jul 08, 2019 1:33 am
by link0513
CousinItt wrote: Fri Jul 05, 2019 12:01 pm See the example project app_fft in the xCORE-200 DSP Elements Library [AN00209] which does that.

I can't see any code for dsp_fft_bit_reverse_and_forward_real.
the code is in the official file dsp_fft_real.xc, and compare the main code to the example is the same operation.

void dsp_fft_bit_reverse_and_forward_real (
int32_t pts[],
const uint32_t N,
const int32_t sine[],
const int32_t sin2[] ) {

dsp_fft_bit_reverse((pts, dsp_complex_t[]), N>>1);
dsp_fft_forward((pts, dsp_complex_t[]), N>>1, sine);
dsp_fft_real_fix_forward_xs2((pts, dsp_complex_t[]), N>>1, sin2);

}


void dsp_fft_bit_reverse_and_inverse_real (
int32_t pts[],
const uint32_t N,
const int32_t sine[],
const int32_t sin2[] ) {
dsp_fft_real_fix_inverse_xs2((pts, dsp_complex_t[]), N>>1, sin2);
dsp_fft_bit_reverse((pts, dsp_complex_t[]), N>>1);
dsp_fft_inverse((pts, dsp_complex_t[]), N>>1, sine);

}

Re: How to do FFT and IFFT to get original signal??

Posted: Mon Jul 08, 2019 6:26 pm
by CousinItt
Right, I think you're using a version of dsp_lib from github. The official version is 3.1.0 according to the xmos site; that's the newest version my installation of xtimecomposer can see.

Look at the descriptions of the functions in dsp_fft.h. Are your sine parameters in the right order?

Re: How to do FFT and IFFT to get original signal??

Posted: Tue Jul 09, 2019 1:44 am
by link0513
CousinItt wrote: Mon Jul 08, 2019 6:26 pm Right, I think you're using a version of dsp_lib from github. The official version is 3.1.0 according to the xmos site; that's the newest version my installation of xtimecomposer can see.

Look at the descriptions of the functions in dsp_fft.h. Are your sine parameters in the right order?
Yes. My version is 4.2 from github. And the Sine parameter is provided by official in dsp_tables.c

Re: How to do FFT and IFFT to get original signal??

Posted: Tue Jul 09, 2019 11:20 am
by CousinItt
I meant are you passing the sine and sin2 parameters in the right order. The comments in dsp_fft.h for dsp_fft_bit_reverse_and_forward_real says:

Code: Select all

 * \param[in,out] pts   Array of N integers (in) array of N/2 dsp_complex_t
 *                      elements (out)
 * \param[in]     N     Number of points. Must be a power of two.
 * \param[in]     sine  Array of N/8+1 sine values, each represented as a 
 *                      sign bit and a 31 bit fraction. 1.0 is represented
 *                      by 0x7fffffff.
 *                      Arrays are provided in dsp_tables.c.
 *                      For example, for a 1024 point FFT use dsp_sine_512.
 * \param[in]     sin2  Array of N/4+1 sine values, represented as above.
 *                      For example, for a 1024 point FFT use dsp_sine_1024.
You're passing dsp_sine_128 first.

Re: How to do FFT and IFFT to get original signal??

Posted: Tue Jul 09, 2019 11:47 am
by link0513
CousinItt wrote: Tue Jul 09, 2019 11:20 am I meant are you passing the sine and sin2 parameters in the right order. The comments in dsp_fft.h for dsp_fft_bit_reverse_and_forward_real says:

Code: Select all

 * \param[in,out] pts   Array of N integers (in) array of N/2 dsp_complex_t
 *                      elements (out)
 * \param[in]     N     Number of points. Must be a power of two.
 * \param[in]     sine  Array of N/8+1 sine values, each represented as a 
 *                      sign bit and a 31 bit fraction. 1.0 is represented
 *                      by 0x7fffffff.
 *                      Arrays are provided in dsp_tables.c.
 *                      For example, for a 1024 point FFT use dsp_sine_512.
 * \param[in]     sin2  Array of N/4+1 sine values, represented as above.
 *                      For example, for a 1024 point FFT use dsp_sine_1024.
You're passing dsp_sine_128 first.
Yes. I can confirm it is right.

Below is the code:
dsp_fft_bit_reverse_and_forward_real(sample,128,dsp_sine_128,dsp_sine_64);
dsp_fft_bit_reverse_and_inverse_real(sample,128,dsp_sine_128,dsp_sine_64);