2. 信号与系统基础在MATLAB中的表示
在MATLAB中处理信号,第一件必须想清楚的事是:你面对的是连续时间信号,还是离散时间信号。这个判断决定了后续用什么方式生成、用什么函数运算、用什么图形观察。连续时间信号在数学上定义在实数时间轴上,MATLAB无法真正表示“任意时刻都有值”的连续函数,只能用足够密的采样点去逼近;离散时间信号则天然对应序列,只在整数索引 n 上有定义。两者在代码里的核心区别是:连续信号用时间向量 t 和函数表达式生成,离散信号用索引向量 n 和序列值生成。
先看连续信号的表示。以常见的衰减正弦为例,若取时间范围 0 到 2 秒,采样间隔 0.001 秒,可以写成:
t = 0:0.001:2;
x = 3*exp(-1.5*t).*sin(2*pi*5*t);
plot(t, x);
xlabel('t / s'); ylabel('x(t)');
grid on;
这里 0:0.001:2 生成的是时间向量,.* 表示逐元素相乘,不能写成 *。采样间隔 0.001 秒对应采样率 1000 Hz,对于 5 Hz 的正弦成分来说,每个周期约有 200 个采样点,图形足够平滑。如果把间隔改成 0.1 秒,采样率只有 10 Hz,5 Hz 正弦每周期仅 2 个点,图形会严重失真,这就是连续信号“用离散点逼近”时必须关注的采样密度问题。
离散信号则不同。例如单位脉冲序列、单位阶跃序列和指数序列,通常用索引向量 n 表示:
n = -5:10;
delta = (n == 0);
u = (n >= 0);
a = 0.8;
y = a.^n .* u;
stem(n, y, 'filled');
xlabel('n'); ylabel('y[n]');
grid on;
这里 n == 0 生成逻辑数组,只有 n 等于 0 的位置为 1,其余为 0,正好对应单位脉冲序列 δ[n]。n >= 0 生成单位阶跃序列 u[n]。a.^n 是逐元素幂运算,再与 u[n] 相乘,得到单边指数序列。离散信号必须用 stem 而不是 plot,因为 stem 能明确显示每个整数索引上的离散值,避免把离散序列误读成连续曲线。
常见信号的生成是后续系统分析的基础。除了脉冲、阶跃、指数,正弦序列、矩形脉冲、三角脉冲、sinc 函数也经常出现。矩形脉冲可以用逻辑条件生成,例如在 n 属于 [-3, 3] 时为 1,其余为 0:
rect = (n >= -3) & (n <= 3);
连续矩形脉冲则可以用两个阶跃函数相减表示,或者用 rectpuls 函数。MATLAB 信号处理工具箱提供了 rectpuls、tripuls、sinc、diric 等函数,能直接生成常见波形。使用这些函数时要注意参数含义,例如 rectpuls(t, width) 中 width 是脉冲宽度,默认以 t=0 为中心。
时域运算主要包括平移、反转、尺度变换、相加、相乘、差分与求和。对离散序列来说,平移通过改变索引实现。例如把序列 y[n] 右移 3 位,得到 y[n-3],在 MATLAB 中可以用索引映射完成:
n2 = n + 3;
y_shift = y;
更稳妥的做法是重新定义索引范围,再按逻辑关系赋值。反转则是把 n 变成 -n,即 n_rev = -n,同时序列值顺序反转。连续信号的平移和反转则直接作用在时间变量上,例如 x(t-2) 表示右移 2 秒,x(-t) 表示时间反转。
差分和求和是离散信号特有的运算。一阶前向差分定义为 y[n] = x[n+1] - x[n],在 MATLAB 中可以用 diff 实现,但要注意 diff 会减少一个元素,索引需要相应调整。累加和可以用 cumsum 实现。连续信号的微分和积分则分别用 diff 近似和 cumtrapz 数值积分,前提是采样间隔足够小。
可视化方面,连续信号用 plot,离散信号用 stem,这是最基本的区分。对于同时包含连续和离散成分的对比,可以用 subplot 分上下两栏显示。坐标轴标注要写清楚是 t 还是 n,单位是秒还是无量纲索引。对于离散序列,建议加上 'filled' 参数让茎叶图更清晰。若信号幅度范围很大,可以用 ylim 手动限制显示范围,避免个别尖峰压缩整体波形。
下面给出一个可直接运行的对比示例,同时生成连续衰减正弦和离散指数序列,并观察两者的差异:
% 连续信号
t = 0:0.001:1;
xc = exp(-3*t).*sin(2*pi*8*t);
% 离散信号
n = 0:30;
xd = 0.85.^n .* sin(2*pi*0.15*n);
subplot(2,1,1);
plot(t, xc); title('连续衰减正弦'); xlabel('t / s'); grid on;
subplot(2,1,2);
stem(n, xd, 'filled'); title('离散衰减正弦序列'); xlabel('n'); grid on;
运行后上栏是平滑的连续曲线,下栏是离散茎叶图。若把离散序列的索引间隔理解为采样周期,它其实对应连续信号的一种采样版本。理解这一点,对后续学习采样定理、DFT 和滤波器设计非常关键。
最后强调一个常见错误:对离散序列使用 plot 会让人误以为信号在非整数时刻也有值,这在概念上是不准确的。同样,对连续信号使用 stem 也不合适,因为连续信号本身不是只在离散点上定义。图形选择不是审美问题,而是信号类型的外在表达。只有图形与信号类型匹配,后续的时域分析、频域分析和系统响应观察才有可靠基础。