在MATLAB中通常有两种方法表示信号。一种是用向量表示,另一种时用符号运算的方法来表示。用MATLAB语句表示出信号后,就可以利用MATLAB的绘图命令绘制出直观的信号波形。

一、连续时间信号的表示

连续时间信号是指自变量的取值范围是连续的,且对于一切自变量的取值,除了有若干不连续点以外,信号都有确定的函数值与之对应。从严格意义上来讲,Matlab并不能处理连续信号,在Matlab中,是用连续信号在等时间间隔点的样值来近似地表示连续信号的,当取样时间间隔足够小时,这些离散的样值就能较好地近似出连续信号。下面,学习连续时间信号用向量或符号运算来表示的两种方法。

对于连续时间信号$f(t)$可以用两个向量表示。第一个行向量是用来定义自变量t的,$t=t{1}:d:t{2}$其中$t_1$为初始值,$d$为步长,$t_2$为终止值。第二个行向量$f$为连续信号$f(t)$在向量$t$所定义的样值。下面的代码简单演示了$sin(t)$的产生:

1
2
3
4
% 用Matlab表示f(t)=sin(t),并绘制出相应波形
t = -10:0.01:10;
f = sin(t);
plot(t,f);

二、离散时间信号的表示

离散时间信号用$f(k)$表示,其中变量$k$为整数,代表离散的采样时间点。$f(k)$可以表示为:$f(k)={…f(-2),f(-1),f(0),f(1), f(2)…}$,这种序列表示应该还需要指出$k=0$的位置。在MATLAB中,用一个向量$f$即可表示一个有限长度的序列。但是,这样的向量并没有包含其对应的序号信息,所以,要完整地表示一个离散信号仍需要用两个向量。如序列:$f(k)={1,2,-1,3,2,4,-1}$,我们指定值$3$为$k=0$的样值。用MATLAB表示离散序列并将其可视化,需要注意一下几点:

  • 与连续时间信号不同,离散时间信号无法用运算符号来表示;
  • 由于在MATLAB中,矩阵的元素个数是有限的,因此,MATLAB无法表示无限序列;
  • 在绘制离散信号波形时,要使用专门绘制离散数据的stem指令,而不是plot指令。

下面的代码演示了离散序列$x{2}(n)=R{N}(n), N=5$:

1
2
3
4
% 离散时间信号的表示
k = 0:4
x = [1 1 1 1 1]
stem(k, x)

三、MATLAB绘图

多窗口绘制$e^{-0.5t}、sin(2{\pi}t)、e^{-0.5t}sin(2{\pi}t)$三个函数的曲线,其中$0<t<2\pi$,并标注图形名称。再把这三个函数在一个图形窗口分子图绘制,同时加图形名称,横、纵轴坐标名称,网格线。

下面的代码延时了多窗口绘制三个函数的曲线:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
% 多窗口绘制三个图像
t = 0:pi/100:2*pi; % 定义自变量范围
y1 = exp(-0.5*t); % 函数1
y2 = sin(2*pi*t); % 函数2
y3 = y1 .* y2; % 函数3,注意这个.*

figure(1); % 创建图形窗口1
plot(t/pi, y1); % 画图
title("exp(-0.5*t)");

figure(2); % 创建图形窗口2
plot(t/pi, y2); % 画图
title("sin(2*pi*t)");

figure(3); % 创建图形窗口3
plot(t/pi, y3); % 画图
title("e^{-0.5t}sin(2{\pi}t)");



下面的代码演示了一个图形窗口分子图绘制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
% 一个图形窗口分子图绘制
t = 0:pi/100:2*pi; % 定义自变量范围
y1 = exp(-0.5*t); % 函数1
y2 = sin(2*pi*t); % 函数2
y3 = y1 .* y2; % 函数3


subplot(3,1,1); % 把图形窗口分成3*1个绘图区,绘制第一张子图
plot(t/pi, y1); % 画图
title("指数函数"); % 标题
xlabel("时间");
ylabel("exp(-0.5*t)")

subplot(3,1,2); % 把图形窗口分成3*1个绘图区,绘制第二张子图
plot(t/pi, y2); % 画图
title("正弦函数");
xlabel("时间")
ylabel("sin(2{\pi}t)")

subplot(3,1,3); % 把图形窗口分成3*1个绘图区,绘制第三张子图
plot(t/pi, y3); % 画图
title("衰减震荡");
xlabel("时间");
ylabel("e^{-0.5t}sin(2{\pi}t)")
grid on; % 加网格线

四、示例

4.1 连续时间信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
% 用MATLAB表示下面的连续信号,所有的函数绘制到一张图

% 1.sa(t) = sin(t) / t, -10 <= t <= 10
% 2.g_{2}(t),门宽为2,高度为1
% 3.5e^{0.5t}sin(2{/pi}t), 0 <= t <= 10

t1 = -10:0.01:10;
t2 = -7:0.01:7;
t3 = 0:pi/100:10*pi;

% 函数样值
y1 = sin(t1) ./ t1;
y2 = rectpuls(t2,2);
y3 = 5*exp(0.5*t3);
y4 = sin(2*pi*t3);
y5 = y3 .* y4;

% 绘图
subplot(3,1,1);
plot(t1, y1);
title("Sa函数");
xlabel("时间");
ylabel("sin(t1)/t");
grid on;

subplot(3,1,2);
plot(t2, y2, "r");
title("门函数")
xlabel("时间")
ylabel("g(t)");
grid on;


subplot(3,1,3);
plot(t3/pi, y5);
title("衰减函数")
xlabel("时间");
ylabel("5*exp(0.5*t)*sin(2*pi*t)")
grid on;

4.2 离散信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
% 离散信号

t1 = -5:5;
y1 = t1 == 0;
stem(t1, y1, "filled");

t2 = -4:0.5:4;
t21 = -1;
t22 = 1;
u1 = stepfun(t2, t21);
u2 = stepfun(t2, t22);
y2 = u1- u2; % 两个阶跃函数相减


t3 = 0:60;
y31 = 1.1.^t3;
y32 = sin(0.05*pi*t3);
y3 = y31.*y32;

% 绘图
subplot(3, 1, 1);
stem(t1, y1, "dy");
axis([-5, 5, 0, 2]);
grid on;
xlabel("时间");
ylabel("y1");
title('离散信号(1)');

subplot(3,1,2);
stem(t2,y2,'sr');
axis([-4,4,-2,2]);
grid on;
xlabel('时间');
ylabel('y2');
title('离散信号(2)');

subplot(3,1,3);
stem(t3/pi,y3,'ob');
grid on;
xlabel('时间');
ylabel('y3');
title('离散信号(3)');