nanguamache 发表于 2011-7-18 18:32

如何使用TIC6713DSP库函数中的fft函数做ifft变换?

我使用的是TI的C6713DSP,在例程中有一个simfft的例程,仿照这个历程可以对音频信号进行FFT变换,其中使用的就是dspc67x.lib库函数中的DSPF_sp_cfftr2_dit()FFT变换函数,它采用的是基2的时间抽取算法,我用这个实现了信号的FFT变换,现在想用它实现IFFT变换,即由频谱还原回原始信号,这要怎么做呢?我的程序如下,可是结果总是不对,希望知情者给解答一下,谢谢!
      //fft开始
      for(i=0;i<NX;i++)
      {
          input_l=Buffer_iir_l;//时域信号的实部
          input_l=0;//时域信号的虚部,设为0
          }
         
      DSPF_sp_cfftr2_dit(input_l, w, NX);//fft变换,结果以位倒序形式存放
      DSPF_sp_bitrev_cplx(input_l,iData,NX); //再对结果进行倒序                  
      for(i=0;i<NX/2+1;i++)
      {
      //计算频谱的模值
          rlt=sqrtf(input_l*input_l+input_l*input_l);
          }         
      //fft结束,ifft开始
      for(i=0;i<NX;i++)
      {
         output_l=input_l;
         output_l=0;
      }
      DSPF_sp_cfftr2_dit(output_l, w, NX);//w为旋转因子,已从例程中得到
      DSPF_sp_bitrev_cplx(input_l,iData,NX);
      //位倒序函数,iData已知,但具体含义不太明白
      for(i=0;i<NX;i++)
      {
          Buffer_iir_l=output_l;//取实部作为输出信号
          }
      
      for(i=0;i<512;i++)
         {
         gBufferXmtPing=(int)(Buffer_iir_l);
         }
      //ifft结束

aresc 发表于 2011-7-19 12:35

//fft结束,ifft开始
      for(i=0;i<NX;i++)
      {
         output_l=input_l;
         output_l=0;                     // 应该是output_l = input_l
      }

taokan1991 发表于 2013-6-19 23:22

aresc 发表于 2011-7-19 12:35 static/image/common/back.gif
//fft结束,ifft开始
      for(i=0;i

呵呵 我也没变回来 。。。。两年了都没人回你的贴。。。估计我的也没人回我了 。。。
但还是要说 同问啊 !!!!!!!!!!!!!!!!!!!!

jackblank 发表于 2014-12-9 20:28

楼主,这个ifft没变出来,FFT变出来了吗?

aresc 发表于 2014-12-9 20:39

本帖最后由 aresc 于 2014-12-9 20:44 编辑

jackblank 发表于 2014-12-9 20:28 static/image/common/back.gif
楼主,这个ifft没变出来,FFT变出来了吗?
又看了一下,如果是时域抽取的方式,那应该是先做bit reverse,后做butterfly运算。

所以估计楼主的那个FFT也出来的不对。

应该把下面两行颠倒一下:
DSPF_sp_cfftr2_dit(input_l, w, NX);//fft变换,结果以位倒序形式存放
DSPF_sp_bitrev_cplx(input_l,iData,NX); //再对结果进行倒序

dit的意思是Decimation In Time-domain.

如果是频域抽取那bit-reverse和butterfly顺序是对的,但要用DSPF_sp_cfftr2_dif替换DSPF_sp_cfftr2_dit。
dif的意思是Decimation In Frequency-domain.

jackblank 发表于 2014-12-9 21:38

aresc 发表于 2014-12-9 20:39 static/image/common/back.gif
又看了一下,如果是时域抽取的方式,那应该是先做bit reverse,后做butterfly运算。

所以估计楼主的那个F ...

你好,我正在用库函数算FFT,我不明白
DSPF_sp_cfftr2_dit(input_l, w,NX);DSPF_sp_bitrev_cplx(input_l,iData,NX);这两个函数的参数是什么意义?或者每个参数代表什么?谢谢

aresc 发表于 2014-12-9 22:11

jackblank 发表于 2014-12-9 21:38 static/image/common/back.gif
你好,我正在用库函数算FFT,我不明白
DSPF_sp_cfftr2_dit(input_l, w,NX);DSPF_sp_bitrev_cplx(input_l, ...

DSPF_sp_cfftr2_dit(input_l, w,NX);

input_I是输入数据buffer,应该是复数形式,复数的实部占数组的偶数下标,虚部占数组的计数下标。
w应该是旋转因子,就是一个cos、sin数组表格,NX是复数的个数,应该为2的n次方。

DSPF_sp_bitrev_cplx(input_l,iData,NX);

FFT之后Input_I里结果变成FFT的结果,也都是复数,iData应该是bitreverse之后正常顺序后的FFT结果。
NX同上。

jackblank 发表于 2014-12-9 22:14

aresc 发表于 2014-12-9 22:11 static/image/common/back.gif
DSPF_sp_cfftr2_dit(input_l, w,NX);

input_I是输入数据buffer,应该是复数形式,复数的实部占数组的偶 ...

好的,我想问下那个w旋转因子是TI给的吗?还是要自己写?谢谢

aresc 发表于 2014-12-9 22:27

最好是找到TI相关的文档,针对具体的函数说明去设置这些参数。否则可能还是有偏差。

我也没有用过TI的这几个函数,只是以我的经验结合楼主的那个代码来解释的。

xdh1009 发表于 2014-12-18 14:16

找到相关文件,手册 里面有使用说明很详细的使用说明
页: [1]
查看完整版本: 如何使用TIC6713DSP库函数中的fft函数做ifft变换?