计算机仿真技术实验指导书河南科技大学电子信息工程学院二〇〇八年二月计算机仿真技术实验指导书MATLAB是一种交互式的以矩阵为基本数据结构的系统。
在生成矩阵对象时,不要求明确的维数说明。
所谓交互式,是指MATLAB的草稿纸编程环境。
与C语言或FORTRON语言作科学数值计算的程序设计相比较,利用MATLAB可节省大量的编程时间。
本实验指导书主要讨论四个实验。
实验一信号与系统的时域分析以及信号合成与分解1. 实验目的(1) 连续时间信号的向量表示法和符号运算表示法,典型离散信号表示;(2) 连续信号和离散信号的时域运算与时域变换;(3) 连续系统和离散系统的卷积,以及冲激响应、阶跃响应、单位响应、零状态响应;(4) 周期信号的傅立叶级数分解与综合(以周期方波为例);2. 实验原理与方法(1) 信号在MATLAB中的表示方法MATLAB用两种方法来表示连续信号,一种是用向量的方法来表示信号,另一种则是符号运算的方法来表示信号。
用适当的MATLAB语句表示出信号后,就可以利用MATLAB的绘图命令绘制出直观的信号时域波形。
向量表示法表示信号的方法是:MATLAB用一个向量表示连续信号的时间范围,另一个向量表示连续信号在该时间范围内的对应样值。
如下列代码p=0.001;t=-pi:p:pi;f=1+cos(t);plot(t,f)title('f(t)=1+cos(t)')xlabel('t')axis([-pi,pi,-0.2,2.4])执行后即可绘制连续信号1+cos(t)的时域波形。
借助于符号运算以及符号绘图函数ezplot,也可以绘制连续信号时域波形。
如下列代码syms tf=sym('1+cos(t)') %定义符号表达式ezplot(f,[-pi,pi]) %绘制符号表达式波形set(gcf,'color','w') %设置当前图形背景颜色为白色执行后即可绘制连续信号1+cos(t)的时域波形。
与连续信号的表示相似,在MATLAB中,离散信号也需要用两个向量来表示,其中一个向量表示离散信号的时间范围,另一个向量表示该离散信号在该时间范围内的对应样值。
但与连续信号表示有所不同的是,表示离散信号时间范围向量的元素必须为整数。
如下列代码n=[-3,-2,-1,0,1,2,3];x=[-3,2,-1,3,1,-2,1];stem(n,x,'filled')set(gcf,'color','w')title('x(n)')xlabel('n')执行后即可绘制离散信号x(n)={ -3,2,-1,3,1,-2,1}的时域波形。
↑n=0(2) 连续信号和离散信号的时域运算与时域变换对连续信号而言,其基本时域变换有反褶、平移、尺度变换、倒相。
利用MATLAB的符号运算功能以及符号绘图函数ezplot,可以直观的观察和分析连续信号的时域运算与时域变换。
如下列代码syms t;f=sym('(t+1)*(heaviside(t+1)-heaviside(t))');f=f+sym('(heaviside(t)-heaviside(t-1))'); %定义信号符号表达式ezplot(f,[-3,3]) %绘制信号波形axis([-3,3,-1.2,1.2])set(gcf,'color','w')title('f(t)')pausef1=subs(f,t,t+1.5); %变量替换ezplot(f1,[-3,3]) %绘制f(t+1.5)波形title('f(t+1.5)')pausef2=subs(f,t,t-1.5);ezplot(f2,[-3,3]) %绘制f(t-1.5)波形title('f(t-1.5)')pausef3=subs(f,t,-t);ezplot(f3,[-3,3]) %绘制f(-t)波形title('f(-t)')pausef4=-f;ezplot(f4,[-3,3]) %绘制-f(t)波形title('-f(t)')pausef5=subs(f,t,(1/2)*t);ezplot(f5,[-3,3]) %绘制f(0.5t)波形title('f(0.5t)')执行后即可实现连续信号的四种基本时域变换。
对离散信号而言,其基本时域变换有反褶、平移、倒相。
其基本原理同连续信号时域变换。
(3) 连续系统和离散系统的卷积,以及冲激响应、阶跃响应、单位响应、零状态响应卷积积分是连续信号与系统分析的有效方法和工具,利用MATLAB求离散序论卷积和的专用函数conv可以实现连续信号卷积积分的快速计算,并绘制出卷积积分信号的时域波形。
其具体步骤如下:将参与卷积积分运算的两个连续信号f1(t)和f2(t)以等时间间隔τ∆进行采样,得到其离散序论f1(nτ∆)和f2(nτ∆);生成与离散序论f1(nτ∆)和f2(nτ∆)相对应的时间向量n1和n2;调用conv函数计算卷积积分)∆的采f=在离散时间点mτtf*t)(2(1)(tf样值f(mτ∆);生成与f(mτ∆)相对应的时间向量n。
如下列代码function [f,t]=ctsconv(f1,f2,t1,t2)%计算连续信号卷积积分实用函数d=input('请输入取样时间间隔d: ');f=conv(f1,f2); %计算序列f1与f2的卷积和ff=f*d; %计算卷积积分信号f(t)离散样值ts=t1(1)+t2(1) %计算序列f非零样值的起点位置l=length(t1)+length(t2)-2; %计算卷积积分f的非零样值的宽度t=ts:d:(ts+l*d) %确定卷积积分f非零样值的时间向量subplot(2,2,1)plot(t1,f1) %在子图1绘制信号f1(t)的时域波形axis([min(t1),max(t1),min(f1)-abs(min(f1)*0.2),max(f1)+max(f1)*0.2])title('f1(t) ')xlabel('t')subplot(2,2,2)plot(t2,f2) %在子图2绘制信号f2(t)的时域波形axis([min(t2),max(t2),min(f2)-min(f2)*0.2,max(f2)+max(f2)*0.2])title('f2(t) ')xlabel('t')subplot(2,2,3)plot(t,f); %在子图3绘制卷积积分f(t)的时域波形axis([min(t),max(t),min(f)-min(f)*0.2,max(f)+max(f)*0.2])p=get(gca, 'position');p(3)=2.4*p(3);set(gca, 'position',p) %将第三个子图的横坐标范围扩为原来的2.4倍title('f(t)=f1(t)*f2(t)')xlabel('t')执行后即可实现连续信号的卷积积分运算。
卷积和是离散信号与系统分析的有效方法和工具,利用MATLAB 求离散序论卷积和的专用函数conv 可以实现离散信号卷积和的计算。
(4) 周期信号的傅立叶级数分解与综合周期信号可展开成如下两种正交函数线性组合的无穷级数:三角函数式的傅立里叶级数 {cosn ω1t,…,sinn ω1t}和复指数函数式的傅里叶级数 { e j n ω1t }。
设周期为T 的周期信号f(t)满足狄利赫利条件,则f(t)可以由三角函数的傅里叶级数线性组合表示如下:)sin cos ()(10t n b t n a a t f n n n ωω++=∑∞=其中: ⎰+=Tt t dt t f T a 00)(10⎰+=Tt t n dt t n t f Ta 00)cos()(2ω n=1,2,3,….⎰+=Tt t n dt t n t f T b 00)sin()(2ω n=1,2,3,….借助于MATLAB 的数学运算功能和可视化功能,可以直观的观察和分析周期信号的分解与合成。
3. 实验内容及步骤(1) 认真复习信号与系统的时域分析以及信号合成与分解等有关内容,阅读本实验原理与方法。
(2) 编制实验用程序。
编制基本连续信号如单位阶跃信号、实指数信号、单边指数衰减信号、正弦信号、复指数信号、虚指数信号的可视化程序;编制基本离散序列如单位抽样序列、单位阶跃序列、正弦序列、实指数序列、复指数序列的可视化程序;用square 、sawtooh 、rectplus 、triplus 、sinc 函数生成常见的标准信号; 编写绘制x1(n)={ 2,1,0,1,2} 和 x2(n)={ 1,2,3,4,5,6}的时域波形,并编写绘↑ ↑ n=0 n=0制二者相加和相乘的时域波形。
编写求解连续信号卷积积分并绘制卷积积分信号时域波形实用子程序;编写求解离散信号卷积和并能绘制卷积和信号时域波形的实用子程序;以周期方波为例,编写周期信号的傅立叶级数分解与合成的实用子程序。
4.实验方式及要求每人一台安装有Matlab7.0的计算机,在计算机上编程仿真。
一人一组,独立完成。
5. 思考题脚本文件与函数文件编写上有什么区别?二者用法上有什么区别?6. 实验报告要求(1) 简述实验目的及实验原理。
(2) 按实验步骤附上实验过程中的连续信号以及离散序列的时域波形,并对所得结果进行分析和解释。
(3) 总结实验中的主要结论。
(4) 简要回答思考题。
实验二 信号与系统的频域分析以及信号采样和重构1. 实验目的(1) 周期信号频谱分析;(2) 典型周期信号的频谱分析(以周期方波脉冲和周期三角波脉冲为例); (3) 用FFT 实现周期信号的频谱分析;(4) 信号幅度调制以及傅立叶变换性质的MATLAB 实现; (5) 系统频率响应; (6) 信号的采样与重构; 2. 实验原理与方法 (1) 周期信号频谱分析 由于周期信号可以分解如下:)sin cos ()(10t n b t n a a eF t f n n n tjn n n ωωω++==∑∑∞=∞-∞=则只要求出周期信号傅立叶级数的系数n c (或者n F )及n ϕ,就可以根据他们随角频率ω的变化关系画出信号的幅度频谱和相位频谱。
如下列代码function CTFS_RP% 以周期矩形脉冲信号为例,计算其频谱特性 % Nf :级数分解的谐波次数,由键盘输入 % Nn :输出数据的准确位数 % a0:直流项系数% an :第1,2,3,...次谐波余弦项展开系数 % bn :第1,2,3,...次谐波正弦项展开系数 % tao :周期矩形脉冲信号脉宽,由键盘输入 % T :周期矩形脉冲信号周期,由键盘输入display('Please input the value of T, tao and Nf'); %命令窗口提示用户输入参数 T = input('T = '); tao = input('tao = ');Nf = input('Nf = ');syms t n k x %定义符号变量Nn = 32; %输出数据的位数为32位an = zeros(Nf+1,1); %分配an系数数组bn = zeros(Nf+1,1); %分配bn系数数组phase = zeros(Nf+1,1); %分配相位数组s1 = strcat('Heaviside(t+',num2str(tao/2),')'); %构造u(t+tao/2)s2 = strcat('Heaviside(t-',num2str(tao/2),')'); %构造u(t-tao/2)x = sym(s1) - sym(s2); %构造一个周期的脉冲信号u(t+tao/2)-u(t-tao/2)A0 =2*int(x,t,-T/2,T/2)/T; %求出直流项a0As=2*int(x*cos(2*pi*n*t/T),t,-T/2,T/2)/T; %求出余弦项系数anBs=2*int(x*sin(2*pi*n*t/T),t,-T/2,T/2)/T; %求出正弦项系数bnan(1) = double(vpa(A0,Nn)); %获取参数组A0所对应的ASCII 码数值数组for k=1:Nfan(k+1)=double(vpa(subs(As,n,k),Nn)); %获取参数组As所对应的ASCII 码数值数组bn(k+1)=double(vpa(subs(Bs,n,k),Nn)); %获取参数组Bs所对应的ASCII 码数值数组endcn = sqrt(an.*an+bn.*bn); %计算幅度谱for i = 1:Nf %由于bn=0,相位由an的符号决定为0或piif an(i) >= 0phase(i) = 0;elsephase(i) = pi;endendt = -T*5:0.001:T*5;d = -T*5:T:T*5;xx = pulstran(t,d,'rectpuls',tao); %用pulstran函数生成矩形脉冲信号subplot(311); %将显示窗口分为3个子窗口,并指向第1个子窗口plot(t,xx); %绘制周期矩形脉冲信号axis([-T*5 T*5 0 1.1]); %指定坐标系范围%title('周期矩形脉冲信号','Fontsize',8); %标注标题s1 = strcat('周期矩形脉冲信号 T=',num2str(T),' Tao=',num2str(tao),'t'); xlabel(s1,'Fontsize',8); %x轴标签subplot(312); %指向第2个子窗口k = 0:Nf;stem(k,cn); %绘制幅度谱hold on;plot(k,cn); %绘制幅度谱包络线xlabel('幅度谱 \omega','Fontsize',8);subplot(313); %指向第3个子窗口stem(k,phase); %绘制相位谱xlabel('相位谱 \omega','Fontsize',8);% End绘制周期信号的频谱特性执行后即可实现周期信号频谱分析。