数字信号处理实验报告 专 业: 姓 名: 学 号: 指导教师: 实验一 序列、频谱、卷积一、 实验目的1. 掌握序列的输入方法;2. 熟悉不同序列的特征;3. 了解确定性信号谱分析的方法;4. 验证卷积的计算过程;二、 实验要求1. 利用matlab程序,生成几种常用的序列,如矩形序列,单位脉冲序列;2. 绘制图形,观察序列特征;3. 研究其频率特性,绘制图形,观察频率响应特征;4. 利用matlab程序,验证卷积的过程;三、 实验步骤1. 矩形序列(1)生成长度为N的矩形序列,观察并记录生成的图形;n=1:50x=sign(sign(10-n)+1);close all;subplot(3,1,1);stem(x);title('单位矩形信号序列');(2)研究其频率特性,,分别研究其幅频特性和相频特性,观察并记录生成的图形;k=-25:25;X=x*(exp(-j*pi/25)).^(n'*k);magX=abs(X); %绘制x(n)的幅度谱subplot(3,1,2);stem(magX);title('单位矩形信号的幅度谱');angX=angle(X); %绘制x(n)的相位谱subplot(3,1,3);stem(angX) ; title ('单位矩形信号的相位谱')答:根据以上两个源程序得到的图形如下图1.1:图1.1分析:幅度谱可以发现其幅度呈偶对称,而相位谱与幅度普均为离散信号。
其频率特性就是通过傅里叶变换得来的,是用频率信息表示时域信息,与连续信号的相同的矩形函数的频率特性对应,只不过一个是离散的一个是连续的2. 单位脉冲序列(1) 生成单位脉冲序列,观察并记录生成的图形;n=1:50; %定义序列的长度是50x=zeros(1,50); %注意:MATLAB中数组下标从1开始x(1)=1;close all;subplot(3,1,1);stem(x);title('单位冲击信号序列');(2) 研究其频率特性,,分别研究其幅频特性和相频特性,观察并记录生成的图形;k=-25:25;X=x*(exp(-j*pi/12.5)).^(n'*k);magX=abs(X); %绘制x(n)的幅度谱subplot(3,1,2);stem(magX);title('单位冲击信号的幅度谱');angX=angle(X); %绘制x(n)的相位谱 subplot(3,1,3);stem(angX) ; title ('单位冲击信号的相位谱')答:根据以上两个源程序得到的图形如下图1.2:图1.2分析:由上图观察单位冲激信号的频率响应可知,其幅度谱为矩形函数,相位谱呈奇对称。
与连续的冲激响应对应,只是这里是有限序列3. 卷积过程,n=1:50; %定义序列的长度是50hb=zeros(1,50); %注意:MATLAB中数组下标从1开始hb(1)=1;hb(2)=2.5;hb(3)=2.5;hb(4)=1;close all;subplot(3,1,1);stem(hb);title('系统hb[n]');m=1:50; %定义序列的长度是50A=444.128; %设置信号有关的参数a=50*sqrt(2.0)*pi;T=0.001; %采样率w0=50*sqrt(2.0)*pi;x=A*exp(-a*m*T).*sin(w0*m*T); subplot(3,1,2);stem(x);title('输入信号x[n]');y=conv(x,hb); subplot(3,1,3);stem(y);title('输出信号y[n]');答:根据以上两个源程序得到的图形如下图1.3:图1.3分析:离散信号的卷积为相对移动然后累计相加,所以卷积的结果最高可达到1000.四、 思考:1. 如何生成实指数序列?写出对应的matlab程序;答:(1)程序如下所示:a1=2n=1:50x1=(a1.^n)subplot(1,1,1)stem(x1);title('实指数序列')(2) 所得图形如下图1.4所示:2. 编写程序验证卷积定律。
答:编写的源程序如下:x=[1 2 0 3 1];%原序列y=[1 2 0 3 1];%直接得到结果z=conv(x,y);figure(1),subplot(311),stem(x),title('直接法x的序列');axis([1 9 0 4]);subplot(312),stem(y),title('直接法y的序列');axis([1 9 0 4]);subplot(313),stem(z),title('直接法得到的卷积z的序列');axis([1 9 0 20]);%FFTN=10;x1=[x zeros(1,N-length(x))];y1=[y zeros(1,N-length(y))];X1=fft(x1);Y1=fft(y1);Z1=X1.*Y1;z1=ifft(Z1);figure(2),subplot(321),stem(x1),title('x序列');subplot(322),stem(real(X1)),title('FFT法的傅里叶变换实部x');subplot(323),stem(y1),title('y序列');subplot(324),stem(real(Y1)),title('FFT法的傅里叶变换实部y');subplot(325),stem(z1),title('z序列');subplot(326),stem(real(Z1)),title('傅里叶变换后相乘结果z');N=6;x2=[x zeros(1,N-length(x))];y2=[y zeros(1,N-length(y))];X2=fft(x2);Y2=fft(y2);Z2=X2.*Y2;z2=ifft(Z2);figure(3),subplot(321),stem(x1),title('x序列2');subplot(322),stem(real(X1)),title('FFT法的傅里叶变换实部x2');subplot(323),stem(y1),title('y序列2');subplot(324),stem(real(Y1)),title('FFT法的傅里叶变换实部y2');subplot(325),stem(z1),title('z序列');subplot(326),stem(real(Z1)),title('傅里叶变换后相乘结果z2'); 得到验证如下图1.4至1.6:图1.4图1.5图1.6分析:观察以上三个图可以发现验证了卷积定理,即时域的卷积等于频域的相乘算式为f(t)*h(t)=F(jw)H(jw)。
与直接用MATLAB内部卷积函数得到的结果也一样,并且对比图1.5和1.6可知快速傅里叶变换所用的点数的多少不影响卷积的结果实验二 基2-FFT算法编程一、 实验目的1. 掌握离散傅立叶变换的原理;2. 熟悉基2-FFT算法流程,学会编写算法程序;3. 认识到基2-FFT算法对离散傅立叶运算的速度提高的重要性;二、 实验要求1. 自己编写FFT算法程序;2. 调试算法程序;3. 测试采用FFT算法后,运算量和运算时间的减少量;三、 实验步骤1. 编写matlab程序,完成输入倒位序,输出自然顺序,按照时间抽选的基2-FFT算法程序的编写;答:算法源程序如下:clc;close all;format compact;xn=[1,2,3,4,5,6,7]; %可取任意序列M=nextpow2(length(xn));N=2^M;for m=0:N/2-1; % 旋转因子指数范围 WN(m+1)=exp(-j*2*pi/N)^m; %计算旋转因子endA=[xn,zeros(1,N-length(xn))];%数据输入disp('输入到各存储单元的数据:'),disp(A) %数据倒序操作J=0;%给倒序数赋初值for I=0:N-1;%按序交换数据和算倒序数 if I=K; J=J-K;K=K/2; end J=J+K;enddisp('倒序后各存储单元的数据'),disp(A); %分级按序一次进行蝶形运算for L=1:M;%分级计算 disp('运算级次'),disp(L); B=2^(L-1); for R=0:B-1;%各级按序碟算 P=2^(M-L)*R; for K=R:2^L:N-2;%每序依次计算 T=A(K+1)+A(K+B+1)*WN(P+1);A(K+B+1)=A(K+1)-A(K+B+1)*WN(P+1);A(K+1)=T; end end disp('本级运算后各存储单元的数据'),disp(A);enddisp('输出各存储单元的数据'),Xk=A,disp('调用FFT函数运算的结果'),fftxn=fft(xn,N), 2. 调试程序;答:调试上题程序得到结果如下图2.1至2.2:图2.1图2.2 3. 已知,利用编写的程序求;答:将源程序第二行改为:xn=0:1:31; 运行可得结果如下图2.3至2.4:图2.3图2.4 答:源程序如下:clc;close all;n=[0:31];x=n+1;h=[2,-1,1];y=hsolpsav(x,h,N) 其中hsolpsav函数定义如下:function [y]=hsolpsav(x,h,N)%用fft的重叠保留法做分段卷积%---------------------------%[y]=hsolpsav(x,h,N)%y=输出序列%x=输入序列%h=单位冲击响应%N=分段长必须是二的幂次%N=2^(ceil(log10(N)/log10(2)));Lx=length(x);M=length(h);M1=M-1;L=N-M1;H=fft(h,N);%K=floor(((Lx+M1)/L)+1); %分段数目x=[zeros(1,M1),x,zeros(1,N-1)];%前置M1个零点。