1、实验二 基于MATLAB的信号表示与运算 一、 实训目的 1.掌握用Matlab软件产生基本信号(连续/离散的正弦、方波、锯齿波、Sinc函数)的方法 2.应用Matlab软件实现信号的加、减、乘、除运算 3.应用Matlab软件实现信号的时移、反折、尺度变换 二、 实训仪器与设备 电脑、MATLAB软件 三、 实训内容 1.产生常见信号的函数如表 1 所示。 表 1 函数名 功能 常见调用格式 说明 sin 正弦信号 sin(x) 返回 x 的正弦值 cos 预弦信号 cos(x) 返回 x 的余弦值 randn 随机数 randn (n)
2、返回 n×n 维的随机数 square 周期方波 square(x) 在时间 x 内产生周期为 2π 的方波 sawtooth 周期锯齿波 sawtooth(x) 在时间 x 内产生周期为 2π 的锯齿波 tripuls 等腰三角形 tripuls (x) 产生以 x=0 为中点的等腰三角形 sinc Sinc 函数 sinc(x) 返回 sin(pi*x)/(pi*x) 的值 log 自然对数函数 log(x) 返回 log(x)的值 exp 指数函数 exp(x) 返回ex的值 a、产生正弦波 t=(0:0.001:50);
3、 y=sin(2*pi*50*t); plot(t(1:50),y(1:50)) b、产生叠加随机噪声的正弦波 t=(0:0.001:50); y=sin(2*pi*50*t); s=y+randn(size(t)); plot(t(1:50),s(1:50)) 2.连续信号的运算 (1)相加 连续信号的相加,是指两信号的对应时刻值相加,即f(t)= f1(t)+f2(t)。 下面用MATLAB的符号运算命令来表示两连续信号的相加,然后用ezplot命令绘制出其结果波形图。其中f1,f2是两个用符号表达式表示的连续信号,s为相加得到的和信号的符
4、号表达式。 s=symadd(f1,f2)或s=f1+f2 ezplot(s) (2)相乘 连续信号的相乘,是指两信号的对应时刻值相乘,即 f(t)= f1(t)*f2(t)。 与相加运算类似,我们用下面的MATLAB命令来实现连续信号的相乘及其结果的可视化,其中f1,f2为两个用符号表达式表示的信号,w为相乘得到的积信号的符号表达式。 w=symmul(f1,f2) 或w=f1*f2 ezplot(w) (3)移位 连续信号的移位也称平移。对于连续信号f(t),若有常数t0>0,延时信号f(t-t0)是将原信号沿正t轴方向平移时间,而f(t+t0)是将原信号沿负t轴方向
5、移动时间t0。我们可用下面的命令来实现连续信号的平移及其结果的可视化,其中f是用符号表达式表示的连续时间信号,t 是符号变量,subs命令则将连续信号中的时间变量t用t-t0替换: y=subs(f,t,t-t0); ezplot(y) (4)反折 连续信号的反折,是指将信号以纵坐标为轴反折,即将信号f (t)中的自变量t换为- t。与连续信号的平移类似,我们用下面的命令实现连续信号的反折及其结果的可视化,其中f是用符号表达式表示的连续时间信号,t是符号变量: y=subs(f,t,-t) ezplot(y) (5)尺度变换 连续信号的尺度变换,是指将信号的横坐标进行展宽或
6、压缩变换,即将信号f (t)中的自变量t换为at ,当a >1时,信号f (at)以原点为基准,沿横轴压缩到原来的1/ a;当0 < a <1时,信号f (at)将沿横轴展宽至原来的1/ a倍。我们用下面的命令来实现连续信号的尺度变换及其结果的可视化,其中f是用符号表达式表示的连续时间信号,t是符号变量: y=subs(f,t,a*t) ezplot(y) (6)倒相 连续信号的倒相,是指将信号f (t)以横轴为对称轴对折得到- f (t),可用下面的命令实现连续信号的倒相及其结果的可视化, 其中f是用符号表达式表示的连续时间信号。 y=-f ezplot(y) 注意:两个信
7、号相加,其和信号在任意时刻的信号值等于两信号在该时刻的信号值之和。两个信号相乘,其积信号在任意时刻的信号值等于两信号在该时刻的信号值之积。 在Matlab中,矩阵和数组的加减法用符合“+”、“-”实现。矩阵的乘法用“*”实现,要求相乘的矩阵要有相邻公共维。数组的乘除法是指两同维数组间对应元素之间的乘除法,运算符 为“.*”、“./”或“.\”。 对于以上的命令,可在画图命令之后加入坐标轴的调整等命令,以使画出的图形更清晰、直观。 下面举例说明如何用MATLAB来实现连续信号的时域运算、变换及其结果的可视化。 例如: t=0:0.01:2; f1=exp(-3*t); f2=0.2
8、sin(4*pi*t); f3=f1+f2; f4=f1.*f2; subplot(2,2,1);plot(t,f1);title('f1(t)'); subplot(2,2,2);plot(t,f2);title('f2(t)'); subplot(2,2,3);plot(t,f3);title('f1+f2'); subplot(2,2,4);plot(t,f4);title('f1*f2'); 用matlab的符号函数实现信号的时移、反折、尺度变换:由f(t)到f(-at+b)(a>0)步骤: 调用函数:subs(S,OLD,NEW) 表示用NEW中的符合变
9、量替换表达式S中的OLD的符合变量。 例:已知f(t)=sin(t)/t,试通过反褶、移位、尺度变换由f(t)的波形得到f(-2t+3)的波形。 syms t; f=sym('sin(t)/t'); %定义符号函数f(t)=sin(t)/t f1=subs(f,t,t+3); %对f进行移位 f2=subs(f1,t,2*t); %对f1进行尺度变换 f3=subs(f2,t,-t); %对f2进行反褶 subplot(2,2,1);ezplot(f,[-8,8]);grid on; %ezplot是符号函数绘图命令 subplot(2,2,2);e
10、zplot(f1,[-8,8]);grid on; subplot(2,2,3);ezplot(f2,[-8,8]);grid on; subplot(2,2,4);ezplot(f3,[-8,8]);grid on; 注:也可用一条指令:subs(f,t,-2*t+3)实现f(t)到f(-2t+3) 3.离散信号的产生 (1)单位抽样序列 先定义delta函数,并保存。 function[x,n]=delta(n0,n1,n2) n=[n1:1:n2]; x=[(n-n0)==0]; end 然后执行下面程序。(以δ(n-3)为例) [x,n]=d
11、elta(5,-1,10)
stem(n,x);
(2)单位阶跃序列
先定义step_seq函数,并保存。
function[x,n]=step_seq(n0,n1,n2)
n=[n1:n2];
x=[(n-n0)>=0];
然后执行下面程序。以(为例)
[x,n]=step_seq(3,-1,10);
stem(n,x)
(3)矩形序列
先定义aaa函数,并保存。
function[x,n]=aaa(N,n1,n2)
n=[n1:n2];
x=[(N
12、[x,n]=aaa(3,-1,10); stem(n,x) (4)单位斜坡序列 先定义ramp函数,并保存。 function[x,n]=ramp(n1,n2) n=[n1:n2]; x=n; 然后执行下面程序。 [x,n]=ramp(0,10); stem(n,x) (5)正弦序列 例: n=-pi:0.1:pi; x=5*sin(0.5*pi*n+pi/4); stem(n,x) (6)指数序列 例:x(n)=5exp(-0.5 n) n=-1:0.1:1; x=5* exp(-0.5
13、n); stem(n,x) (7)任意序列 例:x=[1,5,-4,2,5,-1,5]; x=[1,5,-4,2,5,-1,5]; n=1:length(x); stem(n,x) 4、离散信号的运算 对于离散序列来说,序列相加、相乘是将两序列对应时间序号的值逐项相加或相乘,平移、反折、及倒相变换与连续信号的定义完全相同,这里就不再累述。但需要注意,与连续信号不同的是,在MATLAB中,离散序列的时域运算和变换不能用符号运算来实现,而必须用向量表示的方法,即在MATLAB中离散序列的相加、相乘需表示成两个向量的相加、相乘,因而参加运算的两序列向量必须具
14、有相同的维数。 下面是实现离散序列相加、相乘的实用子程序及实例。 例:二序列相加、乘 x1=[1,5,-4,2,5,-1,5]; x2=[1,2,3,4,5,6,7]; n=1:length(x); subplot(2,2,1);stem(n,x1); subplot(2,2,2);stem(n,x2); subplot(2,2,3);stem(n,x1+x2); subplot(2,2,4);stem(n,x1.*x2); 四、小结 1、m文件的命名规则: 规则一:文件名首字符不能是数字或下划线。 规则二:文件名不能与Matlab的内部函数名相同。 规则三:M文件名中不能有空格。 2、当前工作路径的含义: 当前工作路径是matlab当前文件读取和存储的默认路径,建立一个.m文件或者其他格式文件都默认放在这个目录或者说路径里。 3、用户程序的编写规则: (1)变量:和其它高级语言一样,MATLAB也使用变量来保存信息。变量名由英文字母开头,一般只能由英文字母、数字以及下划线“_”组成。 (2)在表示连续信号时,选用plot函数。 (3)表示离散序列时用stem函数。 (4)如果要在一个绘图窗口中显示多个图形,可用subplot函数实现。






