尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C 语言工业级通用组件手写 17:滑动平均滤波
目录前言一、滑动平均滤波核心本质与应用场景1. 什么是滑动平均滤波2. 解决的核心痛点3. 典型工业落地场景二、核心实现原理1. 滑动窗口机制2. 增量求和算法工业优化3. 输出逻辑三、工业级设计规范1. 封装设计2. 接口设计3. 鲁棒约束4. 线程安全四、完整可复用源码1、filter_avg.h2、filter_avg.c五、实战演示六、进阶优化方向七、面试考点与易错坑点面试问答常见坑点总结前言传感器采集原始数据普遍存在高频抖动、杂波干扰、数值跳变直接上报会导致屏幕闪烁、控制算法抖动、阈值误触发。滑动平均滤波是嵌入式最通用、最稳、不丢数据、低延时的基础滤波方案。相比中值滤波容易丢峰、均值滤波响应慢滑动平均兼顾平滑度与实时性适配温度、电压、电流、压力、ADC 采样绝大多数场景。本篇手写工业级可复用滑动平均滤波组件支持动态窗口、静态缓冲区、无动态内存、裸机零依赖是嵌入式传感器数据预处理标配组件。一、滑动平均滤波核心本质与应用场景1. 什么是滑动平均滤波滑动平均滤波原理开辟固定长度数据缓冲区新数据覆盖旧数据、窗口持续滑动每次计算窗口内所有数据平均值作为有效输出。始终保留最新 N 组采样摒弃老旧无效数据实现实时更新、平滑降噪。核心特性滤除高频随机干扰波形极度平滑保留数据变化趋势无严重滞后算法简单、运算量极小、MCU 无压力支持静态数组无内存碎片可自定义滤波强度窗口大小2. 解决的核心痛点解决 ADC 采样跳变问题消除电源纹波、电磁干扰带来的数值抖动。解决普通均值滤波滞后严重问题不需要等待满批数据实时滑动更新。解决传感器数据不稳定问题温度、压力、电压稳态数据平滑输出。解决工程滤波算法重复造轮子统一标准化滤波结构体多传感器多实例独立滤波。解决低端单片机算力不足问题仅累加、除法无复杂运算。3. 典型工业落地场景MCU ADC 电压、电流采集滤波。温湿度、压力、重力传感器数据平滑。电池电压、电量实时监测防抖。电机转速、PID 反馈量预处理。工业设备模拟量采样、稳态数据上报。二、核心实现原理1. 滑动窗口机制设定滤波窗口大小 N缓冲区始终存储最新 N 次采样值。新采样数据推入缓冲区淘汰最老旧数据窗口不断向前滑动。2. 增量求和算法工业优化不每次遍历全部数据求和采用增量计算新总和 旧总和 - 淘汰旧值 新增采样值大幅降低运算量窗口越大优化效果越明显。3. 输出逻辑窗口未满优先实时平均快速收敛。窗口写满固定滑动更新稳态超级平滑。三、工业级设计规范1. 封装设计面向对象结构体封装支持多实例独立滤波。多个传感器可以单独创建滤波对象互不干扰。 纯静态内存全程无 malloc。2. 接口设计接口功能说明filter_avg_init初始化滑动平均滤波对象filter_avg_calc输入新采样值输出滤波后结果filter_avg_clear清空滤波缓存重置状态3. 鲁棒约束窗口参数合法性校验禁止 0 窗口、超大窗口。指针空判断防止非法访问。 首次采样自动初始化避免初始值偏差。4. 线程安全单实例单任务调用绝对安全。 多线程使用需外部加锁保护。四、完整可复用源码1、filter_avg.h#ifndef FILTER_AVG_H #define FILTER_AVG_H #include stdint.h #include stdbool.h #ifdef __cplusplus extern C { #endif // 最大滤波窗口 #define FILTER_AVG_MAX_WIN 16 typedef struct { int32_t buf[FILTER_AVG_MAX_WIN]; int32_t sum; uint8_t idx; uint8_t win_size; bool init_ok; } filter_avg_t; /** * brief 滑动平均滤波初始化 * param filter: 滤波结构体指针 * param win_size: 滤波窗口大小 */ void filter_avg_init(filter_avg_t *filter, uint8_t win_size); /** * brief 滑动平均滤波计算 * param filter: 滤波结构体指针 * param val: 原始采样值 * return 滤波后稳态值 */ int32_t filter_avg_calc(filter_avg_t *filter, int32_t val); /** * brief 清空滤波缓冲区重置滤波状态 * param filter: 滤波结构体指针 */ void filter_avg_clear(filter_avg_t *filter); #ifdef __cplusplus } #endif #endif2、filter_avg.c#include filter_avg.h void filter_avg_init(filter_avg_t *filter, uint8_t win_size) { if(filter NULL || win_size 0 || win_size FILTER_AVG_MAX_WIN) return; filter-sum 0; filter-idx 0; filter-win_size win_size; filter-init_ok false; for(uint8_t i 0; i FILTER_AVG_MAX_WIN; i) { filter-buf[i] 0; } } int32_t filter_avg_calc(filter_avg_t *filter, int32_t val) { if(filter NULL || filter-win_size 0) return val; // 窗口未满初始化填充 if(!filter-init_ok) { filter-sum val; filter-buf[filter-idx] val; if(filter-idx filter-win_size) { filter-init_ok true; } return filter-sum / filter-idx; } // 窗口已满滑动增量计算 filter-sum - filter-buf[filter-idx]; filter-sum val; filter-buf[filter-idx] val; filter-idx; if(filter-idx filter-win_size) { filter-idx 0; } return filter-sum / filter-win_size; } void filter_avg_clear(filter_avg_t *filter) { if(filter NULL) return; filter-sum 0; filter-idx 0; filter-init_ok false; for(uint8_t i 0; i FILTER_AVG_MAX_WIN; i) { filter-buf[i] 0; } }五、实战演示#include stdio.h #include filter_avg.h int main(void) { // 初始化窗口大小为8 filter_avg_t adc_filter; filter_avg_init(adc_filter, 8); // 模拟带干扰的ADC采样数据 int32_t raw_data[] {220,225,218,300,222,223,219,221,224,217,220}; for(int i 0; i sizeof(raw_data)/sizeof(raw_data[0]); i) { int32_t out filter_avg_calc(adc_filter, raw_data[i]); printf(原始值%d \t滤波值%d\r\n, raw_data[i], out); } return 0; }六、进阶优化方向可变窗口自适应滤波动态根据波动幅度调整窗口大小抖动大加大窗口变化快减小窗口兼顾速度与平滑。限幅滑动平均新增最大偏差阈值突变超差直接舍弃杜绝尖峰干扰影响稳态数据。浮点型滤波扩展适配高精度传感器支持浮点数据平滑处理。加权滑动平均新增加权系数新数据权重更高提升响应速度老旧数据权重降低。七、面试考点与易错坑点1、面试问答Q1滑动平均滤波和普通均值滤波有什么区别答普通均值需要攒满 N 个数据再计算滞后大、实时差滑动平均采用窗口滑动 增量求和每次采样即时输出实时性强、波形更平滑。Q2增量求和的优势是什么答无需每次遍历全部缓冲区求和把 O (N) 运算降为 O (1)窗口越大性能提升越明显极大节省单片机算力。Q3滑动平均滤波的优缺点是什么答优点算法简单、平滑度高、抗高频干扰强、实时性好缺点对低频漂移、缓慢偏差过滤效果差存在轻微滞后。Q4滤波窗口大小如何工程选型答窗口越小响应越快、平滑越差窗口越大稳态越稳、滞后越严重。高速变化信号选小窗口稳态监测信号选大窗口。Q5多传感器滤波为什么要用结构体多实例设计答全局单滤波变量会互相干扰结构体多实例可以让电压、温度、压力各自独立滤波参数互不串扰代码工程化、可复用。Q6滑动平均适合哪些干扰场景不适合哪些场景答适合高频随机抖动、电源纹波、微小杂波干扰。不适合大幅尖峰脉冲、低频漂移、阶跃突变场景。2.常见坑点窗口设置过大导致数据严重滞后控制响应变慢。不做初始化判断前几帧数据异常偏差。多传感器共用一个滤波句柄数据错乱。未做指针校验传入空指针导致死机。直接使用有符号溢出数据导致求和错乱。总结滑动平均滤波是嵌入式传感器数据预处理第一标配算法代码极简、效率极高、稳定性强。完美解决普通均值滤波滞后、原始采样抖动跳变问题兼顾实时性与平滑度。本文组件采用多实例结构体设计、增量优化、安全防护工业级稳健可靠可直接落地所有嵌入式采集项目。创作不易如果对你有帮助欢迎点赞、收藏、转发。
RELATED

相关推荐

基于深度学习的网络流量智能分类与控制实践

基于深度学习的网络流量智能分类与控制实践

1. 项目背景与核心价值网络流量分类与控制一直是企业IT管理和网络安全领域的关键课题。传统基于端口或协议的分析方法在面对加密流量和动态端口应用时越来越力不从心。我在实际运维工作中发现,随着视频会议、云办公等应用的普及,单纯依靠IP五元组的流量控…

📅 2026/8/6 17:48:58
Windows 11终极优化指南:5分钟彻底清理臃肿系统,性能提升40%

Windows 11终极优化指南:5分钟彻底清理臃肿系统,性能提升40%

Windows 11终极优化指南:5分钟彻底清理臃肿系统,性能提升40% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to…

📅 2026/8/7 7:30:09
如何在ComfyUI中轻松实现专业级AI视频生成:WanVideo插件完全指南

如何在ComfyUI中轻松实现专业级AI视频生成:WanVideo插件完全指南

如何在ComfyUI中轻松实现专业级AI视频生成:WanVideo插件完全指南 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 想要将静态图片变成生动的视频吗?ComfyUI-WanVideoWrapp…

📅 2026/8/7 6:24:49
MORE NEWS

更多资讯

📰

魔兽世界76级高效刷本升级攻略与副本推荐

1. 魔兽世界76级高效刷经验副本选择指南作为一款运营多年的经典MMORPG,《魔兽世界》的升级过程一直是玩家关注的重点。对于76级的玩家来说,找到合适的刷经验地点可以大幅提升升级效率。本文将详细介绍几个适合76级玩家无限刷怪的副本,以及相关…

📰

为LLM打造可靠知识库:基于Wiki思路的RAG内容组织与检索优化实践

先说一个我在做LLM应用时经常遇到的尴尬场景:费了半天劲搭好的知识库,模型回答起来总像"断片"一样,引用的内容东拼西凑,甚至把两段毫不相干的文档缝合在一起。问题的根源往往不在模型,而在喂给模型的知识库本…

📰

Python信用卡客户高风险识别:从特征工程到评分卡的完整建模实践

简介:这是一份基于Python实现的信用卡客户高风险识别毕业设计项目,面向计算机相关专业在校生、课程设计及实训场景,解决从数据探索、清洗到聚类建模的完整流程。围绕历史信用风险、经济风险与收入风险三个维度,通过K-Means算法构建…

📰

兔年红包页面源码拆解:HTML+CSS+JS打造前端交互动效

简介:这是一份以HTML/CSS/JavaScript实现的兔年新年互动红包页面源码,适合前端初学者或节日活动开发者参考,用于快速搭建具有微信红包开启动画效果的网页小应用。压缩包共1771个文件,大小约6.6MB,其中包含1751个用于图…

📰

基于MIT-BIH数据库与2D CNN的心律不齐心拍分类实现

简介:基于MIT-BIH数据库与二维卷积神经网络实现的心律不齐诊断算法源码项目,采用二维CNN作为核心模型,围绕八种心率不齐类型的自动识别问题,完整覆盖从心电数据读取、预处理、二维特征构造、模型搭建到训练评估的整个流程。项目面…

📰

数据库升级必修课:表结构同步与数据迁移实战

我有一阵子没碰过数据库结构升级这块了,结果上个月接了一个活儿,系统要从WSO版本往新版本升,需求文档里就一行字:“需要更新的数据表戳”,负责人还特意标红了。我当时一看这描述就知道,这次升级的核心难点压…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬