..实验二利用DFT分析离散信号频谱1.利用FFT分析信号的频谱;(1)确定DFT计算的参数;(2)进行理论值与计算值比较,讨论信号频谱分析过程中误差原因及改善方法。答:(1)信号x[k]的周期N=16,角频率w0=2*pi/N=pi/8;作fft的点数N=16。(2)计算程序:N=16;k=0:N-1;x=cos(3*pi/8*k);X=fft(x,N);subplot(2,1,1);stem(k-N/2,abs(fftshift(X)));ylabel('幅度谱')xlabel('m')subplot(2,1,2);stem(k-N/2,angle(fftshift(X)));ylabel('相位谱')xlabel('m')计算结果:我们还可以利用ifft函数进行相应的傅里叶反变换,以得到时域上的x[k],分析程序如下:N=16;k=0:N-1;x1=cos(3*pi/8*k);X=fft(x1,N);subplot(2,1,1)31,1,0),8π3cos(][kkkx-8-6-4-20246802468幅度谱m-8-6-4-202468-4-2024相位谱m..stem(k,x1)ylabel('傅里叶变换前的时域波形')xlabel('k')x2=ifft(X,N);subplot(2,1,2)stem(k,x2)ylabel('傅里叶反变换后的时域波形')xlabel('k')结果如下:可以看出:经过傅里叶变换和相应反变换后的信号与原信号的时域波形完全相同。2.利用FFT分析信号的频谱;(1)确定DFT计算的参数;(2)进行理论值与计算值比较,讨论信号频谱分析过程中误差原因及改善方法。答:(1)信号无限长,因此需要对其进行截短。该序列单调衰减,当k=10时,序列已几乎衰减为0,因此只取序列在区间[0,10]上的数值进行分析。(2)计算程序:k=0:10;x=(1/2).^k;subplot(2,1,1);stem(k,x);subplot(2,1,2);w=k-5;plot(w,abs(fftshift(fft(x))));ylabel('幅度谱')051015-1-0.500.51傅里叶变换前的时域波形k051015-1-0.500.51傅里叶反变换后的时域波形k][)(][21kukxk..xlabel('w')计算结果:3.有限长脉冲序列,利用FFT分析其频谱,并绘出其幅度谱与相位谱。答:计算程序:k=0:5;x=[233105];w=k-3;subplot(2,1,1);stem(w,abs(fftshift(fft(x,6))));ylabel('幅度谱')xlabel('w')subplot(2,1,2);stem(w,angle(fftshift(fft(x,6))));ylabel('相位谱')xlabel('w')计算结果:01234567891000.51-5-4-3-2-10123450.511.52幅度谱w]5,4,3,2,1,0;5,0,1,3,3,2[][kkx..4.某周期序列由3个频率组成:,利用FFT分析其频谱。如何选取FFT的点数N?此3个频率分别对应FFT计算结果X[m]中的哪些点?若选取的N不合适,FFT计算出的频谱X[m]会出现什么情况?答:序列x[k]的周期为N=32,取FFT的点数N=32进行频谱分析,程序如下:N=32;k=0:N-1;x=cos(7*pi/16*k)+cos(9*pi/16*k)+cos(pi/2*k);X=fft(x,N);subplot(2,1,1);stem(k-N/2,abs(fftshift(X)));ylabel('幅度谱')xlabel('m')subplot(2,1,2);stem(k-N/2,angle(fftshift(X)));ylabel('相位谱')xlabel('m’)分析结果:-3-2.5-2-1.5-1-0.500.511.52051015幅度谱w-3-2.5-2-1.5-1-0.500.511.52-4-2024相位谱w)2πcos()16π9cos()167πcos(][kkkkx..信号x[k]的三个频率分别对应FFT计算结果X[m]中的m=7,m=9,m=8对于离散周期序列进行FFT频谱分析时取计算的点数为序列的周期N,如果计算的点数不是此离散周期序列的周期时,X[m]会发生变化,此时并不表示序列x[k]的频谱,而相当于将序列x[k]的周期扩大或者缩减后得到新信号的频谱。在本例中,若取N=2032,则可得到下图所示的幅度谱和相位谱:同理,若取N=4032,则可以得到另外不同的幅度谱和相位谱,这里不再详细画出。-20-15-10-505101505101520幅度谱m-20-15-10-5051015-4-2024相位谱m-10-8-6-4-202468100510幅度谱m-10-8-6-4-20246810-2-1012相位谱m..5.某离散序列由3个频率组成:利用FFT分析其频谱。(1)对x[k]做64点FFT,绘出信号频谱,能分辨出其中的两个频率吗?(2)对x[k]补零到256点后计算FFT,能分辨出其中的两个频率吗?(3)选用非矩形窗计算FFT,能够分辨出其中的两个频率吗?(4)若不能够很好地分辨出其中的两个频谱,应采取哪些措施?答:(1)对x[k]做64点FFT,程序如下:k=0:63;x=cos(2*pi/15*k)+0.75*cos(2.3*pi/15*k);X=fft(x,64);stem(k-32,abs(fftshift(X)))ylabel('幅度谱')xlabel('m')可以得到幅度谱和相位谱如下:很明显,根据上面的幅度谱不能分辨出信号x[k]中的两个频率。630),15π3.2cos(75.0)152πcos(][kkkkx-40-30-20-10010203040051015202530幅度谱m-40-30-20-10010203040-2-1012相位谱m..(2)对x[k]补零后做256点FFT:k=0:63;x=cos(2*pi/15*k)+0.75*cos(2.3*pi/15*k);X=fft(x,256);n=-128:127stem(n,abs(fftshift(X)))运行结果如下:根据上面的幅度谱不能分辨出信号x[k]的两个频率。(3)选用非矩形窗(主要有汉宁窗、哈明窗、布拉克曼窗和凯塞窗)计算fft,能够分辨其中的两个频率,具体实现过程我将在下学期和数字信号处理这门课一起学习。6.已知序列利用FFT分析下列信号的幅频特性,频率范围为,N=500点。(1)(2)(3)若将上述x[k]乘以cos(pk/2),重做(1)和(2)。答:序列x[k]是关于原点左右对称的,因此我只考虑原点右侧信号的幅频特性。程序如下:k=0:50;-150-100-50050100150051015202530others,050,e][2)1.0(2kkxk)π,π[Ω]2[][kxky]4[][kxkg..x=exp(-0.5*(0.1*k).^2);X=fft(x,500);n=-250:249;subplot(3,1,1)stem(n,abs(fftshift(X)))ylabel('x[k]的傅里叶变换')xlabel('n')k=0:25;x=exp(-0.5*(0.2*k).^2);X=fft(x,500);n=-250:249;subplot(3,1,2)stem(n,abs(fftshift(X)))ylabel('x[2k]的傅里叶变换')xlabel('n')k=0:12;x=exp(-0.5*(0.4*k).^2);X=fft(x,500);n=-250:249;subplot(3,1,3)stem(n,abs(fftshift(X)))ylabel('x[4k]的傅里叶变换')xlabel('n')根据上述程序,我得到的上述三个信号的幅频特性如下图所示:..可以看出:信号在时域上进行压缩,对应则在频域上进行扩展,时域和频域上的变换存在着一种相反的关系。(3)若将上述x[k]乘以cos(pk/2),取p=3,则与前问相同进行频谱分析,程序如下:symspp=3;k=0:50;x=exp(-0.5*(0.1*k).^2).*cos(0.5*p*k);X=fft(x,500);n=-250:249;subplot(3,1,1)stem(n,abs(fftshift(X)))ylabel('x[k]的傅里叶变换')xlabel('n')k=0:25;x=exp(-0.5*(0.2*k).^2).*cos(p*k);X=fft(x,500);n=-250:249;subplot(3,1,2)stem(n,abs(fftshift(X)))ylabel('x[2k]的傅里叶变换')xlabel('n')-250-200-150-100-50050100150200250051015x[k]的傅里叶变换n-250-200-150-100-500501001502002500510x[2k]的傅里叶变换n-250-200-150-100-50050100150200250024x[4k]的傅里叶变换n..k=0:12;x=exp(-0.5*(0.4*k).^2).*cos(2*p*k);X=fft(x,500);n=-250:249;subplot(3,1,3)stem(n,abs(fftshift(X)))ylabel('x[4k]的傅里叶变换')xlabel('n')运行结果如下图:四.实验思考题1.既然可直接由DTFT定义计算序列DTFT,为何利用DFT分析序列的频谱?答:在时域,两者都是离散时间序列,在频域,DTFT是连续周期曲线X(jw),而DFT则是与时间序列同长的离散序列频谱X(k)。matlab无法计算连续变量w,只能在范围内把w赋值为很密的、长度很长的向量k*dw来近似连续变量。也就是说,能够用计算机以很高效率计算的,只有离散傅里叶变换DFT,所以利用DFT分析序列的频谱。2.若序列持续时间无限长,且无解析表达式,如何利用DFT分析其频谱?答:当序列为无限长时,需要根据能量分布,进行截短。确定作FFT的点数N,然后使用fft函数作N点FFT计算X[m]。3.在利用DFT分析离散信号频谱时,会出现哪些误差?如何克服或改善?答:DFT是DTFT在主值区间的等间隔采样,DTFT则是DFT在密集的频点上的插值,并作周-250-200-150-100-500501001502002500510x[k]的傅里叶变换n-250-200-150-100-500501001502002500246x[2k]的傅里叶变换n-250-200-150-100-500501001502002500123x[4k]的傅里叶变换n..期延拓。插值肯定存在精度的问题,因此用DFT分析离散信号频谱时会产生误差,我认为可以通过增加作fft的点数N来减小插值间隔,从而克服或改善因插值带来的误差。4.在利用DFT分析离散信号频谱时,如何选择窗函数?答:(1)若序列为离散周期序列,则先确定离散周期序列x[k]的基本周期N,然后利用fft函数求其一个周期的DFT,得到X[m];(2)若序列为离散非周期序列,当序列为无限长时,需要根据能量分布,首先进行截短。然后确定fft的点数N,使用fft函数作N点FFT计算X[m];(3)如果序列中有两个非常接近的频率,用矩形窗进行fft计算难以分辨时,可以通过选择合适的非矩形窗(汉宁窗、哈明窗、布拉克曼窗和凯塞窗)进行计算,从而进行频率的分辨。5.序列补零和增加序列长度都可以提高频谱分辨率吗?两者有何本质区别?答:序列补零和增加序列长度都可以提高频谱分辨率,因为二者都可以增加作fft的点数N,N增大,ω就减小,所以频谱被更加的细分,分辨率提高;两者的本质区别:序列补零后用fft计算得到的是补零后序列