1、实验二 用FFT进行谱分析,实验目的,(1)进一步加深DFT算法原理和基本性质的理解(因为FFT只是DFT的一种快速算法,所以FFT的运算结果必然满足DFT的基本性质)。熟悉FFT程序结构及编程方法。 (2)熟悉应用FFT对确定信号进行谱分析方法,熟悉FFT算法原理和FFT子程序的应用。 (3)学习用FFT对连续信号和时域离散信号进行谱分析的方法,了解可能出现的分析误差及其原因,以便在实际中正确应有FFT。,实验原理及方法,xa(t)的频谱,取样,X(k)是X(ej)在0,2区间上的N个等间隔采样点,一个序列x(n)的离散时间傅里叶变换就是它的频谱函数。,实验内容及步骤(Matlab DFT)
2、,function y=mydft(x) % y=mydft(x) % x为给定时间序列 % y为x的离散傅立叶变换 N=length(x); % 输入序列的长度 n=0:N-1; k=n; % 确定时域位置序列n和频域位置序列k WN=exp(-j*2*pi/N); % 计算DFT所需的旋转因子 nk=n*k; WNnk=WN.nk; % 构成旋转因子矩阵 Xk=x*WNnk;y=Xk; % 按DFT定义计算x的傅立叶变换,实验内容及步骤(Matlab FFT),function y=myditfft(x) % y=myditfft(x) % 本程序对输入序列 x 实现DIT-FFT基2算法
3、,点数取大于等于x长度的2的幂次 % x为给定时间序列 % y为x的离散傅立叶变换 m=nextpow2(x); N=2m; % 求x的长度对应的2的最低幂次m if length(x)N % 若x的长度不是2的幂,补零到2的整数幂x=x,zeros(1,N-length(x);end nxd=bin2dec(fliplr(dec2bin(1:N-1,m)+1; % 求1:2m数列的倒序 y=x(nxd); % 将x倒序排列作为y的初始值,实验内容及步骤(Matlab FFT),for mm=1:m % 将DFT作m次基2分解,从左到右,对每次分解作DFT运算 Nmr=2mm;u=1; % 旋
4、转因子u初始化为WN0=1 WN=exp(-i*2*pi/Nmr); % 本次分解的基本DFT因子WN=exp(-i*2*pi/Nmr)for j=1:Nmr/2 % 本次跨越间隔内的各次蝶形运算for k=j:Nmr:N % 本次蝶形运算的跨越间隔为Nmr=2mmkp=k+Nmr/2; % 确定蝶形运算的对应单元下标t=y(kp)*u; % 蝶形运算的乘积项y(kp)=y(k)-t; % 蝶形运算y(k)=y(k)+t; % 蝶形运算endu=u*WN; % 修改旋转因子,多乘一个基本DFT因子WNend end,算法时间比较,K=input(K=); %设定数据长度的2的幂次K x=ran
5、dn(1,2K); %先生成一个x向量 tic,X=fft(x),toc %测试fft子程序所需运行时间 tic,X=myditfft(x),toc %测试myditfft子程序所需运行时间 tic,X=mydft(x),toc %测试mydft子程序所需运行时间,例:已知序列x(n)=2sin(/3n)+3cos(0.25 n),0n 127,试绘制x(n)及它的离散傅里叶变换谱图。,clear all N=128; n=0:N-1; xn=2*sin(pi/3)*n)+3*cos(0.25*pi*n); XK=fft(xn,N); magXK=abs(XK); phaXK=angle(XK
6、); subplot(2,1,1);stem(n,xn); xlabel(n);ylabel(x(n); k=0:length(magXK)-1; subplot(2,1,2);stem(k,magXK); xlabel(k);ylabel(|X(k)|);,实验内容及步骤,(1)用matlab编程产生并画出信号x1(n)、x2(n)、x3(n)、x4(n)、x5(n)。,(2)用matlab编制FFT函数对上述信号进行频谱分析,并画出上述信号谱图。,实验报告要求,1. 简述实验原理及目的。 2. 对上述的信号逐个进行谱分析。给出所编制的实验程序清单,并附上必要的说明,给出实验信号序列的时域和频域波形,说明FFT长度N改变对频谱的影响。 3.简要回答以下问题: 在N=8时,x2(n)和x3(n)的幅频特性会相同吗?为什么?N=16呢? FFT在什么条件下也可以用来分析周期信号序列的频谱?如果正弦信号系统sin(2f0k),f0=0.1Hz,用16点FFT来做DFT运算,得到的频谱是信号本身的真实谱吗?为什么?,