news 2026/9/16 9:16:17

第八章: 滤波模块 —— 给你的数据“洗个澡”!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第八章: 滤波模块 —— 给你的数据“洗个澡”!

🧼 滤波模块 —— 给你的数据“洗个澡”!

✅ 适用对象:嵌入式初学者、传感器开发者
💡 核心目标:理解为什么需要滤波 + 掌握4种常用滤波算法 + 能在项目中灵活选用
🧠 特色:用“洗澡”比喻滤波过程,用“电话降噪”解释原理,小白秒懂!


🎧 一、什么是滤波?

想象你在嘈杂的菜市场打电话

  • 你想说:“今天温度是25度。”
  • 但背景有喇叭声、叫卖声、狗叫声……
  • 对方听到的是:“今…嗞嗞…25…嗡嗡…度?”

这时候,如果手机有个智能降噪功能,只保留你的声音、去掉杂音——这就是滤波

🔍技术定义
滤波就是在信号处理中,去除噪声或不需要的频率成分,保留有用信息的过程。


❓ 二、为什么要滤波?

在真实世界中,传感器采集的数据从来不是“干净”的:

噪声来源举例
环境干扰电磁干扰、电源波动
硬件误差ADC 量化误差、接触不良
突发干扰开关抖动、电机启停

如果不滤波:

  • 温度读数忽高忽低
  • 电机控制频繁抖动
  • 数据分析结果失真

滤波的作用
让数据更稳定、可靠、可信,就像给脏衣服“洗个澡”,焕然一新!


🧰 三、4 种常用滤波算法详解

1. 限幅滤波(Limit Filter)—— “设个安全围栏”

📌 原理

把数据限制在合理范围内,超出就“裁掉”。

🎯 使用场景
  • 传感器偶尔跳变(如 ADC 读到 0 或 4095 的异常值)
  • 已知物理量不可能超过某范围(如温度 -10℃ ~ 60℃)
✅ 优点:简单、快速
❌ 缺点:不能平滑连续噪声
void limit_value(uint32_t *data, int size, uint32_t min_val, uint32_t max_val) { for (int i = 0; i < size; i++) { // 修复:i++ → i++ if (data[i] < min_val) { data[i] = min_val; } else if (data[i] > max_val) { data[i] = max_val; } } }

💡生活比喻:就像给水位设上下限——太高溢出、太低干涸,系统自动“拉回”安全区。


2. 中值滤波(Median Filter)—— “取中间靠谱值”

📌 原理

对窗口内数据排序,取中位数。能有效消除脉冲噪声(尖峰干扰)。

🎯 使用场景
  • 图像去噪(椒盐噪声)
  • 传感器受瞬时干扰(如按键抖动、电机火花)
✅ 优点:抗尖峰干扰强,保留边缘
❌ 缺点:计算量大,不适合高频实时系统
#include <stdlib.h> #include <string.h> int compare(const void *a, const void *b) { return (*(uint32_t *)a - *(uint32_t *)b); } uint32_t mid_value(uint32_t *data, int size) { uint32_t *copy = (uint32_t *)malloc(size * sizeof(uint32_t)); memcpy(copy, data, size * sizeof(uint32_t)); qsort(copy, size, sizeof(uint32_t), compare); uint32_t median; if (size % 2 == 0) { // 修复:= → == median = (copy[size / 2 - 1] + copy[size / 2]) / 2; } else { median = copy[size / 2]; } free(copy); return median; }

💡生活比喻:10个人猜体重,去掉最高最低,取中间那个人的答案——更靠谱!


3. 算术平均滤波(Arithmetic Mean Filter)—— “大家投票取平均”

📌 原理

对 N 个采样值求平均,平滑小波动。

🎯 使用场景
  • 温度、湿度等缓慢变化的传感器
  • 需要降低随机噪声
✅ 优点:平滑效果好
❌ 缺点:响应慢,可能滞后;对突发噪声无效
uint32_t avg_value(uint32_t *data, int size) { uint32_t sum = 0; for (int i = 0; i < size; i++) { // 修复:i++ → i++ sum += data[i]; } return sum / size; }

💡生活比喻:考试去掉一个最高分、一个最低分,再算平均分——更公平!


4. 一阶滞后滤波(First Order Lag Filter)—— “温柔地跟随变化”

📌 原理

一种低通滤波器,输出 = α × 当前值 + (1−α) × 上次输出

  • α 越小,越平滑,但响应越慢
🎯 使用场景
  • 压力、液位、温度等缓慢变化的信号
  • 需要平滑曲线且保留趋势
✅ 优点:内存占用小(只需存上次值),平滑自然
❌ 缺点:对快速变化信号反应迟钝
uint32_t adc_filter(uint32_t CurrValue) { static uint32_t LastValue = 0; // 初始值设为0 // 等效于:LastValue = 0.25 * CurrValue + 0.75 * LastValue uint32_t tmp = (32 * CurrValue + 96 * LastValue) >> 7; // 修复:> → >> LastValue = tmp; return LastValue; }

🔧公式解析
(32 + 96) = 128>>7相当于/128
所以:tmp = (32/128)*Curr + (96/128)*Last = 0.25*Curr + 0.75*Last

💡生活比喻:老司机开车——不猛踩油门,也不急刹车,平稳跟车!


📈 四、滤波前后对比分析

下图展示了四种滤波算法对同一组含噪声原始数据(灰色虚线)的处理效果:

滤波类型曲线颜色效果描述
限幅滤波蓝色抑制了过大的噪声峰值,但保留了其他波动
中值滤波绿色有效去除尖锐脉冲,曲线更平滑
算术平均滤波橙色明显平滑,消除了小幅抖动
一阶滞后滤波红色温和跟踪信号,无突变,适合慢变信号

📊结论:没有“最好”的滤波,只有“最合适”的滤波!


🧪 五、使用场景与对比总结

滤波类型适用场景优点缺点
限幅滤波抑制突发性异常值实现简单、速度快无法平滑连续噪声
中值滤波脉冲噪声、图像处理强力去除尖峰,保边缘计算开销大
算术平均滤波平滑传感器数据效果稳定、易实现信号滞后,怕突变
一阶滞后滤波低频慢变信号内存小、平滑自然响应速度慢

📦 六、完整头文件示例(filter.h)

#ifndef __FILTER_H #define __FILTER_H #include <stdint.h> void limit_value(uint32_t *data, int size, uint32_t min_val, uint32_t max_val); int compare(const void *a, const void *b); uint32_t mid_value(uint32_t *data, int size); uint32_t avg_value(uint32_t *data, int size); uint32_t adc_filter(uint32_t CurrValue); #endif

🧠 本章口诀(背下来!)

🧼滤波就像洗个澡,脏数据变干净好!
🚧限幅设个安全区,异常值全踢掉!
🎯中值专治尖峰扰,排序取中真可靠!
📊平均投票最公平,小幅抖动全抹平!
🐢一阶滞后慢慢走,温柔平滑不抖手!
🔍选对滤波是关键,场景匹配才高效!


这份笔记完整覆盖了滤波所有内容,包括:

  • 滤波概念与必要性
  • 4种算法原理、代码、场景、优缺点
  • 代码细节修复(如i++==>>等)
  • 对比图表描述
  • 头文件与函数注释

现在,你不仅能理解滤波的意义,还能根据项目需求选择最合适的“洗澡方式”,让你的数据干干净净、稳稳当当!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 9:39:01

利用cubemx和HAL库重写江科协的oled驱动程序

I2C配置将PB6、PB7设置为SCL和SDA引脚&#xff08;硬件I2C&#xff09;OLED.cvoid OLED_I2C_SendByte(uint8_t Byte) {HAL_I2C_Master_Transmit(&hi2c1, 0x78, &Byte, 1, HAL_MAX_DELAY); }void OLED_WriteCommand(uint8_t Command) {uint8_t buf[]{0x00, Command};HAL…

作者头像 李华
网站建设 2026/9/16 5:31:53

LAMMPS分子动力学模拟技术与应用

LAMMPS是一款经典的分子动力学软件&#xff0c;免费开源&#xff0c;可以模拟液态、固态或气态的粒子的系综。目前LAMMPS计算主要应用于&#xff1a;&#xff08;1&#xff09;研究金属材料的力学性能&#xff0c;LAMMPS可以模拟金属材料的塑性变形和断裂行为&#xff0c;从而研…

作者头像 李华
网站建设 2026/9/16 5:10:10

深度学习中 z-score 标准化理解

深度学习中 z-score 标准化 在深度学习中&#xff0c;z-score&#xff08;标准分数&#xff09; 是核心的数据预处理工具&#xff0c;用于将数据标准化为「均值 0、标准差 1」的分布&#xff0c;本质是衡量单个数据点相对于数据集整体的偏离程度。它不仅能提升模型训练效率&a…

作者头像 李华
网站建设 2026/9/15 13:54:44

硬件测试面试题 - 模拟面试|AI面试官

易途AI面试官 – AI 模拟面试助你提升拿到 Offer 的成功率 点击开始模拟练习 &#x1f449; ms.laixiai.com 必备技能 电子工程基础知识&#xff1a;扎实的模拟电路、数字电路、信号处理、电路原理和半导体物理知识是基石。能够深入理解电子元器件的工作原理、电路设计与分析技…

作者头像 李华
网站建设 2026/9/16 18:11:49

QCoreApplication::aboutToQuit 可以链接多个槽函数吗

是的&#xff0c;QCoreApplication::aboutToQuit 信号可以连接多个槽函数。以下是详细解析&#xff1a;1. 信号槽机制特性Qt的信号槽机制支持“一对多”&#xff1a;一个信号&#xff08;如aboutToQuit&#xff09;可连接多个槽函数。当信号触发时&#xff0c;所有已连接的槽函…

作者头像 李华
网站建设 2026/9/15 12:08:07

VLAN实验

搭建拓扑图&#xff1a;创建VLAN&#xff1a;在trunk干道上放行VLAN&#xff1a;查看交换机接口与VLAN的对应关系&#xff1a;路由器接口配置&#xff1a;配置dhcp&#xff1a;主机获取IP地址&#xff1a;测试&#xff1a;经测试全网可通。实验总结&#xff1a;实验核心收获1. …

作者头像 李华