第03章-5 快速傅里叶变换(FFT)
- 格式:ppt
- 大小:1.99 MB
- 文档页数:37
⽂中内容均为个⼈理解,如有错误请指出,不胜感激前⾔先解释⼏个⽐较容易混淆的缩写吧FMT 快速莫⽐乌斯变化—>感谢stump提供多项式复数在介绍复数之前,⾸先介绍⼀些可能会⽤到的东西(好像画的不是很标准。
)定义设a ,b 为实数,i 2=−1,形如a +bi 的数叫复数,其中i 被称为虚数单位,复数域是⽬前已知最⼤的域在复平⾯中,x 代表实数,y 轴(除原点外的点)代表虚数,从原点(0,0)到(a ,b )的向量表⽰复数a +bi模长:从原点(0,0)到点(a ,b )的距离,即√a 2+b 2幅⾓:假设以逆时针为正⽅向,从x 轴正半轴到已知向量的转⾓的有向⾓叫做幅⾓运算法则加法:因为在复平⾯中,复数可以被表⽰为向量,因此复数的加法与向量的加法相同,都满⾜平⾏四边形定则(就是上⾯那个)乘法:⼏何定义:复数相乘,模长相乘,幅⾓相加代数定义:(a +bi )∗(c +di )=ac +adi +bci +bdi 2=ac +adi +bci −bd=(ac −bd )+(bc +ad )i单位根下⽂中,默认n 为2的正整数次幂在复平⾯上,以原点为圆⼼,1为半径作圆,所得的圆叫单位圆。
以圆点为起点,圆的n 等分点为终点,做n 个向量,设幅⾓为正且最⼩的向量对应的复数为ωn ,称为n 次单位根。
根据复数乘法的运算法则,其余n −1个复数为ω2n ,ω3n ,…,ωn n 注意ω0n =ωn n =1(对应复平⾯上以x 轴为正⽅向的向量)那么如何计算它们的值呢?这个问题可以由欧拉公式解决ωk n =cos k ∗2πn +i sin k ∗2πn例如图中向量AB 表⽰的复数为8次单位根单位根的幅⾓为周⾓的1n在代数中,若z n =1,我们把z 称为n 次单位根单位根的性质ωk n =cos k2πn +i sin k 2πn (即上⾯的公式)ω2k 2n =ωk n证明:ω2k 2n =cos2k ∗2π2n +i sin2k ∗2π2n =ωk nωk +n2n =−ωk n ωn2n =cos n 2∗2πn +i sin n 2∗2πn =cos π+i sin π=−1ω0n =ωn n =1讲了这么多,貌似跟我们的正题没啥关系啊。
快速傅里叶变换[编辑]维基百科,自由的百科全书跳转至:导航、搜索傅里叶变换Z变换傅里叶级数傅里叶变换离散傅里叶级数离散时间傅里叶变换离散傅里叶变换快速傅里叶变换分数傅里叶变换短时距傅立叶变换小波变换离散小波变换连续小波变换快速傅里叶变换(英语:Fast Fourier Transform, FFT),是离散傅里叶变换的快速算法,也可用于计算离散傅里叶变换的逆变换。
快速傅里叶变换有广泛的应用,如数字信号处理、计算大整数乘法、求解偏微分方程等等。
本条目只描述各种快速算法。
对于复数序列,离散傅里叶变换公式为:直接变换的计算复杂度是(参见大O符号)。
快速傅里叶变换可以计算出与直接计算相同的结果,但只需要的计算复杂度。
通常,快速算法要求n能被因数分解,但不是所有的快速傅里叶变换都要求n是合数,对于所有的整数n,都存在复杂度为的快速算法。
除了指数的符号相反、并多了一个1/n的因子,离散傅里叶变换的正变换与逆变换具有相同的形式。
因此所有的离散傅里叶变换的快速算法同时适用于正逆变换。
目录[隐藏]∙ 1 一般的简化理论∙ 2 快速傅里叶变换乘法量的计算∙ 3 Cooley-Tukey算法o 3.1 设计思想∙ 4 其他算法∙ 5 实数或对称资料专用的算法∙ 6 复杂度以及运算量的极限∙7 参考资料∙8 参阅一般的简化理论[编辑]假设一个M*N Sub-rectangular matrix S可分解成列向量以及行向量相乘:若有个相异的non-trivialvalues( where )有个相异的non-trivial values则S共需要个乘法。
Step 1:Step 2:简化理论的变型:也是一个M*N的矩阵。
若有个值不等于0,则的乘法量上限为。
快速傅里叶变换乘法量的计算[编辑]假设,其中彼此互质点DFT的乘法量为,则点DFT的乘法量为:假设,P是一个质数。
若点的DFT需要的乘法量为且当中 () 有个值不为及的倍数,有个值为及的倍数,但不为的倍数,则N点DFT的乘法量为:Cooley-Tukey算法[编辑]主条目:Cooley-Tukey快速傅里叶变换算法Cooley-Tukey算法是最常见的FFT算法。
FFT 快速傅里叶变换(Fast Fourier Transform) 是一种用于快速计算傅里叶变换的算法,是在傅里叶变换的基础上发展而来的。
FFT 算法被广泛应用于数字信号处理、图像处理、声音处理、卷积操作、解析几何等领域,它的高效性和实时性使得它成为了当今计算机科学领域不可或缺的一部分。
一、傅里叶变换简介傅里叶变换是将一个时域信号转换为频域信号的过程,其公式如下:$F(\omega)=\int_{-\infty}^{\infty}f(t)e^{-i\omega t}dt$其中,$f(t)$ 表示时域信号,$F(\omega)$ 表示频域信号,$\omega$ 表示角频率。
傅里叶变换可以分为连续傅里叶变换和离散傅里叶变换两种。
连续傅里叶变换仅适用于连续信号,而离散傅里叶变换适用于离散信号。
二、离散傅里叶变换离散傅里叶变换是一种将离散信号变换为频域信号的方法,其公式如下:$X_k=\sum_{n=0}^{N-1}x_n e^{-\frac{2\pi i}{N}kn},k=0,1,...,N-1$其中,$x_n(n=0,1,...,N-1)$ 表示原始离散信号,$X_k(k=0,1,...,N-1)$ 表示变换后的频域信号。
但是,使用该公式直接计算离散傅里叶变换的时间复杂度为$O(N^2)$,计算效率低下。
三、FFT 快速傅里叶变换FFT 快速傅里叶变换是一种基于DFT 离散傅里叶变换的高效算法,它的时间复杂度可以达到$O(NlogN)$,较之直接计算DFT 的时间复杂度要低得多。
FFT 算法的基本思想是将 DFT 分治成多个较小的 DFT,并利用其重复性降低运算次数。
1.蝴蝶运算蝴蝶运算是 FFT 算法的基本运算,通过它可以将 DFT 的计算复杂度降低为 $O(N)$。
蝴蝶运算的实质是将两个相邻点之间的信号进行乘法和加法运算,其公式如下:$X_k=X_{k1}+W_{N}^kX_{k2},X_{k+N/2}=X_{k1}-W_{N}^kX_{k2}$其中,$X_{k1}$ 表示 $X_k$ 中偶数项,$X_{k2}$ 表示 $X_k$ 中奇数项,$W_N$ 是DFT 的核函数。
快速傅立叶变换(FFT)快速傅立叶变换(FFT)4.1引言快速傅立叶变换(FFT)并不是一种新的变换,而是离散傅立叶变换(DFT)的一种快速算法。
DFT的计算在数字信号处理中非常有用。
例如在FIR滤波器设计中会遇到从h(n)求H(k)或由H(k)计算h(n),这就要计算DFT;信号的谱分析对通信、图像传输、雷达等都是很重要的,也要计算DFT。
因直接计算DFT的计算量与变换区间长度N的平方成正比,当N较大时,计算量太大。
自从1965年图基(J. W. Tukey)和库利(T. W. Coody)在《计算数学》(Math. Computation , Vol. 19, 1965)杂志上发表了著名的《机器计算傅立叶级数的一种算法》论文后,桑德(G. Sand)-图基等快速算法相继出现,又经人们进行改进,很快形成一套高效运算方法,这就是快速傅立叶变换简称FFT(Fast Fourier Transform)。
这种算法使DFT的运算效率提高1~2个数量级。
4.2 基2 FFT算法一、直接计算DFT的问题及改进的途径设x(n)为N点有限长序列,其DFT正变换为= , k=0,1,…,N-1其反变换(IDFT)x(n)= ,n=0,1,…,N-1二者的差别只在于的指数符号不同,以及差一个常数乘因子1/N,因而下面我们只讨论DFT正变换的运算量,反变换的运算量是完全相同的。
考虑x(n)为复数序列的一般情况,每计算一个X(k),需要N次复数乘法以及(N-1)次复数加法。
因此,对所有N个k值,共需N2次复数乘法及N(N-1)次复数加法运算。
所以直接计算DFT,乘法次数和加法次数都是和N2成正比的,当N很大时,运算量是很可观的,因而需要改进对DFT的计算方法,以减少运算次数。
下面讨论减少运算工作量的途径。
仔细观察DFT的运算就可看出,利用系数以下固有特性,就可减小DFT的运算量:(1)的对称性()*=(2)的周期性 ==(3)的可约性 ==由此可得:==,=-1,=-。
快速傅里叶变换[编辑]维基百科,自由的百科全书跳转至:导航、搜索傅里叶变换Z变换傅里叶级数傅里叶变换离散傅里叶级数离散时间傅里叶变换离散傅里叶变换快速傅里叶变换分数傅里叶变换短时距傅立叶变换小波变换离散小波变换连续小波变换快速傅里叶变换(英语:Fast Fourier Transform, FFT),是离散傅里叶变换的快速算法,也可用于计算离散傅里叶变换的逆变换。
快速傅里叶变换有广泛的应用,如数字信号处理、计算大整数乘法、求解偏微分方程等等。
本条目只描述各种快速算法。
对于复数序列,离散傅里叶变换公式为:直接变换的计算复杂度是(参见大O符号)。
快速傅里叶变换可以计算出与直接计算相同的结果,但只需要的计算复杂度。
通常,快速算法要求n能被因数分解,但不是所有的快速傅里叶变换都要求n是合数,对于所有的整数n,都存在复杂度为的快速算法。
除了指数的符号相反、并多了一个1/n的因子,离散傅里叶变换的正变换与逆变换具有相同的形式。
因此所有的离散傅里叶变换的快速算法同时适用于正逆变换。
目录[隐藏]• 1 一般的简化理论• 2 快速傅里叶变换乘法量的计算• 3 Cooley-Tukey算法o 3.1 设计思想• 4 其他算法• 5 实数或对称资料专用的算法• 6 复杂度以及运算量的极限•7 参考资料•8 参阅一般的简化理论[编辑]假设一个M*N Sub-rectangular matrix S可分解成列向量以及行向量相乘:若有个相异的non-trivialvalues( where )有个相异的non-trivial values则S共需要个乘法。
Step 1:Step 2:简化理论的变型:也是一个M*N的矩阵。
若有个值不等于0,则的乘法量上限为。
快速傅里叶变换乘法量的计算[编辑]假设,其中彼此互质点DFT的乘法量为,则点DFT的乘法量为:假设,P是一个质数。
若点的DFT需要的乘法量为且当中 ()有个值不为及的倍数,有个值为及的倍数,但不为的倍数,则N点DFT的乘法量为:Cooley-Tukey算法[编辑]主条目:Cooley-Tukey快速傅里叶变换算法Cooley-Tukey算法是最常见的FFT算法。
快速傅⾥叶变换(FFT)其实很早就想学习⼀下 FFT 了,不过⽐赛的时候和 FFT 有关的题⽬我都交给了队友,所以也没什么动⼒学- -今天看到 Gilbert Strang 的线性代数书中竟然也介绍了 FFT,就顺便学习了⼀下。
FFT 解决的问题我们知道,⼀个 $n-1$ 次多项式可以这样表⽰:$$\sum_{k=0}^{n-1}a_kx^k$$ 这种表⽰⽅法称为多项式的“系数表⽰法”。
容易看出,只要确定了 $a_0,a_1,\dots,a_{n-1}$ 的值,就能唯⼀确定⼀个 $n-1$ 次多项式。
事实上,⼀个 $n-1$ 次多项式还可以⽤“点值表⽰法”进⾏表⽰。
我们把多项式看成函数 $f(x)$,只要给出 $n$ 个点 $(x_1,f(x_1)),(x_2,f(x_2)),\dots,(x_n,f(x_n))$,且这 $n$ 个点的 x 值互不相同,我们也能唯⼀确定⼀个 $n-1$ 次多项式。
确定这个多项式的过程称为“插值”。
为什么 $n$ 个点可以唯⼀确定多项式呢?我们可以把给出的 $n$ 个点看作⼀个⽅程组,⽤矩阵表⽰为 $$\begin{bmatrix}1 & x_1 & x_1^2 & \dots & x_1^n \\ 1 & x_2 & x_2^2 & \dots & x_2^n \\ \vdots & \vdots & \vdots & \vdots & \vdots \\ 1 & x_n & x_n^2 & \dots &x_n^n\end{bmatrix} \begin{bmatrix}a_0 \\ a_1 \\ \vdots \\ a_{n-1}\end{bmatrix} = \begin{bmatrix}f(x_1) \\ f(x_2) \\ \vdots \\ f(x_n)\end{bmatrix}$$简记为 $Xa = f$,根据线性代数的知识我们知道,矩阵 $X$ 是范德蒙矩阵,其⾏列式为 $$\prod_{i\ne j}(x_i-x_j)$$ 显然,只要 x 的值各不相等,该矩阵的⾏列式就不为 0,说明该矩阵可逆,则我们能唯⼀确定多项式的系数向量为 $a = X^{-1}f$。
快速傅里叶变换(FFT)是一种非常重要的数学工具,它在信号处理、图像处理、计算机视觉等领域有着广泛的应用。
快速傅里叶变换算法的发明有利于对信号频谱的快速计算,从而加快了信号处理的速度。
在本文中,我们将从多个角度来探讨快速傅里叶变换,并深入理解它的原理和应用。
1. 什么是傅里叶变换?傅里叶变换是一种数学工具,它可以将一个函数从时间或空间域转换到频率域。
通过傅里叶变换,我们可以将一个信号拆分成不同频率的成分,从而更好地理解信号的特性。
在信号处理领域,傅里叶变换被广泛应用于声音、图像等数据的分析和处理中。
2. 快速傅里叶变换的原理快速傅里叶变换是一种高效的傅里叶变换算法,它可以在对数时间内完成信号频谱的计算。
其原理是基于分治法和递归思想的,通过将信号分解成子问题,并利用对称性质和周期性质,从而快速计算出频谱信息。
快速傅里叶变换算法的发明极大地加速了信号处理的速度,使得实时处理成为可能。
3. 快速傅里叶变换的应用快速傅里叶变换在信号处理、图像处理、通信等领域有着广泛的应用。
在音频处理中,通过快速傅里叶变换,我们可以快速计算出音频信号的频谱信息,从而进行音频分析、音频合成等操作。
在图像处理中,快速傅里叶变换可以用于图像的频域滤波、图像压缩等操作。
在通信领域,快速傅里叶变换也被应用于调制解调、信道估计等方面。
4. 我对快速傅里叶变换的个人观点和理解作为一种重要的数学工具,快速傅里叶变换在现代科学技术中扮演着不可或缺的角色。
它的高效性和广泛应用性使得它成为了信号处理领域中的核心算法之一。
虽然快速傅里叶变换算法本身较为复杂,但通过对其原理和应用的深入理解,我们可以更好地利用这一工具,为实际问题提供更好的解决方案。
总结在本文中,我们对快速傅里叶变换进行了全面的探讨,从傅里叶变换的基本概念到快速傅里叶变换算法的原理和应用,希望读者能更全面、深刻和灵活地理解这一重要的数学工具。
通过对快速傅里叶变换的研究,我们可以更好地处理和分析信号数据,为实际问题的解决提供更好的方法和工具。
FFT 程序设计报告快速傅里叶变换法(FFT )是离散傅立叶变换的一种快速计算方法,它能使N 点DFT 的乘法计算量由N 2次降为N N2log 2次。
下图是采样点数为8点FFT 时间抽取算法信号流图,本程序也是以这种形式设计的。
程序设计的基本思路是在程序开始时刻要求输入采样点数,如果采样点数是2的整数次方(不包括0次方),则要求输入采样点的数值,并根据采样点数分配响应的数组大小,计算迭代次数。
然后对采样点进行逆二进制排序,再按上图所示的算法进行计算,程序流程图如下图所示:本程序运用VC 语言对程序进行设计,下面分别对程序设计中复数类的应用,判断和求迭代次数,逆二进制排序,蝶形运算进行具体说明。
1. 复数类的应用C 语言本身并不包含复数数据类型,但C 语言可以根据需要定义自己的数据类型,本程序定义了一个复数结构体complex ,包括实部real 和虚部img 两部分,代码如下: typedef struct { double real; double img; }complex;在FFT 程序设计中,复数类主要被用来计算两复数的加法和乘法以及旋转因子Wk N,其中Nj NW/2π-=,式中N=2的m+1次方,m 代表计算流图的第m 级,而k 代表第k 次蝶形运算,由于C 中的math.h 函数库中没有带参数的复数运算函数,所以本程序编写了带参数的复数运算cw(double x,double y),用于计算Nj NW/2π-=,设计的基本思路,首先把e 的次幂用欧拉公式化成三角函数,然后化复数乘法和除法运算为几个复数基本单元的加法运算和除法运算,其中运算的次数由函数输入参量double x 决定。
函数mul(complex x1, complex x2)用于计算复数的乘运算。
2. 判断和求迭代次数本程序编写iternumb(int numb)函数对采样点数进行判断,如果采样点数不符合2的整数次方或采样点数为1或0,则跳出程序,程序设计基本思路是对输入采样点数的十进制形式进行模2运算和除法运算,在除法运算结果大于1之前,一旦模2运算的结果等于1,则说明输入采样点数不符合要求,而如果符合要求,则把出发结果存入数组当中,函数代码如下:int iternumb(int numb) {int iternumb1=0;if((numb==0)||(numb==1)) {printf("numb error!\n"); exit(0); }while ((numb!=0)&&(numb!=1)) {if (numb%2) {printf("numb error!\n"); exit(0); }numb=numb/2;iternumb1=iternumb1+1; }return iternumb1; }3. 码位倒置在逆二进制排序程序中,设置for 循环分别将输入数据数组input[i]的索引号i 进行模2运算,所得的结果按逆序存入inverse[ ]数组(存入inverse[ ]数组的顺序是从数组尾部开始)。