最好的一站式家装公司太原再次发出通告
2025/12/29 2:02:04 网站建设 项目流程
最好的一站式家装公司,太原再次发出通告,做论坛app网站,wordpress cloudflare#x1f9fc; 滤波模块 —— 给你的数据“洗个澡”#xff01;✅ 适用对象#xff1a;嵌入式初学者、传感器开发者 #x1f4a1; 核心目标#xff1a;理解为什么需要滤波 掌握4种常用滤波算法 能在项目中灵活选用 #x1f9e0; 特色#xff1a;用“洗澡”比喻滤波过程… 滤波模块 —— 给你的数据“洗个澡”✅ 适用对象嵌入式初学者、传感器开发者 核心目标理解为什么需要滤波 掌握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) 1287相当于/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、、等对比图表描述头文件与函数注释现在你不仅能理解滤波的意义还能根据项目需求选择最合适的“洗澡方式”让你的数据干干净净、稳稳当当

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询