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