打印

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

[复制链接]
7411|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nanguamache|  楼主 | 2011-7-18 18:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用的是TI的C6713DSP,在例程中有一个simfft的例程,仿照这个历程可以对音频信号进行FFT变换,其中使用的就是dspc67x.lib库函数中的DSPF_sp_cfftr2_dit()FFT变换函数,它采用的是基2的时间抽取算法,我用这个实现了信号的FFT变换,现在想用它实现IFFT变换,即由频谱还原回原始信号,这要怎么做呢?我的程序如下,可是结果总是不对,希望知情者给解答一下,谢谢!
        //fft开始  
        for(i=0;i<NX;i++)
        {
          input_l[i*2]=Buffer_iir_l[i];//时域信号的实部
          input_l[i*2+1]=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[i]=sqrtf(input_l[2*i]*input_l[2*i]+input_l[2*i+1]*input_l[2*i+1]);
          }         
        //fft结束,ifft开始
        for(i=0;i<NX;i++)
        {
         output_l[i*2]=input_l[i*2];
         output_l[i*2+1]=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[i]=output_l[i*2];//取实部作为输出信号
          }
        
        for(i=0;i<512;i++)
         {
           gBufferXmtPing[i]=(int)(Buffer_iir_l[i]);
           }  
        //ifft结束

相关帖子

沙发
aresc| | 2011-7-19 12:35 | 只看该作者
//fft结束,ifft开始
        for(i=0;i<NX;i++)
        {
         output_l[i*2]=input_l[i*2];
         output_l[i*2+1]=0;                       // 应该是output_l[2*i+1] = input_l[2*i+1]
        }

使用特权

评论回复
板凳
taokan1991| | 2013-6-19 23:22 | 只看该作者
aresc 发表于 2011-7-19 12:35
//fft结束,ifft开始
        for(i=0;i

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

使用特权

评论回复
地板
jackblank| | 2014-12-9 20:28 | 只看该作者
楼主,这个ifft没变出来,FFT变出来了吗?

使用特权

评论回复
5
aresc| | 2014-12-9 20:39 | 只看该作者
本帖最后由 aresc 于 2014-12-9 20:44 编辑
jackblank 发表于 2014-12-9 20:28
楼主,这个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.

使用特权

评论回复
6
jackblank| | 2014-12-9 21:38 | 只看该作者
aresc 发表于 2014-12-9 20:39
又看了一下,如果是时域抽取的方式,那应该是先做bit reverse,后做butterfly运算。

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

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

使用特权

评论回复
7
aresc| | 2014-12-9 22:11 | 只看该作者
jackblank 发表于 2014-12-9 21:38
你好,我正在用库函数算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同上。

使用特权

评论回复
8
jackblank| | 2014-12-9 22:14 | 只看该作者
aresc 发表于 2014-12-9 22:11
DSPF_sp_cfftr2_dit(input_l, w,NX);

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

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

使用特权

评论回复
9
aresc| | 2014-12-9 22:27 | 只看该作者
最好是找到TI相关的文档,针对具体的函数说明去设置这些参数。否则可能还是有偏差。

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

使用特权

评论回复
10
xdh1009| | 2014-12-18 14:16 | 只看该作者
找到相关文件,手册 里面有使用说明很详细的使用说明

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

53

帖子

0

粉丝