1. 滤波初探:什么是传感器噪声?为什么需要滤波?

大家好,我是老张。做嵌入式这些年,我踩过最多的坑,就是传感器数据不听话。明明硬件好好的,读出来的数值却像喝醉了酒——东倒西歪。今天咱们就来聊聊,这到底是怎么回事。

1.1 传感器噪声:数据里的“杂音”

先问个问题:你见过完美的传感器吗?

反正我没见过。任何传感器,不管多贵,输出的信号里都混着不想要的成分。这些成分,就是噪声。

举个例子。我用一个温度传感器测室温,理想情况是输出25.0°C。但实际读到的可能是:

25.1, 24.8, 25.3, 24.9, 25.2, 24.7, 25.0, 25.1, 24.8, 25.3

你看,数值在25.0附近跳来跳去。这就是噪声在捣鬼。

噪声的本质:传感器输出中,我们不想要的、随机波动的成分。

1.2 噪声从哪来?

噪声不是凭空冒出来的。我在项目中总结过,主要有这几类来源:

噪声类型 来源 特点
热噪声 电子热运动 白噪声,全频段都有
电源噪声 供电不稳定 50Hz/100Hz工频干扰
量化噪声 ADC转换精度有限 ±0.5 LSB
机械噪声 振动、冲击 低频为主
环境噪声 电磁干扰、温度变化 随机性强

我记得有一次做工业现场的项目,传感器数据老是跳得厉害。排查了半天,发现是旁边一台大电机启动时产生的电磁干扰。嗯,这种坑,踩过一次就记住了。

1.3 为什么必须滤波?

你可能会想:噪声不大,忍忍不行吗?

还真不行。我给你说三个场景:

  1. 控制精度:PID调节器如果输入是带噪声的数据,输出会一直抖动。电机可能嗡嗡响,阀门可能来回开关。设备寿命直接打折。
  2. 阈值判断:比如水位超过80%就报警。如果数据有±5%的噪声,那79%和81%之间来回跳,报警器会疯掉。
  3. 数据可视化:你画个温度曲线,结果全是毛刺。老板看了问:这设备是不是坏了?

注意:不滤波的传感器数据,在关键系统中可能导致误判甚至事故。我曾经见过一个案例,因为没做滤波,液位检测误报导致生产线停机,损失十几万。

1.4 滤波的本质是什么?

说白了,滤波就是“去伪存真”。

我们想要的是真实信号,但测量值 = 真实信号 + 噪声。滤波算法要做的,就是把噪声尽可能去掉,保留真实信号。

你想想看,这其实是个权衡问题:

  • 滤得太狠:信号变平滑了,但反应变慢,实时性差
  • 滤得太轻:噪声还在,数据还是跳

我个人的习惯是:先搞清楚应用场景对实时性和平滑度的要求,再选滤波算法。没有万能方案,只有最合适的方案。

1.5 知识体系总览

下面这张图,是我梳理的滤波算法知识体系。咱们这门课会一步步搭建起来:

传感器数据滤波算法知识体系 噪声来源 热噪声 | 电源噪声 | 量化噪声 | 机械噪声 | 环境噪声 滤波目标 去伪存真:保留真实信号,抑制噪声 滤波算法分类 时域滤波 | 频域滤波 | 统计滤波 | 自适应滤波 时域滤波 限幅滤波 中值滤波 滑动平均 频域滤波 低通滤波 高通滤波 带通滤波 统计滤波 卡尔曼滤波 粒子滤波 贝叶斯滤波 自适应滤波 LMS算法 RLS算法 自适应陷波

我的建议:初学者先从时域滤波入手,尤其是限幅滤波和滑动平均。这两个算法简单、高效,能解决80%的噪声问题。等用熟了,再挑战卡尔曼滤波这些高级算法。

1.6 一个直观的例子

咱们用代码感受一下。假设你从加速度计读数据,原始信号长这样:

// 模拟原始传感器数据(带噪声)
float raw_data[] = {
  1.02, 1.15, 0.98, 1.21, 1.05, 
  0.95, 1.18, 1.01, 1.12, 0.99,
  1.08, 1.14, 0.97, 1.20, 1.03
};

真实值应该是1.0,但噪声让它在0.95到1.21之间乱跳。如果直接用这个数据做姿态解算,结果会抖得没法看。

做个最简单的滑动平均滤波(取最近3个点的平均值):

// 滑动平均滤波(窗口大小=3)
float filtered[15];
for(int i = 0; i < 15; i++) {
  if(i < 2) {
    filtered[i] = raw_data[i];  // 前两个点不处理
  } else {
    filtered[i] = (raw_data[i-2] + raw_data[i-1] + raw_data[i]) / 3.0f;
  }
}

// 输出结果
// 原始: 1.02 1.15 0.98 1.21 1.05 0.95 1.18 ...
// 滤波后: 1.02 1.15 1.05 1.11 1.08 1.07 1.06 ...

你看,滤波后的数据稳定多了。虽然还有波动,但范围缩小到了1.05~1.11之间。这就是滤波的威力。

核心结论:滤波不是魔法,它不能消除所有噪声。但好的滤波算法,能让数据从“没法用”变成“能用”。

1.7 避坑指南

最后,分享几个我踩过的坑:

  • 不要盲目追求平滑:我曾经为了数据好看,把滤波系数调得特别小。结果数据是平滑了,但系统响应慢得像蜗牛。产品经理差点没把我吃了。
  • 注意边界情况:传感器刚上电时,数据可能异常。滤波算法要考虑初始化阶段怎么处理。
  • 滤波不是万能的:如果噪声太大,先检查硬件。屏蔽、接地、去耦电容这些基本功做好了,滤波压力会小很多。

好了,这一章就聊到这儿。噪声是什么、从哪来、为什么要滤波,你应该心里有数了。下一章咱们动手写第一个滤波算法——限幅滤波。那个简单,但很实用。


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