预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10
亲,该文档总共13页,到这已经超出免费预览范围,如果喜欢就直接下载吧~
如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
实验1FFT算法分析实验2010271052一、实验目的1加深对FFT的理解,自己动手编写一个基2的DIF--FFT函数ditfft。2进一步掌握卷积定理,用ditfft实现卷积。二、实验原理对于有限长离散数字信号{x[n]},0nN-1,其离散谱{x[k]}可以由离离散傅氏变换(DFT)求得。可以方便的把它改写为如下形式:WN是周期性的,且周期为N,常用表达式WN取代W以便明确其周期是N。由DFT的定义可以看出,在x[n]为复数序列的情况下,完全直接运算N点DFT需要(N-1)2次复数乘法和N(N-1)次加法。因此,对于一些相当大的N值(如1024)来说,直接计算它的DFT所作的计算量是很大的。FFT的基本思想在于,将原有的N点序列序列分成两个较短的序列,这些序列的DFT可以很简单的组合起来得到原序列的DFT。例如,若N为偶数,将原有的N点序列分成两个(N/2)点序列,那么计算N点DFT将只需要约[(N/2)2•2]=N2/2次复数乘法。即比直接计算少作一半乘法。因子(N/2)2表示直接计算(N/2)点DFT所需要的乘法次数,而乘数2代表必须完成两个DFT。上述处理方法可以反复使用,即(N/2)点的DFT计算也可以化成两个(N/4)点的DFT(假定N/2为偶数),从而又少作一半的乘法。这样一级一级的划分下去一直到最后就划分成两点的FFT运算的情况。比如,一个N=8点的FFT运算按照这种方法来计算FFT可以用下面的流程图来表示:三、实验步骤1、在在Matlab中运行下面的仿真程序,程序中定义两个正弦信号,F1为100Hz/1v,F2为6kHz/1v,将两个信号叠加后作FFT:plot(S);title('原始信号');figure;Y=fft(S,N);%做FFT变换Ayy=(abs(Y));%取模plot(Ayy(1:N));%显示原始的FFT模值结果title('FFT模值');figure;Ayy=Ayy/(N/2);%换算成实际的幅度Ayy(1)=Ayy(1)/2;%直流分量的幅值单独处理F=([1:N]-1)*Fs/N;%换算成实际的频率值plot(F(1:N/2),Ayy(1:N/2));%显示换算后的FFT模值结果title('幅度-频率曲线图');2、在实验箱中通过编程实现FFT:(1)实验箱上电,启动CCS,此时仿真器上的“绿色灯”应点亮;(2)点击菜单Project中的Open菜单项,选中E:\FFT\ExpFFT01下的ExpFFT01.pjt,打开源程序;(3)单击“+”号,展开源程序,双击打开文件ExpFFT01.c;(4)main中0x3000是A/D转换数据存放的起始地址,0x3080是FFT变换结果的写入地址;externvoidInitC5402(void);externvoidOpenMcBSP(void);externvoidCloseMcBSP(void);externvoidREADAD50(void);externvoidWRITEAD50(void);/***********************************************************************MainFunctionProgram***********************************************************************/#include"stdio.h"#include"math.h"voidkfft(pr,pi,n,k,fr,fi,l,il)intn,k,l,il;doublepr[],pi[],fr[],fi[];{intit,m,is,i,j,nv,l0;doublep,q,s,vr,vi,poddr,poddi;for(it=0;it<=n-1;it++){m=it;is=0;for(i=0;i<=k-1;i++){j=m/2;is=2*is+(m-2*j);m=j;}fr[it]=pr[is];fi[it]=pi[is];}pr[0]=1.0;pi[0]=0.0;p=6.283185306/(1.0*n);pr[1]=cos(p);pi[1]=-sin(p);if(l!=0)pi[1]=-pi[1];for(i=2;i<=n-1;i++){p=pr[i-1]*pr[1];q=pi[i-1]*pi[1];s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);pr[i]=p-q;pi[i]=s-p-q;}for(it=0;it<=n-2;it=it+2){vr=fr