1. 传感器数据滤波概述:为什么需要滤波、噪声来源分析、滤波效果评估指标

大家好,我是老张。做嵌入式这些年,我最大的感触就是——传感器数据从来不会干干净净地送到你面前。你想想看,一个温度传感器,明明室温没变,读数却在上下跳;一个加速度计,静止放着,输出却像在跳舞。这就是我们今天要聊的滤波问题。

说实话,滤波这件事,看着简单,但坑特别多。我见过不少新手,上来就套一个滑动平均,结果信号延迟大到系统直接崩溃。也见过老手,为了滤掉一个50Hz工频干扰,折腾了三天才发现是电源纹波的问题。嗯,咱们今天就把这些事掰扯清楚。

1.1 为什么需要滤波?

说白了,滤波就是为了从一堆乱七八糟的数据里,把真实信号给“捞”出来。我个人的习惯是,只要传感器数据参与控制或决策,滤波就是必须的。原因有三:

  • 消除噪声干扰:传感器本身、电源、环境都会引入噪声。不滤波,数据就没法用。
  • 防止误触发:比如一个接近传感器,因为噪声突然跳变,导致机器急停——我在产线上遇到过这种事,后果很严重。
  • 提高控制稳定性:PID控制器对输入噪声特别敏感。滤波后的数据,能让系统更平稳。

核心观点:滤波不是“美化数据”,而是“还原真实”。如果滤波后的数据跟真实物理量对不上,那这个滤波就是失败的。

1.2 噪声来源分析

噪声从哪来?我把它分成三类。你在实际项目中,可以按这个思路去排查。

噪声类型 典型来源 频率特征 我踩过的坑
热噪声 电阻、半导体结 白噪声,全频段 高精度ADC前级没加低通,读数跳得没法看
工频干扰 50Hz/60Hz电源 固定频率 屏蔽没做好,示波器一看全是50Hz正弦波
量化噪声 ADC量化过程 高频为主 12位ADC采0-3.3V,LSB=0.8mV,小信号直接淹没了
机械振动 电机、风扇 低频(几Hz到几百Hz) IMU装在振动平台上,角速度数据全是假的
射频干扰 无线模块、开关电源 高频(MHz级) WiFi天线靠近传感器线缆,数据偶尔跳一个大值

为什么会这样?其实每种噪声都有它的“脾气”。热噪声你躲不掉,只能靠硬件滤波或多次采样平均。工频干扰呢,用陷波器或者同步采样就能搞定。量化噪声嘛,提高分辨率或者加一点抖动(dithering)就能改善。

实战技巧:我建议你在设计初期,先拿示波器看看传感器输出端的噪声频谱。知道噪声在哪个频段,滤波器的设计就有的放矢了。别一上来就套滤波算法,先搞清楚敌人是谁。

1.3 滤波效果评估指标

滤波好不好,不能光靠眼睛看。我一般用下面这几个指标来量化评估。你想想看,如果连评估标准都没有,你怎么知道你的滤波算法是进步了还是退步了?

1.3.1 信噪比(SNR)

这是最直接的指标。滤波前后的SNR提升,就是你的滤波效果。

SNR = 10 * log10( P_signal / P_noise )  单位:dB

我个人的经验是,对于一般传感器,滤波后SNR提升10dB以上就算不错了。如果提升不到3dB,那基本等于没滤。

1.3.2 均方根误差(RMSE)

如果你有参考真值(比如用高精度仪器同时测量),RMSE是最公平的评估方式。

RMSE = sqrt( (1/N) * Σ (x_filtered - x_true)^2 )

注意:这里的x_true必须是真实物理量,不是原始测量值。我曾经犯过这个错——拿原始数据当真值去算RMSE,结果滤波效果越好RMSE反而越大,闹了笑话。

1.3.3 延迟(Latency)

滤波一定会引入延迟。这个指标在实时系统中特别重要。

  • 滑动平均:延迟 = 窗口长度的一半 × 采样周期
  • 一阶低通:延迟 ≈ 时间常数τ
  • 卡尔曼滤波:延迟取决于模型复杂度,一般1-3个采样周期

注意:延迟和滤波效果是一对矛盾。滤得越干净,延迟越大。你需要根据系统要求做权衡。比如电机转速控制,延迟超过10ms就可能振荡;而温度监测,延迟几秒钟完全没问题。

1.3.4 平滑度(Smoothness)

这个指标有点主观,但很实用。我常用的是“相邻点变化率”的标准差。

Smoothness = std( diff(x_filtered) )

数值越小,说明数据越平滑。但要注意,过度平滑会丢失真实变化。比如一个阶跃信号,滤波后如果变得太缓,那系统响应就跟不上了。

1.4 小结

好了,这一章的内容就这些。总结一下:

  • 滤波是为了从噪声中还原真实信号,不是美化数据
  • 噪声来源要具体分析,对症下药
  • 评估滤波效果要用量化指标,别光靠感觉

下一章,我会带大家深入几种最常用的滤波算法,从滑动平均到卡尔曼滤波,每个我都会给出实际代码和调试经验。咱们下章见。