完整版快速傅里叶变换算法及其在信号处理中的应用毕业设计.docx
《完整版快速傅里叶变换算法及其在信号处理中的应用毕业设计.docx》由会员分享,可在线阅读,更多相关《完整版快速傅里叶变换算法及其在信号处理中的应用毕业设计.docx(31页珍藏版)》请在冰豆网上搜索。
完整版快速傅里叶变换算法及其在信号处理中的应用毕业设计
毕业设计(论文)
题目
快速傅里叶变换算法及其在信号处理中的应用
专 业 班 级
学 号
姓 名
指导教师
学院名称
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:
所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:
日 期:
指导教师签名:
日 期:
使用授权说明
本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:
按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:
日 期:
学位论文原创性声明
本人郑重声明:
所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:
日期:
年月日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:
日期:
年月日
导师签名:
日期:
年月日
注意事项
1.设计(论文)的内容包括:
1)封面(按教务处制定的标准封面格式制作)
2)原创性声明
3)中文摘要(300字左右)、关键词
4)外文摘要、关键词
5)目次页(附件不统一编入)
6)论文主体部分:
引言(或绪论)、正文、结论
7)参考文献
8)致谢
9)附录(对论文支持必要时)
2.论文字数要求:
理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
3.附件包括:
任务书、开题报告、外文译文、译文原文(复印件)。
4.文字、图表要求:
1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写
2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。
图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画
3)毕业论文须用A4单面打印,论文50页以上的双面打印
4)图表应绘制于无格子的页面上
5)软件工程类课题应有程序清单,并提供电子文档
5.装订顺序
1)设计(论文)
2)附件:
按照任务书、开题报告、外文译文、译文原文(复印件)次序装订
3)其它
摘要
快速傅氏变换(FFT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得
的。
它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
傅里叶变换的理论与方法在“数理方程”、“线性系统分析”、“信号处理、仿真”等很多学科领域都有着广泛应用,由于计算机只能处理有限长度的离散的序列,所以真正在计算机上运算的是一种离散傅里叶变换. 虽然傅里叶运算在各方面计算中有着重要的作用,但是它的计算过于复杂,大量的计算对于系统的运算负担过于庞大,使得一些对于耗电量少,运算速度慢的系统对其敬而远之,然而,快速傅里叶变换的产生,使得傅里叶变换大为简化,在不牺牲耗电量的条件下提高了系统的运算速度,增强了系统的综合能力,提高了运算速度,因此快速傅里叶变换在生产和生活中都有着非常重要的作用,对于学习掌握都有着非常大的意义。
关键词:
快速傅氏变换;快速算法;简化;广泛应用
Abstract
FastFourierTransform(FFT),isadiscretefastFouriertransformalgorithm,whichisbasedontheDiscreteFourierTransformofoddandeven,false,false,andothercharacteristicsoftheDiscreteFourierTransformalgorithmsimprovementsobtained.ItsFouriertransformtheorythecomputersystemortheapplicationofdigitalsystemsDiscreteFourierTransformcanbesaidtobeabigstepinto.Fouriertransformtheoryandmethodsinthe"mathematicalequation"and"linearsystemsanalysis"and"signalprocessing,simulation,"andmanyotherareasonlythecomputer'soperationisadiscreteFouriertransform.FourierAlthoughallaspectsofcomputinginthecalculationimportantrole,butitscalculationwastoocomplicated,alotofcomputingsystemforcalculatingtheburdenistoolargeforsomeLesspowerconsumption,theslowspeedofoperationofitssystematarm'slength,powerattheexpenseoftheconditionstoincreasethespeedofcomputingsystems,andenhancethesystemThecomprehensiveabilitytoimprovethespeedofoperation,theFastFourierTransformintheproductionandlifelearningtomasterallintime)FFT算法
其中:
r=0,1,2…(2-1)
基2-频率抽取(Decimationinfrequency)FFT算法
(2-2)
2.2快速傅里叶变换的优越性
设为项的复数序列,依据DFT变换,任一的计算都需要有次复数乘法和()次复数加法,而且一次复数乘法等同于四次实数乘法和两次实数加法,同样的,一次复数加法等同于两次实数加法,即使我们把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出项复数序列的,即N点DFT变换大约就需要次运算。
当点性,把一个N项序列(设,为正整数),分为两个项的子序列,而且每个点的DFT变换需要次运算,再运用N次运算把两个点的DFT变换重新组合成一个N点的DFT变换。
如此变换以后,总的运算次数就变成了。
承接上面的例子,当时,总的运算次数就变成了525312次,这样看来,节省了大约50%的运算量。
而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要次的运算,在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT的优越性.当然,FFT提高了运算速度,但是,也对参与运算的样本序列作出了限制,即要求样本数为2^N点.离散傅里叶变换DFT则无上述限制[5]。
2.3快速傅里叶变换的意义
傅立叶变换的物理意义:
傅立叶变换是数字信号处理技术领域一项很重要的算法。
要知道傅立叶变换算法的意义,首先要了解傅立叶变换原理的意义。
傅立叶变换原理表明:
任何连续测量的时序或信号,都能够表示成为不同频率的正弦波信号的无限叠加。
而利用该原理而创立的傅立叶变换算法则利用直接能测量到的原始信号,并以累加方式来计算该信号中不同正弦波信号的频率、相位和振幅。
与傅立叶变换算法对应的是反傅立叶变换算法。
该反变换从本质上说也就是一种累加处理,这样便可以将单独改变的正弦波信号转换成一个信号。
因此,也可以说,傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),我们可以利用一些专业工具对这些频域信号进行加工、处理。
最后还可以利用傅立叶反变换将这些频域信号转换成原来的时域信号。
从现代数学的眼光来看,傅里叶变换其实就是一种特殊的积分变换。
它能够将满足一定条件下的某个函数表示成为正弦基函数的线性组合或者积分形式。
在不同的研究领域里,傅里叶变换具有多种形式各异的变体形式,如连续傅里叶变换和离散傅里叶变换。
在数学领域,尽管最初傅立叶分析是作为热过程的解析分析的工具,但是其思想方法仍然具有典型的还原论和分析主义的特征。
"任意"的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式,而正弦函数在物理上是被充分研究而相对简单的函数类:
1.傅立叶变换是线性算子,若赋予适当的范数,它还是酉算子;2.傅立叶变换的逆变换容易求出,而且形式与正变换非常类似;3.正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段;4.离散形式的傅立叶的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取;5.著名的卷积定理指出:
傅立叶变换可以化复变换可以利用数字计算机快速的算出(其算法称为快速傅立叶变换算法(FFT))。
正是由于上述的良好性质,傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用[6]。
3.快速傅里叶变换的算法
3.1快速傅里叶变换算法
快速傅里叶变换FFT是离散傅里叶变换DFT的一种快速算法,只有FFT才能在现实中有实际应用的意义。
(3-1)
由(3-1)式可知,对每一个n,计算X(n)须作N次复数乘法及N-1次复数加法,要完成这组变换共需
次乘法及N(N-1)次复数加法。
但以下介绍的快速傅里叶变换的算法,可大大减少运算次数,提高工作效率。
当时,n和k可用二进制数表示:
(3-2)
(3-3)
又记 ,则(3-1)式可改写为
(3-4)
式中:
(3-5)
因为所以(3-2)可改成
(3-6)
(3-7)
则式(3-7)即为式(3-6)的分解形式。
将初始数据代入式(3-7)的第一个等式,可得每一组计算数据,一般将痗L-1组计算数据代入式(3-7)的第L个等式,计算后可得第L组计算数据(L=1,2,…,γ),计算公式也可表示为
=
(3-8)
式中
(3-9)
根据式(3-8),第L个数组中每个
的计算只依赖于上一个数组的两个数据这两个数据的标号相差,即,而且这两个数据只用于计算第L个数组中标号的数据(等号右端为二进制数)。
当分别取0和1时,分别有。
因此,用上一组的两个数据计算所得的两个新数据仍可储存在原来位置,计算过程中只需要N个存储器。
将与称为第L个数组中的对偶结点对。
计算每个对偶结点对只需一次乘法,事实上由式(3-8)可得
(3-10)
式中:
;
别为式(3-9)中取0,1时对应的P值。
因,于是对偶结点的有如下关系:
因此式(3-8)可表示为
(3-11)
P的求法:
在中,i写成二进制数右移位,就成为
颠倒位序得
式(3-7)中,前面的r个等式,每个等式均对应一组数据进行计算,每组数据都有N2对结点,根据式(3-11),每对结点只需作1次乘法和2次加法,因此,每组数据只需N2次乘法和N次加法,因而完成r组数据的计算共需Nr2次乘法和Nr次加法。
3.2Cooley-TukeyFFT算法
的核心是将一层运算映射为二层运算。
作点时,若不是素数,则可分解为,那么由的
(3-12)
通过映射:
(3-13)
可得到
而,,,可化简为
(3-14)
从而式(3-12)转化为
(3-15)
其中
。
以点为例,,映射方式为:
,,则计算流图如图3-1所示。
图3-1Cooley-Tukey20点FFT算法
3.3Rader-BrennerFFT算法
Rader-Brenner算法是类似于Cooley-Tukey算法,但是采用的旋转因子都是纯虚数,以增加加法运算和降低了数值稳定性为代价减少了乘法运算。
这方法之后被split-radixvariantofCooley-Tukey所取代,与Rader-Brenner算法相比,有一样多的乘法量,却有较少的加法量,且不牺牲数值的准确性[7]。
Bruun以及QFT算法是不断的把DFT分成许多较小的DFT运算。
(Rader-Brenner以及QFT算法是为了2的指数所设计的算法,但依然可以适用在可分解的整数上。
Bruun算法则可以运用在可被分成偶数个运算的数字)。
尤其是Bruun算法,把FFT看成是,并把它分解成与的形式。
另一个从多项式观点的快速傅立叶变换法是Winograd算法。
此算法把分解成cyclotomic多项式,而这些多项式的系数通常为1,0,-1。
这样只需要很少的乘法量(如果有需要的话),所以winograd是可以得到最少乘法量的快速傅立叶算法,对于较小的数字,可以找出有效率的算方式。
更精确地说,winograd算法让DFT可以用2K点的DFT来简化,但减少乘法量的同时,也增加了非常多的加法量。
Winograd也可以利用剩余值定理来简化DFT。
Rader算法提出了利用点数为N(N为质数)的DFT进行长度为N-1的回旋折积来表示原本的DFT,如此就可利用折积用一对基本的FFT来计算DFT。
另一个prime-size的FFT算法为chirp-Z算法。
此法也是将DFT用折积来表示,此法与Rader算法相比,能运用在更一般的转换上,其转换的基础为Z转换[8]。
3.4Goertsel算法
如前所述,点时域序列的离散付里叶变换式为
,(3-16)
这点频域序列是同时被算出的,不可能只计算其中某一个或几个指定点。
Goetzel算法是为了解决这个问题而提出的。
这个算法把离散付里叶变换看作一组滤波器,将输入端的时域序列与其中一个滤波器的冲激响应序列进行卷积运算,求滤波器的输出序列,即得序列的一点。
这种算法利用旋转因子的周期性,使DFT运算化为线性滤波运算[9]。
由于
故式(3-16)可化为
(3-17)
定义序列为
(3-18)
可见是由两个序列卷积而得到的序列。
(3-19)
其中,是输入的点序列,另一个序列被看作滤波器的冲激响应序列
。
(3-20)
对比式(3-17)和式(3-18),可知:
按式(3-19)进行卷积运算,当时,滤波器的输出就是:
(3-21)
对式(3-20)进行Z变换,可得滤波器的系统函数
(3-22)
这是一个一阶系统。
图3-2示出这个系统的信号流图,相应的差分方程为
,(3-23)
按照此式进行递推运算,到了时刻,即可依据式(3-21)得到。
按照式(3-22)进行运算时,可先算好旋转因子,储存起来。
每次递推包含一次复数乘法。
按式(3-16)直接计算点离散付里叶变换,需要次实数乘法和次实数加法。
按照上述Goertzel算法,所需的实数乘法和实数加法都是次。
所以当不大时,上述算法的效率稍差[10]。
下面介绍改进的Goertzel算法,这种算法所需的实数乘法次数约为直接方法的一半。
图3-2用一阶系统实现Goertzel算法图3-3用二阶系统实现Goert算法
把式(3-22)的分子和分母都乘上因子,就得到第个滤波器的系统函数为
(3-24)
与此相应的信号流图示于图3-3。
由式(3-24)可见,滤波器是一个二阶系统,有一对复数共轭极点和一个复数零点。
为了便于运算,在图3-3所示的流图中,设立状态变量和。
按照图3-3计算时,步骤有二,即:
1.实现一对复数极点
输入点依次取,进行递推运算。
每次运算中,更新状态变量和。
作次迭代所需的计算量是次实数乘法和次实数加法。
2.实现复数零点。
是一个点序列,。
在点上。
计算状态变量和。
这时,按照图3-2算出滤波器的输出,此即。
所需的计算量是4次实数乘法和次实数加法[11]。
综上所述,计算一点需要进行次实数乘法和次实数加法。
这种算法要求的乘法次数约为直接算法的一半。
在这种较为有效的方案中,仍具有这样的优点,即必须计算和存储的系数只有和。
还要说明图3-3所示的算法的另一个优点。
当输入序列为实序列时,离散付里叶变换序列是对称的,即。
容易证明,图3-3的网络形式在计算时和计算时具有完全相同的极点,但前者的零点系数与后者的零点系数成复共轭关系。
由于零点仅在最后的迭代中实现,所以诸极点要求的次乘法和次加法可以用来计算离散付里叶变换的两个值。
因此,若用Goertzel算法计算离散付里叶变换的所有个点的值,需要的乘法次数近似为,加法次数近似为。
然而,它同直接计算离散付里叶变换一样,计算量仍然正比于。
4.快速傅里叶变换在信号处理中的理论应用
4.1连续时间信号的快速傅里叶变换
设是连续时间信号,并假设时,则其傅里叶变换由下式给出:
(4-1)
令是一固定的正实数,是一个固定的正整数。
当时,利用FFT算法可计算。
已知一个固定的时间间隔,选择让T足够小,使得每一个T秒的间隔内,的变化很小,则式中积分可近似为
(4-2)
假设足够大,对于所有的整数,幅值很小,则式(4-2)变为
(4-3)
当时,式(4-2)两边的值为
(4-4)
其中代表抽样信号的点。
最后令,则上式变为
(4-5)
首先用FFT算法求出,然后可用上式求出时的。
应该强调的是,式(4-3)只是一个近似表示,计算得到的只是一个近似值。
通过取更小的抽样间隔,或者增加点数,可以得到更精确的值。
如果时,幅度谱很小,对应于奈奎斯特抽样频率,抽样间隔选择比较合适。
如果已知信号只在时间区间内存在,可以通过对时的抽样信号补零,使足够大[12]。
将连续时间傅立叶变换进行数字近似,用函数fft(快速傅立叶算法)高效地计算这个近似值。
很多信号都能用(4-1)式连续时间傅立叶变换(CTFT)来表示。
利用MATLAB可以计算(CTFT)积分的数值近似。
利用在密集的等间隔t的样本上的求和来近似这个积分,就可以用函数fft高效地计算这个近似值。
所用的近似式是根据积分的定义得到的,即
(4-6)
对于一般信号,在足够小的τ下,上式右边的和式是对于CTFT积分的一个好的近似。
若信号对于和为零,那么这个近似式就能写成
(4-7)
式中,N为一整数。
可以利用函数fft对一组离散的频率计算上式中的和式。
如果N个样本是存在向量x内的话,那么调用函数X=tau*fft(x)就可以计算出
(4-8)
式中
以及N假设为偶数。
为了计算高效,fft在负的频率样本之前先产生正频率样本。
为了将频率样本置于上升的顺序,能用函数fftshift。
为了将存入X中的的样本排列成使就是对于,在上求得的CTFT,可用X=fftshift(tau*fft(x))。
例4-1利用FFT计算傅里叶变换
如图4-1所示的信号
其傅里叶变换为:
利用下面的命令,可得到的近似值和准确值。
图4-1连续时间信号x(t)
N=input('InputN:
');
T=input('InputT:
');
%计算X(w)近似值
t=0:
T:
2;
x=[t-1zeros(1,N-length(t))];
X=fft(x);
gamma=2*pi(N*T);
k=0:
10gamma;
Xapp=(1-exp(-i*k*gamma*T))(i*k*gamma)*X;
%计算真实值X(w)
w=0.05:
0.05:
10;
Xact=exp(-i*w)*2*i.*(w.*cos(w)-sin(w)).(w.*w);
plot(k*gamma,abs(Xapp(1:
length(k))),'o',w,abs(Xact));
legend('近似值','真实值');
xlabel('频率(rads)');ylabel('|X|')
运行程序后输入N=128,T=0.1,此时,得到实际的和近似的傅里叶变换的幅度谱如图4-2所示,此时近似值已经相当准确。
通过增加NT可以增加更多的细节,减少T使得到的值更精确。
再次运行程序后输入N=512,T=0.05,此时,得到实际的和近似的傅里叶变换的幅度谱如图4-3所示。
图4-2N=128,T=0.1时的幅度谱
图4-3N=512,T=0.05时的幅度谱
4.2FFT计算离散信号的线性卷积
已知两个离散时间信号与,取,对和右端补零,使得
(4-9)
利用FFT算法可以求得和的L点DFT,分别是和,利用DTFT卷积性质,卷积等于乘积的L点DFT反变换,这也可以通过FFT算法得到。
例4-2利用FFT计算线性卷积
已知,其中为单位阶跃序列,信号如图4-4所示。
由于当时,很小,故可以取为17;N取10,。
利用下面的Matlab命令,可得到、的卷积图形如图4-4所示。
subplot(3,1,1);
n=0:
16;
x=0.8.^n;
stem(n,x);
xlabel('n');ylabel('x[n]');
subplot(3,1,2);
n=0:
15;
y=[ones(1,10)zeros(1,6)];
stem(n,y);
xlabel('n');ylabel('y[n]')
subplot(3,1,3);
L=26;n=0:
L-1;
X=fft(x,L);Y=fft(y,L);
Z=X.*Y;z=ifft(Z,L);
stem(n,z);
xlabel('n');ylabel('z[n]')
图4-4信号x[n]、y[n]及其卷积z[n]=x[n]*y[n]
利用下面的Matlab命令,可得到信号x[n]、y[n]的幅度谱与相位谱如图4-5所示。
subplot(2,2,1);
L=26;k=0:
L-1;
n=0:
16;x