问Computer00的FFT程序

[复制链接]
3257|4
 楼主| ID001 发表于 2009-5-16 17:04 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;FftExe(IN_TYPE&nbsp;*pIn,&nbsp;OUT_TYPE&nbsp;*pRe,&nbsp;OUT_TYPE&nbsp;*pIm)函数中有实现FFT的一段,能讲解下这三级循环吗???<br /><br />我看的书是西安电子科技大学出版社·丁美玉·《数字信号处理》,上面的程序段和书P103页说的程序流程图不一样····<br />想搞清楚FFT,所以请大概讲解一下这段代码··Thanks````<br /><br /><br />---------------------------------------------------------------------<br />//先计算2点的<br />&nbsp;for(j=0;j&ltLENGTH;j+=2)<br />&nbsp;{<br />&nbsp;&nbsp;tr=pIn[j+1];<br />&nbsp;&nbsp;pRe[j+1]=(pIn[j]-tr);<br />&nbsp;&nbsp;pIm[j+1]=0;<br />&nbsp;&nbsp;pRe[j]=(pIn[j]+tr);<br />&nbsp;&nbsp;pIm[j]=0;<br />&nbsp;}<br /><br />&nbsp;for(BlockSize=4;BlockSize&lt=LENGTH;BlockSize&lt&lt=1)&nbsp;//再一层层计算<br />&nbsp;{<br />&nbsp;&nbsp;for(j=0;j&ltLENGTH;j+=BlockSize)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;for(i=0;i&ltBlockSize/2;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;#ifndef&nbsp;USE_TABLE<br />&nbsp;&nbsp;&nbsp;&nbsp;c=(long)(1024*cos(2*PI*i/BlockSize));<br />&nbsp;&nbsp;&nbsp;&nbsp;s=(long)(1024*sin(2*PI*i/BlockSize));<br />&nbsp;&nbsp;&nbsp;&nbsp;#else<br />&nbsp;&nbsp;&nbsp;&nbsp;OffSet0=LENGTH/BlockSize*i;//<br />&nbsp;&nbsp;&nbsp;&nbsp;c=COS_TABLE[OffSet0];//<br />&nbsp;&nbsp;&nbsp;&nbsp;s=SIN_TABLE[OffSet0];//<br />&nbsp;&nbsp;&nbsp;&nbsp;#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OffSet1=i+j;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OffSet2=OffSet1+BlockSize/2;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;tr=(OUT_TYPE)((c*pRe[OffSet2]+s*pIm[OffSet2])/1024);<br />&nbsp;&nbsp;&nbsp;&nbsp;ti=(OUT_TYPE)((c*pIm[OffSet2]-s*pRe[OffSet2])/1024);<br />&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;UNITARY&nbsp;&nbsp;//如果要对结果归一化处理,则每次运算要除以2<br />&nbsp;&nbsp;&nbsp;&nbsp;pRe[OffSet2]=(pRe[OffSet1]-tr)/2;<br />&nbsp;&nbsp;&nbsp;&nbsp;pIm[OffSet2]=(pIm[OffSet1]-ti)/2;<br />&nbsp;&nbsp;&nbsp;&nbsp;pRe[OffSet1]=(pRe[OffSet1]+tr)/2;<br />&nbsp;&nbsp;&nbsp;&nbsp;pIm[OffSet1]=(pIm[OffSet1]+ti)/2;<br />&nbsp;&nbsp;&nbsp;&nbsp;#else<br />&nbsp;&nbsp;&nbsp;&nbsp;pRe[OffSet2]=(pRe[OffSet1]-tr);<br />&nbsp;&nbsp;&nbsp;&nbsp;pIm[OffSet2]=(pIm[OffSet1]-ti);<br />&nbsp;&nbsp;&nbsp;&nbsp;pRe[OffSet1]=(pRe[OffSet1]+tr);<br />&nbsp;&nbsp;&nbsp;&nbsp;pIm[OffSet1]=(pIm[OffSet1]+ti);<br />&nbsp;&nbsp;&nbsp;&nbsp;#endif<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;}<br />---------------------------------------------------------------------<br /><br />先自己理解的点点是:<br />for(j=0;j&ltLENGTH;j+=2)<br />{<br />&nbsp;&nbsp;tr=pIn[j+1];<br />&nbsp;&nbsp;pRe[j+1]=(pIn[j]-tr);<br />&nbsp;&nbsp;pIm[j+1]=0;<br />&nbsp;&nbsp;pRe[j]=(pIn[j]+tr);<br />&nbsp;&nbsp;pIm[j]=0;<br />}&nbsp;这段是完成第一级2点的FFT,采用实数运算,所以虚部取0.这段代码的表达式可以用书P102上实数的碟形运算规律解释。<br /><br /><br />
computer00 发表于 2009-5-16 17:31 | 显示全部楼层

就是书上那个蝶型运算

第一列的2点的蝶型先单独运算。接下来的那些循环,就是分别计算第二列的4点、第三列的8点...<br /><br />接着那个大循环,每次处理对应的就是整个蝶型运算中的一列,相当于每一列都要单独计算一下;<br />再进去一层循环,是对上一层循环中所分得的列,再一次拆分,就是相当于蝶型里面用平行线连在一起的框;<br />再进去一层循环,就是对每个框的每根线做处理了。<br /><br />不知道这么说你明白了没...仔细看看书上的那个蝶型,在对照程序慢慢理解吧...
zhousd 发表于 2009-5-16 19:54 | 显示全部楼层

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

届指可数,能完全明白的,可以做任意基了。<br /><br />技术还是有点门槛好。
 楼主| ID001 发表于 2009-5-16 23:23 | 显示全部楼层

Thanks Computer00

<br />对应P101那个8点FFT,基本上明白Computer00的程序是怎么处理的了。再次Thanks.
computer00 发表于 2009-5-18 11:33 | 显示全部楼层

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

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

107

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部