1. 软件滤波基础概念
大家好,我是老张。做嵌入式十几年了,跟传感器打交道的日子比跟老婆相处的时间还长(开个玩笑)。今天咱们聊聊轨压传感器的软件滤波,这是整个课程的地基。地基打不牢,后面盖什么楼都得塌。
先问大家一个问题:你从ADC读到的轨压值,真的是真实的轨压吗?
答案很残酷——不是。你读到的,是真实信号加上一堆噪声的混合体。发动机振动、电磁干扰、温度漂移……这些噪声就像苍蝇一样,嗡嗡嗡地往你的采样值里钻。那怎么办?硬件上我们可以加RC滤波、加屏蔽罩,但成本上去了,板子空间也占了。这时候,软件滤波就登场了。
1.1 什么是软件滤波
软件滤波,说白了就是写几行代码,对ADC采样值做数学处理,把噪声干掉,把真实信号留下来。
我习惯这么定义它:软件滤波是一种通过算法对离散采样序列进行平滑或去噪的数字信号处理技术。它不需要额外的元器件,只需要CPU算力和你的算法功底。
举个例子,你连续采了10次轨压值:
原始采样:100, 105, 98, 102, 500, 101, 99, 103, 97, 104
看到那个500了吗?这明显是个干扰尖峰。如果你直接用这个值去做闭环控制,发动机可能直接抖成筛子。但如果你用软件滤波——比如中值滤波——把500剔除掉,剩下的值就很稳定了。
核心要点:软件滤波的本质是「用计算换精度」,用CPU的时间换取信号的纯净度。
1.2 软件滤波 vs 硬件滤波
很多新手问我:「老张,既然硬件滤波能搞定,为什么还要学软件滤波?」
嗯,这个问题我当年也问过我的师傅。他的回答让我记到现在:「硬件滤波是粗活,软件滤波是细活。」
咱们来对比一下:
| 对比维度 | 硬件滤波 | 软件滤波 |
|---|---|---|
| 成本 | 需要电阻、电容、运放等元器件 | 零硬件成本,只需代码 |
| 灵活性 | 焊上去就改不了,重新打板 | 改个参数重新烧录就行 |
| 高频噪声抑制 | 强,RC滤波对高频很有效 | 受限于采样率,高频处理较难 |
| 相位延迟 | 模拟滤波器有固定延迟 | 数字滤波器延迟可控,但存在 |
| 功耗 | 被动器件几乎不耗电 | 消耗CPU算力,增加功耗 |
| 抗干扰能力 | 受温漂、老化影响 | 不受温度影响,一致性高 |
我在一个柴油机项目中遇到过这种情况:硬件RC滤波已经把高频噪声压得差不多了,但低频的发动机振动噪声还是滤不掉。后来我在软件里加了一阶低通滤波,问题就解决了。你想想看,硬件和软件从来不是二选一,而是搭档。
我的建议:硬件滤波负责干掉高频噪声(比如100kHz以上的),软件滤波负责处理低频噪声和突发干扰。两者配合,效果最好。
1.3 软件滤波的优缺点
任何技术都有两面性,软件滤波也不例外。咱们客观聊聊。
优点
- 零成本修改:改个系数、换种算法,重新编译烧录就行。硬件滤波改一次,打板费几千块就没了。
- 适应性强:同一个传感器,怠速工况和高速工况的噪声特性完全不同。软件滤波可以动态调整参数,硬件滤波做不到。
- 可复现性高:同一套代码,在100块板子上跑出来的效果一模一样。硬件滤波受元器件精度影响,一致性差一些。
- 能处理复杂逻辑:比如剔除野值、自适应滤波,硬件电路很难实现。
缺点
- 占用CPU资源:复杂的滤波算法(比如卡尔曼滤波)会吃掉不少算力。在低端MCU上,你得精打细算。
- 存在相位延迟:所有软件滤波都会引入延迟。实时性要求高的系统(比如轨压闭环控制),延迟大了会出问题。
- 受采样率限制:根据奈奎斯特定理,软件滤波只能处理采样率一半以下的频率成分。采样率不够,滤波效果就大打折扣。
注意:我曾经在一个项目中过度依赖软件滤波,结果CPU负载飙到85%,导致其他任务被饿死。后来我加了一级简单的硬件RC滤波,软件滤波的负担就降下来了。记住,软件滤波不是万能的,别把所有希望都压在代码上。
1.4 滤波算法的评价指标
选滤波算法就像选车——你得知道自己要什么。是追求速度(实时性)?还是追求舒适(平滑度)?还是两者兼顾?
我一般用三个指标来评价一个滤波算法:
1. 实时性
说白了就是滤波算法的响应速度。输入信号变了,滤波输出多久能跟上?
举个例子,轨压从100bar突然升到200bar,好的滤波算法应该在几个采样周期内就反映出来。如果滤波太「重」,输出慢吞吞地爬上去,那发动机的响应就滞后了。
实时性通常用上升时间或延迟周期数来衡量。我个人的经验是:轨压控制场景下,延迟不要超过5个采样周期。
2. 平滑度
平滑度衡量的是滤波后的信号有多「干净」。噪声抑制得越好,平滑度越高。
但这里有个矛盾:平滑度和实时性往往是冲突的。你越想平滑,滤波就越「重」,延迟就越大。这就像开车——开得越稳(平滑),加速就越慢(实时性差)。
我习惯用标准差或峰峰值来量化平滑度。滤波后的信号标准差越小,说明越平滑。
3. 相位延迟
这个指标很多新手会忽略,但它特别重要。相位延迟指的是滤波输出相对于原始信号在时间上的滞后。
为什么会有延迟?因为滤波算法本质上是在做加权平均,它需要「看到」未来的数据才能做出平滑的判断。但未来数据我们看不到,所以只能用过去的数据来估计,这就产生了延迟。
在轨压控制中,相位延迟会导致控制指令滞后,严重时会引起系统振荡。我记得有一次做高压共轨系统调试,就是因为滤波延迟太大,导致轨压闭环控制出现了极限环振荡。后来我把滤波系数调小了,延迟降下来,振荡就消失了。
三个指标的权衡:
- 实时性要求高 → 选轻量级滤波(如限幅滤波、一阶滞后滤波)
- 平滑度要求高 → 选重量级滤波(如滑动平均、中值滤波)
- 相位延迟敏感 → 避免使用高阶滤波,考虑零相位滤波(但实时性差)
1.5 本章知识体系
为了让大家更直观地理解本章的内容结构,我画了一张图:
这张图把本章的核心内容串起来了。从软件滤波的定义出发,到与硬件滤波的对比,再到优缺点分析,最后落到三个评价指标上。后面的课程,我们会围绕这三个指标,逐一讲解各种滤波算法的实现和调优。
一个小建议:学滤波算法的时候,别急着写代码。先把这三个指标吃透。你拿到一个滤波算法,先问自己三个问题:它实时性怎么样?平滑度够不够?相位延迟能不能接受?想清楚了,选型就不会出错。
好了,第一章就聊到这儿。下一章我们开始动手,讲最基础的限幅滤波和限速滤波——这两个算法虽然简单,但我在实际项目中用得非常频繁,尤其是对付传感器偶尔冒出来的野值,特别好使。
公众号:蓝海资料掘金营,微信deep3321