打印

问Computer00的FFT程序

[复制链接]
2746|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ID001|  楼主 | 2009-5-16 17:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    void FftExe(IN_TYPE *pIn, OUT_TYPE *pRe, OUT_TYPE *pIm)函数中有实现FFT的一段,能讲解下这三级循环吗???

我看的书是西安电子科技大学出版社·丁美玉·《数字信号处理》,上面的程序段和书P103页说的程序流程图不一样····
想搞清楚FFT,所以请大概讲解一下这段代码··Thanks````


---------------------------------------------------------------------
//先计算2点的
 for(j=0;j<LENGTH;j+=2)
 {
  tr=pIn[j+1];
  pRe[j+1]=(pIn[j]-tr);
  pIm[j+1]=0;
  pRe[j]=(pIn[j]+tr);
  pIm[j]=0;
 }

 for(BlockSize=4;BlockSize<=LENGTH;BlockSize<<=1) //再一层层计算
 {
  for(j=0;j<LENGTH;j+=BlockSize)
  {
   for(i=0;i<BlockSize/2;i++)
   {
    #ifndef USE_TABLE
    c=(long)(1024*cos(2*PI*i/BlockSize));
    s=(long)(1024*sin(2*PI*i/BlockSize));
    #else
    OffSet0=LENGTH/BlockSize*i;//
    c=COS_TABLE[OffSet0];//
    s=SIN_TABLE[OffSet0];//
    #endif
    
    OffSet1=i+j;                
    OffSet2=OffSet1+BlockSize/2;
    
    tr=(OUT_TYPE)((c*pRe[OffSet2]+s*pIm[OffSet2])/1024);
    ti=(OUT_TYPE)((c*pIm[OffSet2]-s*pRe[OffSet2])/1024);
    #ifdef UNITARY  //如果要对结果归一化处理,则每次运算要除以2
    pRe[OffSet2]=(pRe[OffSet1]-tr)/2;
    pIm[OffSet2]=(pIm[OffSet1]-ti)/2;
    pRe[OffSet1]=(pRe[OffSet1]+tr)/2;
    pIm[OffSet1]=(pIm[OffSet1]+ti)/2;
    #else
    pRe[OffSet2]=(pRe[OffSet1]-tr);
    pIm[OffSet2]=(pIm[OffSet1]-ti);
    pRe[OffSet1]=(pRe[OffSet1]+tr);
    pIm[OffSet1]=(pIm[OffSet1]+ti);
    #endif
   }
  }
 }
---------------------------------------------------------------------

先自己理解的点点是:
for(j=0;j<LENGTH;j+=2)
{
  tr=pIn[j+1];
  pRe[j+1]=(pIn[j]-tr);
  pIm[j+1]=0;
  pRe[j]=(pIn[j]+tr);
  pIm[j]=0;
} 这段是完成第一级2点的FFT,采用实数运算,所以虚部取0.这段代码的表达式可以用书P102上实数的碟形运算规律解释。


相关帖子

沙发
computer00| | 2009-5-16 17:31 | 只看该作者

就是书上那个蝶型运算

第一列的2点的蝶型先单独运算。接下来的那些循环,就是分别计算第二列的4点、第三列的8点...

接着那个大循环,每次处理对应的就是整个蝶型运算中的一列,相当于每一列都要单独计算一下;
再进去一层循环,是对上一层循环中所分得的列,再一次拆分,就是相当于蝶型里面用平行线连在一起的框;
再进去一层循环,就是对每个框的每根线做处理了。

不知道这么说你明白了没...仔细看看书上的那个蝶型,在对照程序慢慢理解吧...

使用特权

评论回复
板凳
zhousd| | 2009-5-16 19:54 | 只看该作者

去问博立叶好了,世界上能完全理解的

届指可数,能完全明白的,可以做任意基了。

技术还是有点门槛好。

使用特权

评论回复
地板
ID001|  楼主 | 2009-5-16 23:23 | 只看该作者

Thanks Computer00


对应P101那个8点FFT,基本上明白Computer00的程序是怎么处理的了。再次Thanks.

使用特权

评论回复
5
computer00| | 2009-5-18 11:33 | 只看该作者

是的,基二的时间抽取算法

使用特权

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

本版积分规则

35

主题

107

帖子

0

粉丝