欢迎来到天天文库
浏览记录
ID:57312241
大小:636.50 KB
页数:15页
时间:2020-08-11
《实验二 用FFT作谱分析.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验二用FFT作谱分析1.实验目的(1)进一步加深DFT算法原理和基本性质的理解(因为FFT只是DFT的一种快速算法,所以FFT的运算结果必然满足DFT的基本性质)。(2)熟悉FFT算法原理和FFT子程序的应用。(3)学习用FFT对连续信号和时域离散信号进行谱分析的方法,了解可能出现的分析误差及其原因,以便在实际中正确应用FFT。2.实验步骤(1)复习DFT的定义、性质和用DFT作谱分析的有关内容。(2)复习FFT算法原理与编程思想,并对照DIT-FFT运算流图和程序框图,读懂本实验提供的FFT子程序。(3)编制信号产生子程序,产生以下典型信号供谱分析用:(4)编写主程序。/*DIT-
2、FFT函数(C语言)*/fft—基2DIT—FFT函数要求:指向复数数组指针X,FFT长度为2m,m为正整数FFT输出结果放在输入复数数组中。/*计算N点FFT子程序*//*xr:=信号序列实部,xi:=信号序列虚部,N:=FFT变换区间长度N=2^M*//*如果信号长度小于N,应该给xr,xi后面补0*//*计算如果X(K)的实部和虚部分别储存在数组xr和xi中*/VoidFft(doublexr[],doublexi[],intN,intM){intL,B,J,P,k,i;doublerPartKB,iPartKB;doublerCf[128],iCf[128]/*计算旋转因子*/
3、doublePI2=8.0*atan(1.0);for(i=0;i4、+B]*rCf[P]+xr[k+B]*iCf[P]xr[k+B]=xr[k]-rPartKB;xi[k+B]=xi[k]-iPartKB;xr[k]=xr[k]+rPartKB;xi[k]=xi[k]+iPartKB;}}}}/*倒序子程序*/voidChangeOrdor(doublexr[],doublexi[],intN){intLH,N1,I,J,K;doubleT;LH=N/2;J=LH;N1=N–2;for(I=1;I<=N1;I++){if(I5、;while(J>=K){J=J-K;K=(int)(K/2+0.5);}J=J+K;}}(1)按实验内容要求,上机实验并写出实验报告。本实验采用的是MATLAB语言,因此FFT子程序直接调用MATLAB语言中的FFT函数就可以实现。下面给出完整的MATLAB程序%实验二,用FFT做谱分析b=menu('请选择信号x1(n)--x8(n)','x1(n)','x2(n)','x3(n)','x4(n)','x5(n)','x6(n)','x7=x4+x5','x8=x4+jx5','Exit');ifb==9b=0;endi=0;closeall;while(b)ifb==6temp=6、menu('请选择FFT变换区间长度N','N=16','N=32','N=64');iftemp==1N=16;elseiftemp==2N=32;elseN=64;endfs=64;n=0:N-1;x=cos(8*pi*n/fs)+cos(16*pi*n/fs)+cos(20*pi*n/fs);elsetemp=menu('请选择FFT变换区间长度N','N=8','N=16','N=32');iftemp==1N=8;elseiftemp==2N=16;elseN=32;endifb==1x=[11110000];elseifb==2x=[12344321];elseifb==37、x=[43211234];elseifb==4n=0:N-1;x=cos(0.25*pi*n);elseifb==5n=0:N-1;x=sin((pi*n)/8);elseifb==7n=0:N-1;x=cos(n*pi/4)+sin(n*pi/8);elseifb==8n=0:N-1;x=cos(n*pi/4)+j*sin(n*pi/8);endendendendendendendend%%TOCalculateFFTf=fft(x,N);i
4、+B]*rCf[P]+xr[k+B]*iCf[P]xr[k+B]=xr[k]-rPartKB;xi[k+B]=xi[k]-iPartKB;xr[k]=xr[k]+rPartKB;xi[k]=xi[k]+iPartKB;}}}}/*倒序子程序*/voidChangeOrdor(doublexr[],doublexi[],intN){intLH,N1,I,J,K;doubleT;LH=N/2;J=LH;N1=N–2;for(I=1;I<=N1;I++){if(I5、;while(J>=K){J=J-K;K=(int)(K/2+0.5);}J=J+K;}}(1)按实验内容要求,上机实验并写出实验报告。本实验采用的是MATLAB语言,因此FFT子程序直接调用MATLAB语言中的FFT函数就可以实现。下面给出完整的MATLAB程序%实验二,用FFT做谱分析b=menu('请选择信号x1(n)--x8(n)','x1(n)','x2(n)','x3(n)','x4(n)','x5(n)','x6(n)','x7=x4+x5','x8=x4+jx5','Exit');ifb==9b=0;endi=0;closeall;while(b)ifb==6temp=6、menu('请选择FFT变换区间长度N','N=16','N=32','N=64');iftemp==1N=16;elseiftemp==2N=32;elseN=64;endfs=64;n=0:N-1;x=cos(8*pi*n/fs)+cos(16*pi*n/fs)+cos(20*pi*n/fs);elsetemp=menu('请选择FFT变换区间长度N','N=8','N=16','N=32');iftemp==1N=8;elseiftemp==2N=16;elseN=32;endifb==1x=[11110000];elseifb==2x=[12344321];elseifb==37、x=[43211234];elseifb==4n=0:N-1;x=cos(0.25*pi*n);elseifb==5n=0:N-1;x=sin((pi*n)/8);elseifb==7n=0:N-1;x=cos(n*pi/4)+sin(n*pi/8);elseifb==8n=0:N-1;x=cos(n*pi/4)+j*sin(n*pi/8);endendendendendendendend%%TOCalculateFFTf=fft(x,N);i
5、;while(J>=K){J=J-K;K=(int)(K/2+0.5);}J=J+K;}}(1)按实验内容要求,上机实验并写出实验报告。本实验采用的是MATLAB语言,因此FFT子程序直接调用MATLAB语言中的FFT函数就可以实现。下面给出完整的MATLAB程序%实验二,用FFT做谱分析b=menu('请选择信号x1(n)--x8(n)','x1(n)','x2(n)','x3(n)','x4(n)','x5(n)','x6(n)','x7=x4+x5','x8=x4+jx5','Exit');ifb==9b=0;endi=0;closeall;while(b)ifb==6temp=
6、menu('请选择FFT变换区间长度N','N=16','N=32','N=64');iftemp==1N=16;elseiftemp==2N=32;elseN=64;endfs=64;n=0:N-1;x=cos(8*pi*n/fs)+cos(16*pi*n/fs)+cos(20*pi*n/fs);elsetemp=menu('请选择FFT变换区间长度N','N=8','N=16','N=32');iftemp==1N=8;elseiftemp==2N=16;elseN=32;endifb==1x=[11110000];elseifb==2x=[12344321];elseifb==3
7、x=[43211234];elseifb==4n=0:N-1;x=cos(0.25*pi*n);elseifb==5n=0:N-1;x=sin((pi*n)/8);elseifb==7n=0:N-1;x=cos(n*pi/4)+sin(n*pi/8);elseifb==8n=0:N-1;x=cos(n*pi/4)+j*sin(n*pi/8);endendendendendendendend%%TOCalculateFFTf=fft(x,N);i
此文档下载收益归作者所有