课程导论:为什么传感器数据需要预处理?常见噪声类型与滤波目标概述

大家好,我是你们这门课的主讲。在嵌入式系统里摸爬滚打了十几年,我见过太多因为传感器数据没处理好而翻车的项目了。

你想想看,一个价值几块钱的MEMS加速度计,焊在板子上,周围是开关电源的噪声、电机转动产生的振动、还有温度漂移。它输出的原始数据,说白了就是一堆“脏数据”。你要是直接拿这数据去做姿态解算、做故障诊断,那结果基本没法看。

所以,传感器数据预处理,不是可选项,而是必选项。它是所有后续算法能够正常工作的基石。

为什么原始数据不能直接用?

我刚开始做项目那会儿,也犯过傻。记得有一次调试一个工业机械臂的力传感器,采集回来的数据直接用来做力控。结果机械臂自己在那抖得跟帕金森似的。查了半天,发现是电源纹波耦合进了传感器信号。嗯,从那以后,我再也不敢跳过预处理这一步了。

具体来说,原始数据的问题主要出在三个方面:

  • 噪声污染:传感器本身的热噪声、量化噪声,加上外部电磁干扰,信号里混着各种乱七八糟的成分。
  • 异常值:通信丢包、传感器瞬间饱和、或者被什么东西撞了一下,数据里会出现离谱的“野点”。
  • 尺度不一致:不同传感器的量程、单位、分辨率都不一样。比如一个测温度,一个测压力,数值范围差好几个数量级,直接放一起算肯定不行。

说白了,预处理的目的就一个:把原始信号里那些“不想要”的东西去掉,把“想要”的信息保留下来,并且让数据变得规整、可用。

常见噪声类型:你得知道你的敌人是谁

做滤波之前,先得搞清楚噪声长什么样。我个人习惯把传感器噪声分成这么几类:

噪声类型 典型来源 频率特性 我遇到过的坑
白噪声 热噪声、半导体散粒噪声 全频段均匀分布 ADC采样值在低位来回跳,看着就烦
低频漂移 温度变化、器件老化 0.1Hz以下 陀螺仪零偏随温度慢慢飘,积分后角度越算越偏
工频干扰 50Hz/60Hz电源线耦合 固定频率及其谐波 心电信号里那个50Hz的毛刺,怎么滤都滤不干净
脉冲噪声 静电放电、通信误码 时域上窄而尖 激光雷达偶尔蹦出一个几十米外的点,其实是灰尘反射
量化噪声 ADC有限分辨率 与采样频率相关 12位ADC和16位ADC,做FFT时底噪差一大截

为什么会这样?因为不同的噪声,需要用不同的“武器”去对付。比如白噪声适合用滑动平均,工频干扰得用陷波器,脉冲噪声则要用中值滤波。

滤波目标概述:我们到底想达到什么效果?

滤波不是万能的。你不能指望一个低通滤波器既能滤掉高频噪声,又能保留信号的快速变化。这本身就是一对矛盾。

我个人把滤波目标归纳为三个层次:

  1. 第一层:去噪。把信噪比提上去。这是最基本的要求。比如ADC采样值从±5个LSB的抖动,降到±1个LSB以内。
  2. 第二层:保真。在去噪的同时,尽量不破坏原始信号的特征。比如边缘不能变模糊,相位延迟不能太大。这一点在实时控制里特别重要。
  3. 第三层:提取。从复杂的混合信号中,把特定频率或特定形态的分量分离出来。比如从振动信号里提取出轴承故障的特征频率。

核心原则:滤波器的设计,本质上是在“噪声抑制”和“信号保真”之间做权衡。没有最好的滤波器,只有最适合你应用场景的滤波器。

一个简单的例子:看看原始数据有多“脏”

假设我们用12位ADC采集一个缓慢变化的温度信号。理想情况下,温度从25°C升到26°C,ADC值应该平滑上升。但实际采集到的数据可能是这样的:

// 原始ADC采样值(单位:LSB)
int raw_data[] = {2048, 2051, 2047, 2053, 2049, 2060, 2045, 2052, 2048, 2055};
// 注意看第6个点:2060,明显是个异常值(野点)
// 而且相邻点之间跳变达到6个LSB,这比真实温度变化快多了

你看,第6个点2060,比前后都高出一截。这可能是电源波动或者瞬间干扰造成的。如果不处理,后续计算平均值时,这个点就会把结果拉偏。

经过一个简单的3点滑动平均滤波后:

// 滤波后数据
int filtered_data[] = {2049, 2050, 2050, 2051, 2051, 2052, 2052, 2052, 2050, ...};
// 野点被平滑掉了,数据变得稳定多了

小提示:在实际项目中,我通常会在ADC中断服务函数里直接做一级简单的硬件滤波(比如RC低通),然后再在MCU主循环里做软件滤波。这样硬件先干掉高频噪声,软件再处理低频漂移和异常值,效果最好。

避坑指南:预处理阶段最容易犯的错

我曾经在一个无人机飞控项目里,为了追求数据平滑,把滑动平均的窗口设得特别大。结果呢?数据是平滑了,但飞控的反应延迟也大了。无人机稍微一倾斜,要等好几百毫秒才能反应过来。最后炸机了。

所以,这里有几个坑你得注意:

  • 过度滤波:滤波强度太大,信号细节全没了。尤其是边缘检测、峰值检测这类应用,滤波会直接毁掉你的特征。
  • 忽略相位延迟:所有因果滤波器都会引入延迟。实时系统里,延迟就是不稳定性的来源。
  • 一刀切的参数:不同工况下,噪声特性可能完全不同。比如电机启动和停止时,电磁干扰强度差很多。固定参数的滤波器往往顾此失彼。

警告:千万不要在没搞清楚噪声来源的情况下,盲目套用滤波器。先拿示波器看看信号长什么样,或者做一段FFT分析,搞清楚噪声的频率范围。这叫“先诊断,再开药”。

好了,这一章我们先把“为什么”和“是什么”讲清楚。接下来的章节,我会带着大家一步步实现各种滤波算法,从最简单的滑动平均,到卡尔曼滤波,再到自适应滤波。每一行代码我都会解释清楚它的物理意义。

记住,传感器数据预处理,是嵌入式工程师的基本功。基本功扎实了,后面做控制、做AI,才能站得稳。