4、信号预处理:低通滤波、高通滤波、卡尔曼滤波在传感器数据中的应用

各位同学,咱们今天聊传感器信号预处理。说实话,这章内容我特别喜欢讲,因为在实际项目中,我见过太多「数据明明采集对了,但算法就是跑飞了」的案例。问题出在哪?往往就出在预处理这步没做好。

传感器出来的原始信号,说白了就是「脏数据」。噪声、毛刺、漂移,什么妖魔鬼怪都有。你想想看,如果直接把这种信号扔给融合算法,那结果能靠谱吗?所以,预处理不是可选项,而是必选项。

核心观点:预处理做得好,后续算法事半功倍;预处理偷懒,后面全白干。

4.1 低通滤波:把高频噪声滤掉

低通滤波,顾名思义,就是让低频信号通过,把高频噪声拦住。我个人的习惯是,只要传感器信号里存在高频抖动,比如加速度计的手抖、陀螺仪的机械振动,第一个想到的就是低通滤波。

最简单的低通滤波,就是一阶RC滤波的数字化版本。公式长这样:

y[n] = α * x[n] + (1 - α) * y[n-1]

其中α是滤波系数,取值范围0到1。α越小,滤波效果越强,但延迟也越大。α越大,响应越快,但噪声抑制能力弱。

我在项目中遇到过一个问题:用MPU6050做姿态解算时,原始加速度数据毛刺特别多。一开始我用了α=0.1,结果数据是平滑了,但响应慢得像蜗牛,稍微动一下要等半天才跟上。后来我调成α=0.3,效果就好多了。嗯,这里要注意:α的选取没有标准答案,得根据你的采样率和实际噪声水平来试。

避坑指南:我曾经在低通滤波上栽过跟头——采样率变了,但α没跟着调。结果同样的α值,在100Hz采样时滤波效果还行,换到200Hz采样时,滤波效果直接翻倍,信号延迟大到不可接受。所以,α要跟采样率挂钩,建议用时间常数τ来计算:α = Δt / (τ + Δt)。

4.2 高通滤波:把直流分量和低频漂移干掉

高通滤波跟低通正好相反,它让高频信号通过,滤掉低频成分。什么时候用?比如你要检测人的突然动作,但传感器本身有零点漂移,或者有重力加速度这种直流分量干扰。

一阶高通滤波的公式:

y[n] = β * (y[n-1] + x[n] - x[n-1])

其中β也是0到1之间的系数。β越大,截止频率越高,滤掉的低频成分越多。

我记得有一次做跌倒检测项目,加速度计的数据里混着重力分量。如果不做高通滤波,算法会把站立时的重力加速度误判为「静止状态」,导致跌倒时检测延迟。加上高通滤波后,重力分量被滤掉,只保留人体运动的动态成分,检测灵敏度一下子就上来了。

注意:高通滤波会丢失信号的直流信息。如果你需要知道传感器的绝对位置(比如海拔高度),那就不能用高通滤波,否则直流分量被滤掉后,你永远不知道自己在哪。

4.3 卡尔曼滤波:状态估计的「黄金标准」

低通和高通滤波,说白了都是「一刀切」的思路。但卡尔曼滤波不一样,它是个「智能」的滤波器。它能根据系统的动态模型和观测噪声,动态调整滤波策略。

卡尔曼滤波的核心思想,说白了就是两步走:

  1. 预测:根据上一时刻的状态,预测当前时刻的状态。
  2. 更新:用当前时刻的观测值,修正预测值。

这两步反复迭代,就能得到最优的状态估计。我刚开始学卡尔曼滤波时,觉得公式特别复杂。但后来发现,你只要理解它是在「预测」和「观测」之间做加权平均,就抓住了本质。

一个简单的卡尔曼滤波实现(一维情况):

// 预测
x_pred = x_prev;
P_pred = P_prev + Q;

// 更新
K = P_pred / (P_pred + R);
x_curr = x_pred + K * (z - x_pred);
P_curr = (1 - K) * P_pred;

这里Q是过程噪声协方差,R是观测噪声协方差。Q和R的取值,直接决定了滤波效果。Q设得大,说明你对模型不信任,更相信观测值;R设得大,说明你对观测值不信任,更相信模型预测。

个人经验:我在做无人机姿态估计时,Q和R的调参花了我整整一周时间。后来我发现一个技巧:先用离线数据跑一遍,观察残差(观测值减去预测值)的统计特性,然后根据残差的方差来反推Q和R的合理范围。这比瞎调靠谱多了。

4.4 三种滤波的对比与选择

为了让大家一目了然,我整理了一个对比表:

滤波类型 适用场景 优点 缺点 计算量
低通滤波 高频噪声抑制(加速度计、陀螺仪) 实现简单,实时性好 有相位延迟,会丢失高频细节 极低
高通滤波 去除直流分量、零点漂移 能提取动态变化信号 丢失直流信息,低频噪声放大 极低
卡尔曼滤波 多传感器融合、状态估计 最优估计,自适应性强 需要系统模型,调参复杂 中等

你想想看,如果你的项目只需要简单去噪,低通滤波就够了,没必要上卡尔曼滤波。但如果你要做多传感器融合,比如把加速度计和陀螺仪的数据融合成姿态角,那卡尔曼滤波就是首选。

4.5 知识体系总览

下面这张图,是我自己画的信号预处理知识框架,方便大家理解三种滤波的关系和适用边界:

传感器信号预处理知识体系 原始传感器信号 低通滤波 保留低频,滤除高频噪声 高通滤波 保留高频,滤除直流漂移 卡尔曼滤波 最优状态估计,自适应融合 应用场景 加速度计去噪 陀螺仪平滑 应用场景 跌倒检测 手势识别 应用场景 多传感器融合 姿态估计 选择原则:简单问题用简单方法 能低通就别上卡尔曼,别杀鸡用牛刀

这张图把三种滤波的定位说得很清楚。低通和高通是「频率域」的滤波器,适合处理单一噪声问题。卡尔曼滤波是「状态空间」的滤波器,适合处理多源数据融合和动态估计问题。

我的建议:初学者先从低通滤波入手,把α调明白了,再学卡尔曼滤波。别一上来就啃卡尔曼,容易把自己绕晕。我在带团队时,新人都先从一阶低通开始练手,等他们能说出「α=0.2时延迟多少毫秒」这种话,再让他们碰卡尔曼。

好了,信号预处理这块就聊到这儿。三种滤波各有各的脾气,选对了事半功倍,选错了事倍功半。记住一句话:没有最好的滤波,只有最合适的滤波。


专注资料整理