2. 信号与系统基础回顾:从连续到离散,你绕不开的那些坎

说实话,很多做嵌入式控制的朋友,一碰到“信号与系统”就头大。我当年也一样。总觉得这东西太理论,跟我写代码、调参数没啥关系。直到有一次,我在做一个电机转速闭环控制的项目,采样率没选好,结果系统直接震荡了。嗯,从那以后,我才老老实实回来补课。

这一章,咱们就把那些最核心、最常用的基础概念过一遍。不扯太深,但保证你以后用得上。

2.1 连续时间信号与离散时间信号

先搞清楚我们面对的是什么。

连续时间信号,说白了就是时间轴上每一点都有定义的信号。比如你拿示波器看一个正弦波,那就是连续的。数学上写成 x(t),t 是实数。

离散时间信号,只在某些离散的时间点上才有值。比如你每隔 1ms 读一次 ADC,得到的就是一串数字:x[0], x[1], x[2]... 注意,我用方括号表示离散信号,这是行业惯例。

核心区别:

  • 连续信号:x(t),t 连续变化
  • 离散信号:x[n],n 是整数索引

我在项目中见过不少新手,直接把连续系统的 PID 参数搬到数字控制器里,结果系统表现完全不一样。为什么?因为你处理的是离散信号,不是连续的了。这个意识一定要有。

2.2 采样定理(奈奎斯特采样定理)

这是数字控制系统的命根子。你采样频率选不对,后面全白搭。

奈奎斯特采样定理说: 要想从采样后的离散信号无失真地恢复出原始连续信号,采样频率 fs 必须大于信号最高频率 fmax 的两倍。

写成公式:

fs > 2 * fmax

这个 2*fmax 就是奈奎斯特频率。注意是“大于”,不是“大于等于”。等于的时候理论上也不行,实际工程中我们通常取 5~10 倍。

我曾经踩过的坑: 做一个音频采集项目,信号最高频率 4kHz,我心想 8kHz 采样够了吧?结果恢复出来的声音全是毛刺。后来才发现,实际信号里有高频噪声,超过了 4kHz。所以采样前一定要加抗混叠滤波器,把高于 fs/2 的成分滤掉。

为什么会这样?因为采样在频域上会导致频谱搬移。如果信号频率超过 fs/2,搬移后的频谱就会重叠,产生混叠(aliasing)。混叠一旦发生,神仙也救不回来。

下面这张图帮你理解采样定理的核心逻辑:

连续信号 x(t) 频率 f_max 采样 f_s > 2*f_max 离散信号 x[n] 条件: f_s > 2 * f_max 否则 → 混叠失真

我的习惯: 做数字控制时,采样频率至少取系统闭环带宽的 10 倍。比如你的系统带宽是 100Hz,采样率至少 1kHz。这样既能保证控制效果,又不会给处理器太大压力。

2.3 Z变换基础

连续系统我们用拉普拉斯变换,离散系统就用 Z 变换。Z 变换就是把离散信号从时域映射到 z 域。

定义式:

X(z) = Σ x[n] * z^(-n)   (n 从 0 到 ∞)

看着复杂?其实常用的就那么几个:

时域信号 x[n] Z变换 X(z) 收敛域
δ[n](单位脉冲) 1 整个 z 平面
u[n](单位阶跃) z / (z - 1) |z| > 1
a^n * u[n] z / (z - a) |z| > |a|
n * a^n * u[n] a*z / (z - a)^2 |z| > |a|

我个人习惯,做数字滤波器设计时,最常用的是第二个和第三个。你想想看,一个一阶低通数字滤波器,它的传递函数就是 z/(z-a) 这种形式。

2.4 差分方程与传递函数

连续系统用微分方程描述,离散系统用差分方程描述。这是数字控制器的数学基础。

一个典型的差分方程长这样:

y[n] = b0*x[n] + b1*x[n-1] - a1*y[n-1]

什么意思?当前输出 y[n] 由当前输入 x[n]、上一次输入 x[n-1] 和上一次输出 y[n-1] 共同决定。这就是数字滤波器的本质。

对差分方程两边做 Z 变换,就能得到传递函数:

Y(z) = b0*X(z) + b1*z^(-1)*X(z) - a1*z^(-1)*Y(z)
H(z) = Y(z)/X(z) = (b0 + b1*z^(-1)) / (1 + a1*z^(-1))

这个 H(z) 就是离散系统的传递函数。有了它,你就可以分析系统的稳定性、频率响应,甚至直接写出代码实现。

从传递函数到代码,就一步:

// 假设 H(z) = (b0 + b1*z^-1) / (1 + a1*z^-1)
// 对应的差分方程:
// y[n] = b0*x[n] + b1*x[n-1] - a1*y[n-1]

float x_prev = 0, y_prev = 0;
float filter(float x) {
    float y = b0 * x + b1 * x_prev - a1 * y_prev;
    x_prev = x;
    y_prev = y;
    return y;
}

你看,数学公式和实际代码之间,其实就隔着一层窗户纸。我在做无刷电机 FOC 控制时,电流环的 PI 控制器就是用这种一阶差分方程实现的,跑在 STM32 上,效果很好。

注意: 差分方程中的系数 a1 如果搞错符号,系统可能直接不稳定。我刚开始写代码时,把 -a1*y[n-1] 写成了 +a1*y[n-1],结果输出直接飞了。调试了一下午才发现。

2.5 小结

这一章我们聊了:

  • 连续信号和离散信号的区别——一个是模拟世界,一个是数字世界
  • 采样定理——选对采样率,别让混叠坑了你
  • Z变换——离散系统的数学工具,记住那几个常用变换对就行
  • 差分方程和传递函数——从数学到代码的桥梁

这些基础打牢了,后面学数字滤波器设计、数字控制器实现,就会顺畅很多。别急,慢慢来,每个知识点我都会结合项目经验给你讲透。


公众号:蓝海资料掘金营,微信deep3321