第一章 信号处理基础:模拟信号与数字信号、滤波算法、采样定理
各位同学,咱们今天聊信号处理。说实话,这玩意儿是力控系统的「耳朵」和「眼睛」。你传感器采回来的数据好不好,直接决定了你的控制精度。我在项目里见过太多人,算法写得天花乱坠,结果信号一塌糊涂,全白搭。
所以这一章,咱们把基础打扎实。我会把模拟信号、数字信号、滤波算法、采样定理这几个核心概念串起来讲。嗯,你跟着我的节奏走就行。
1.1 模拟信号与数字信号
先问个问题:你传感器出来的电压,是连续的还是离散的?
答案是连续的。比如一个压力传感器,输出0-10V,随着压力变化,电压是平滑变化的。这就是模拟信号——时间连续、幅值也连续。
但我们的单片机、PLC、工控机,它们只能处理0和1。所以必须把模拟信号转成数字信号。这个过程叫模数转换(ADC)。
核心区别一句话总结:
- 模拟信号:连续,无限精度(理论上),易受干扰
- 数字信号:离散,有限精度,抗干扰能力强
我个人习惯,在选型时先看ADC的位数。12位、16位、24位,差别很大。举个例子:
- 12位ADC:分辨率 = 参考电压 / 4096。如果参考电压是5V,那最小能分辨约1.22mV
- 16位ADC:分辨率 = 5V / 65536 ≈ 0.076mV
我在项目中遇到过一件事:一个称重系统,用了12位ADC,结果零点漂移严重。后来换成24位ADC,问题直接解决。说白了,精度不够,后面滤波再努力也白费。
小提示: 实际项目中,不要只看位数。还要看采样率、信噪比(SNR)、积分非线性(INL)。这些参数往往比位数更关键。
1.2 采样定理(奈奎斯特-香农定理)
好,现在信号转成数字了。但有个问题:你该用多快的速度去采样?
这就是采样定理要回答的。它的核心就一句话:
采样频率必须大于信号最高频率的2倍。
为什么?你想想看,如果信号频率是100Hz,你每秒只采150个点,那采回来的波形会「混叠」——高频信号伪装成了低频信号。这就是混叠现象。
我曾经在一个振动监测项目里吃过这个亏。当时采样率设得不够高,结果频谱分析出来全是假频率。排查了两天才发现是采样率的问题。嗯,从那以后,我设计采样率时都会留至少3-5倍的余量。
实际工程中,我建议这样选:
| 信号类型 | 最高频率 | 建议采样率 |
|---|---|---|
| 温度(慢变) | 0.1 Hz | 1-10 Hz |
| 压力(一般) | 10 Hz | 50-100 Hz |
| 振动(高频) | 1 kHz | 5-10 kHz |
| 声音 | 20 kHz | 44.1 kHz(CD标准) |
警告: 采样前一定要加抗混叠滤波器(低通滤波器)。否则即使采样率满足2倍,高频噪声依然会混叠进低频段。这是很多新手容易忽略的。
1.3 滤波算法
信号采回来了,但肯定有噪声。怎么办?滤波。
滤波分硬件滤波和软件滤波。硬件滤波用RC电路、运放等。软件滤波就是我们今天重点讲的算法。我个人更偏爱软件滤波,因为灵活、成本低、调试方便。
1.3.1 低通滤波(一阶RC数字滤波)
这是最常用、最简单的滤波算法。它的原理就是模拟电路中的RC低通滤波,数字化之后变成这样:
// 一阶低通滤波
float lowPassFilter(float input, float lastOutput, float alpha) {
return alpha * input + (1 - alpha) * lastOutput;
}
其中 alpha 是滤波系数,范围0~1。alpha越小,滤波越强,但响应越慢。alpha越大,响应越快,但滤波效果差。
怎么选alpha?我一般这样估算:
- 如果采样周期是 T,想滤除频率高于 f_c 的信号
- alpha ≈ 2 * π * T * f_c / (1 + 2 * π * T * f_c)
举个例子:采样周期10ms,想滤除50Hz以上的噪声:
alpha ≈ 2 * 3.14 * 0.01 * 50 / (1 + 2 * 3.14 * 0.01 * 50)
≈ 3.14 / (1 + 3.14)
≈ 0.76
我的经验: 实际调试时,alpha我通常从0.1开始试。如果噪声大,就减小alpha;如果响应太慢,就增大alpha。没有绝对正确的值,只有适合你系统的值。
1.3.2 卡尔曼滤波
低通滤波简单,但对付不了复杂噪声。这时候就要请出卡尔曼滤波了。
卡尔曼滤波,说白了是一种「最优估计」算法。它不光是滤波,还能预测。它利用系统的状态方程和观测数据,不断修正估计值。
核心公式就5个,我直接给你:
// 卡尔曼滤波 - 一维版本
// 预测
x_pred = x_last; // 状态预测
P_pred = P_last + Q; // 协方差预测
// 更新
K = P_pred / (P_pred + R); // 卡尔曼增益
x_now = x_pred + K * (z - x_pred); // 状态更新
P_now = (1 - K) * P_pred; // 协方差更新
参数说明:
- Q:过程噪声协方差(系统模型的不确定性)
- R:测量噪声协方差(传感器的噪声水平)
- P:估计误差协方差
- K:卡尔曼增益(核心,决定了相信模型还是相信测量)
我在一个无人机姿态估计项目里用过卡尔曼滤波。当时加速度计噪声大,陀螺仪有漂移。单独用哪个都不行。卡尔曼滤波把两者融合,效果出奇的好。嗯,调参花了三天,但结果值得。
低通滤波 vs 卡尔曼滤波:
| 对比项 | 低通滤波 | 卡尔曼滤波 |
|---|---|---|
| 复杂度 | 极低 | 中等 |
| 实时性 | 极高 | 高 |
| 适用场景 | 噪声平稳、简单系统 | 噪声复杂、多传感器融合 |
| 调参难度 | 1个参数(alpha) | 2个参数(Q, R) |
| 是否需要系统模型 | 不需要 | 需要 |
避坑指南: 我曾经在项目里直接用卡尔曼滤波处理一个纯静态信号,结果反而引入了震荡。为什么?因为Q设得太大了,滤波器以为系统在剧烈变化。记住:卡尔曼滤波不是万能的,用对场景才是关键。
1.4 知识体系总览
为了让你更直观地理解这一章的知识结构,我画了一张图:
这张图把咱们这一章的核心逻辑串起来了。你从模拟信号出发,经过ADC变成数字信号,然后根据采样定理确定采样率,最后用低通滤波或卡尔曼滤波把噪声干掉,得到干净的数据去控制执行器。
好了,这一章的内容就到这里。信号处理是力控的基石,你把它吃透了,后面的控制算法才能发挥威力。