FFT应用——傅立叶变换实验报告.doc
文本预览下载声明
快速傅立叶变换FFT应用与验证
1、介绍
从纯粹的数学意义上看,傅立叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。
而快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。
有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化成有限长序列.但其计算量太大,很难实时地处理问题,因此引出了快速傅里叶变换(FFT). 1965年,Cooley和Tukey提出了计算离散傅里叶变换(DFT)的快速算法,将DFT的运算量减少了几个数量级。从此,对快速傅里叶变换(FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随FFT的出现和发展而迅速发展。根据对序列分解与选取方法的不同而产生了FFT的多种算法,基本算法是基2DIT和基2DIF。FFT在离散傅里叶反变换、线性卷积和线性相关等方面也有重要应用。
快速傅氏变换(FFT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
设x(n)为N项的复数序列,由DFT变换,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N项复数序列的X(m),即N点DFT变换大约就需要N^2次运算。当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT中,利用WN的周期性和对称性,把一个N项序列(设N=2k,k为正整数),分为两个N/2项的子序列,每个N/2点DFT变换需要(N/2)2次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT变换。这样变换以后,总的运算次数就变成N+2(N/2)2=N+N2/2。继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要Nlog2N次的运算,N在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT的优越性。
2、FFT的验证
2.1 验证思路:
1).读入长度为N的序列信号。
2).调用信号产生子程序产生实验信号。
3).利用函数FFT1D,对其进行快速傅立叶变换, F1=fft1d(f).
4).显示变换后的实验数据。
5).对变换后的信号,利用函数IFFT1D,对其进行傅立叶逆变换, F2=fft1d(f).
6).显示变换了中心后的数据,比较和原来的输入信号是否相同。
2.2.程序清单:
傅立叶变换函数fft1d
void fft1d(int flag,int n, double fr[], double fi[],double tblSin[], double tblCos[])
{
int i,m,iw,j=0,l,lp,lp2,n2,k;
double c,s,wr,wi,xa,ya;
for(i=0;in-1;i++)
{
if (i j)
{
xa = fr[i];
fr[i] = fr[j];
fr[j] = xa;
ya = fi[i] ;
fi[i] = fi[j];
fi[j] = ya;
}
n2 = n / 2;
while (j = n2)
{
j = j - n2 ;
n2 = n2 / 2;
}
j += n2;
}
m = 0;
n2 = n;
while(n2!=1)
{
m += 1 ;
n2 = n2/2;
}
for(l=1;l=m;l++)
{
lp = (int)pow(2.0,l);
lp2 = lp /2.0;
显示全部