matlab信号与系统实验报告 下载本文

实验二 利用DFT分析离散信号频谱

一、 实验目的

应用离散傅里叶变换(DFT),分析离散信号的频谱。深刻理解DFT分析离散信号频谱的原理,掌握改善分析过程中产生的误差的方法。 二、 实验原理

根据信号傅里叶变换建立的时域与频域之间的对应关系,可以得到有限长序列的离散傅里叶变换(DFT)与四种确定信号傅里叶变换之间的关系(见教材),实现由DFT分析其频谱。 三、 实验内容

1. 利用FFT分析信号x(n)?cos(3?8n),n?0,1,...,31的频谱;

(1)、确定DFT计算的参数;本题中Ω/2π=3/16,则周期N=16,因为本题信号无直流分量,所以取样点数可为2*N=32,但必须保证都是独立的样点。 N=32;n=0:N-1; x=cos(3*pi/8*n); X=fft(x,N);

subplot(2,1,1);

stem(n,abs(fftshift(X)));

ylabel('Magnitude');xlabel('Frequency (rad)'); title('朱艺星 杨婕婕'); subplot(2,1,2); stem(n,angle(fftshift(X))); ylabel('Phase');

xlabel('Frequency(rad)');

9

附:另取N=16时: N=16;n=0:N-1; x=cos(3*pi/8*n); X=fft(x,N);

subplot(2,1,1);

stem(n-N/2,abs(fftshift(X))); ylabel('Magnitude');

xlabel('Frequency (rad)'); title('朱艺星 杨婕婕'); subplot(2,1,2);

stem(n-N/2,angle(fftshift(X))); ylabel('Phase');

xlabel('Frequency(rad)');

附:N取64时; N=64;n=0:N-1; x=cos(3*pi/8*n); X=fft(x,N);

subplot(2,1,1);

stem(n,abs(fftshift(X)));

ylabel('Magnitude');xlabel('Frequency (rad)');title('朱艺星 杨婕婕'); subplot(2,1,2);

stem(n,angle(fftshift(X))); ylabel('Phase');

xlabel('Frequency(rad)');

10

(2) 进行理论值与计算值比较,讨论信号频谱分析过程中误差原因及改善

方法。

答:在频谱分析过程中由于取样频率过低或者由于信号的截取长度不当将会产生误差。

取样频率过低,可能会产生混频现象,可以适当提高取样率,增加样点数,来减少混叠对频谱分析所造成的误差。对于连续周期信号,其时域取样必须满足时域取样定理:其取样点数K≥2*N+1(其中N为最高谐波分量),即kfo≥2Nfo+fo;fs≥2fm+fo。

截取信号长度不当,会产生功率泄露,对周期序列进行频谱分析时,为避免泄露应做到:截取的长度应取一个基本周期或基本周期的整数倍,若待分析的周期信号事先不知道其确切的周期,则可截取较长时间长度的样点进行分析,以减少功率泄露误差。当然,必须在取样频率满足取样定理的条件下进行,否则混叠与泄露同时存在给频谱分析造成困难。

本题x(n)?cos(3?8n)为周期信号,无直流分量,所以取样点数可为

2*N=32,但必须保证都是独立的样点。从取样点数N=32和N=16可以看出,取样点数的不同,会造成频率谱和相位谱的不同。当N=16时,n=3或-3时有幅度值,而在N=32时,n=-10和22时有幅度值,在N=64时,n=-20和44时有幅度值,得到在N=32时,其频谱已经和N=64时一致(刚好成2倍关系),且N=16时已经产生混频现象。综上得,本题取样点数可为32.

附:对于非周期连续信号,时域取样定理:fs≥2fm.频域取样定理:一个时间受限的信号其长度为2τ在频域取样间隔Fo<1/2τ条件下,能够从样点集合完全恢复原来信号的频谱。

2. 利用FFT分析信号x(n)?0.8nu(n)的频谱;

11

(1) 确定DFT计算的参数;当n取30时 n=0:30;x=(0.8).^n;subplot(2,1,1); stem(n,x);title('朱艺星 杨婕婕');

subplot(2,1,2);w=n-15;plot(w,abs(fftshift(fft(x))));

附:当n取60时

n=0:60;x=(0.8).^n;subplot(2,1,1);stem(n,x); title('朱艺星 杨婕婕');subplot(2,1,2); w=n-15;plot(w,abs(fftshift(fft(x))));

12