几个快速傅立的叶变换算法.doc

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
几个快速傅立的叶变换算法的定稿.doc

几个快速傅立叶变换算法 离散傅里叶变换(DFT) DFT的的正变换和反变换分别为(1)和(2)式。假设有N个数据,则计算一个频率点需要N次复数乘法和N-1次复数加法,整个DFT需要N*N次复数乘法和N(N-1)次复数加法;由于一次的复数乘法需要进行4次的实数乘法和2次的复数加法,一次的复数加法需要两次的实数加法,因此整个DFT需要4*N*N次的实数乘法和2*N(N-1)+2*N*N≈4*N*N次的复数加法。当N比较大时,所需的计算工作量相当大,例如N=1024时大约需要400万次乘法运算,对于实时信号处理来说,将对计算设备提出非常苛刻的要求,于是就提出如何能够减少计算DFT的运算量的问题。 1965年,库力和图基在《计算数学》杂志上发表《机器计算傅立叶级数的一种算法》,此文是最早提出FFT算法的。此后关于DFT的快速算法称为人们研究的热点课题,也正是FFT算法的出现,才使得数字信号处理能够应用于实时场合并进一步推动数字信号处理的发展和应用。 大多数的FFT算法都是利用(3)式的周期性、共轭对称性、可压缩和扩展性的特点来压缩计算量。 1)、根据DFT定义进行计算的代码 直接利用DFT的定义进行计算的算法计算量非常大。 //Data为输入数据指针,Log2N=log2(length),flag=-1时为正变换,flag=1时为反变换,变换结果由指针Data指向的原空间返回 void?dft(complexdouble*Data,int?Log2N,int?flag) { ????int?i,j,length; ????complexdouble?wn; ????length=1Log2N; ????complexdouble*temp=new?complexdouble[length]; ????for(i=0;ilength;i++) ????{ ??????temp[i]=0; ??????for(j=0;jlength;j++) ??????{ ????????wn=complexdouble(cos(2.0*pi/length*i*j),sin(flag*2.0*pi/length*i*j)); ????????temp[i]+=Data[j]*wn;???? ??????}??????????? ????} ????if(flag==1) ?????for(i=0;ilength;i++) ???????Data[i]=temp[i]/length; ??? delete[]?temp; }?? 2)、倒位序重排 基2、基4和分裂基的DIT、DIF都需要进行倒位序重排。DIT输入为倒位序,输出为正常顺序,DIT输入为正常顺序,输出为倒位序。因此使用DIT要对输入先进行倒位序重排,DIT要对输出进行倒位序重排,才能得到正常顺序的结果。倒序序重排的实现主要是利用加1是从高位开始加,并且进位是向低位进的特点,这刚好和正位序相反,因此可以得到正位序相应的倒位序。还有一种方法,就是得到各个位上的数码,然后倒转再计入权值,就得到倒位序。 (1)、基2的倒位序重排程序 void reverse2(complexdouble *data,int Log2N) { ?int i,j; ?int RevNum; ?int MaxPos,CurPos,MaxValue; ?complexdouble temp; ?MaxValue=(1Log2N)-1; ?MaxPos=1(Log2N-1); ?RevNum=0; ?for(i=1;iMaxValue;i++) ?{ ? CurPos=MaxPos; ? while((CurPosRevNum)!=0) ? { ?? RevNum=RevNum(~CurPos); ?? CurPos=CurPos1; ? } ? RevNum=RevNum|CurPos; ? if (RevNumi) ? { ?? temp=data[RevNum]; ?? data[RevNum]=data[i]; ?? data[i]=temp; ? } ?} } (2)、基4的倒位序重排程序 //data为数据指针,Log4N=log4(length)。 void reverse4(complexdouble *Data,int Log4N) { ?int i,MaxValue,length,MaxPos,CurPos,RevNum; ?complexdouble temp; ?length=1(2*Log4N); ?MaxPos=length/4; ?MaxValue=length-1; ?RevNum=0; ?for(i=1;iMaxValue;i++) ?{ ? CurPos=MaxPos; ? whil

您可能关注的文档

文档评论(0)

gsgtshb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档