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)。混叠一旦发生,神仙也救不回来。
下面这张图帮你理解采样定理的核心逻辑:
我的习惯: 做数字控制时,采样频率至少取系统闭环带宽的 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