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);