当前位置: 首页 > news >正文

单片机ADC采样十大滤波算法详解与应用

单片机AD采样常用的十大滤波算法详解

1. 引言

在嵌入式系统开发中,模拟信号采集是一个基础且关键的环节。由于环境干扰、传感器噪声等因素,ADC采样值往往包含各种噪声。本文将详细介绍十种常用的ADC滤波算法,分析其原理、实现方法及适用场景。

2. 滤波算法分类与选择原则

根据处理方式和适用场景,ADC滤波算法可分为以下几类:

  • 时域滤波:限幅滤波、中位值滤波、消抖滤波等
  • 统计滤波:算术平均滤波、递推平均滤波等
  • 复合滤波:限幅平均滤波、中位值平均滤波等
  • 预测滤波:一阶滞后滤波、加权递推平均滤波等

选择滤波算法时需考虑以下因素:

  • 信号变化速率
  • 噪声类型(脉冲干扰、周期性干扰等)
  • 系统实时性要求
  • 处理器资源限制

3. 十大滤波算法详解

3.1 限幅滤波

3.1.1 算法原理

基于经验设定最大允许偏差值A,当本次采样值与上次有效值之差超过A时,视为无效采样。

#define A 10 char Value; char filter() { char new_Value; new_Value = get_ad(); // 获取采样值 if(abs(new_Value - Value) > A) return Value; return new_Value; }
3.1.2 特点分析
  • 优点:有效克服脉冲干扰
  • 缺点:无法抑制周期性干扰,平滑度较差
  • 适用场景:信号变化缓慢且偶发脉冲干扰的场合

3.2 中位值滤波

3.2.1 算法原理

连续采样N次,排序后取中位值作为有效值。

#define N 11 char filter() { char value_buf[N]; char count,i,j,temp; for(count=0; count<N; count++) { value_buf[count] = get_ad(); delay(); } for(j=0; j<(N-1); j++) for(i=0; i<(N-j); i++) if(value_buf[i]>value_buf[i+1]) { temp = value_buf[i]; value_buf[i] = value_buf[i+1]; value_buf[i+1] = temp; } return value_buf[(N-1)/2]; }
3.2.2 特点分析
  • 优点:对缓慢变化的参数(如温度)滤波效果好
  • 缺点:不适用于快速变化的信号
  • 典型应用:温度、湿度等慢变信号采集

3.3 算术平均滤波

3.3.1 算法原理

连续采样N次取算术平均值。

#define N 12 char filter() { int sum = 0; for(count=0; count<N; count++) sum += get_ad(); return (char)(sum/N); }
3.3.2 特点分析
  • 优点:对随机干扰抑制效果好
  • 缺点:占用RAM多,速度慢
  • 参数选择:N值越大平滑度越高但灵敏度越低

3.4 递推平均滤波

3.4.1 算法原理

维护一个长度为N的采样队列,每次新采样值入队,最旧值出队,取队列均值。

#define N 12 char value_buf[N]; char i=0; char filter() { char new_value, sum=0; new_value=get_ad(); value_buf[i++]=new_value; if(i==N) i=0; for(count=0; count<N; count++) sum+=value_buf[count]; return (char)(sum/N); }
3.4.2 特点分析
  • 优点:对周期性干扰抑制效果好
  • 缺点:对脉冲干扰敏感
  • 优化方向:可结合限幅滤波提高抗脉冲干扰能力

3.5 中位值平均滤波

3.5.1 算法原理

采样N个值,去掉最大最小值后取平均。

#define N 12 char filter() { char count,i,j; char Value_buf[N]; int sum=0; for(count=0; count<N; count++) Value_buf[count]= get_ad(); for(j=0; j<(N-1); j++) for(i=0; i<(N-j); i++) if(Value_buf[i]>Value_buf[i+1]) { temp = Value_buf[i]; Value_buf[i]= Value_buf[i+1]; Value_buf[i+1]=temp; } for(count=1; count<N-1; count++) sum += Value_buf[count]; return (char)(sum/(N-2)); }
3.5.2 特点分析
  • 优点:结合中位值和平均值的优势
  • 缺点:计算量大,RAM占用高
  • 适用场景:对数据可靠性要求高的场合

3.6 限幅平均滤波

3.6.1 算法原理

先对采样值进行限幅处理,再送入递推平均滤波队列。

#define A 10 #define N 12 char value; char value_buf[N]; char i=0; char filter() { char new_value, sum=0; new_value=get_ad(); if(abs(new_value-value)<A) value_buf[i++]=new_value; if(i==N) i=0; for(count=0; count<N; count++) sum+=value_buf[count]; return (char)(sum/N); }
3.6.2 特点分析
  • 优点:有效抑制脉冲干扰和随机噪声
  • 缺点:实现复杂度较高
  • 工程建议:A值需根据信号特性调整

3.7 一阶滞后滤波

3.7.1 算法原理

采用一阶惯性环节实现数字滤波。

#define a 30 char value; char filter() { char new_value; new_value=get_ad(); return ((100-a)*value + a*new_value)/100; }
3.7.2 特点分析
  • 优点:计算量小,对周期性干扰抑制效果好
  • 缺点:相位滞后,灵敏度低
  • 参数调整:a值决定滤波效果,a越小滤波效果越强

3.8 加权递推平均滤波

3.8.1 算法原理

对递推平均滤波的改进,不同时刻数据赋予不同权重。

#define N 12 char code coe[N]={1,2,3,4,5,6,7,8,9,10,11,12}; char code sum_coe=1+2+3+4+5+6+7+8+9+10+11+12; char filter() { char count; char value_buf[N]; int sum=0; for(count=0; count<N; count++) value_buf[count]=get_ad(); for(count=0; count<N; count++) sum+=value_buf[count]*coe[count]; return (char)(sum/sum_coe); }
3.8.2 特点分析
  • 优点:新数据权重高,响应速度快
  • 缺点:平滑度较低
  • 权重设计:可根据实际需求调整权重分布

3.9 消抖滤波

3.9.1 算法原理

通过计数器机制消除信号抖动。

#define N 12 char filter() { char count=0, new_value; new_value=get_ad(); while(value!=new_value) { count++; if(count>=N) return new_value; new_value=get_ad(); } return value; }
3.9.2 特点分析
  • 优点:有效消除临界值附近的抖动
  • 缺点:对快速变化信号不适用
  • 应用场景:按键检测、开关量采集等

3.10 限幅消抖滤波

3.10.1 算法原理

结合限幅和消抖两种滤波方式。

#define A 10 #define N 12 char value; char filter() { char new_value, count=0; new_value=get_ad(); while(value!=new_value) { if(abs(value-new_value)<A) { count++; if(count>=N) return new_value; new_value=get_ad(); } return value; } }
3.10.2 特点分析
  • 优点:双重保护,可靠性高
  • 缺点:实现复杂度高
  • 工程建议:先调限幅参数A,再调消抖计数N

4. 算法性能对比与选型指南

算法类型抗脉冲干扰抗周期性干扰实时性RAM占用适用场景
限幅滤波慢变信号
中位值滤波温度等慢变信号
算术平均滤波随机噪声抑制
递推平均滤波周期性干扰
中位值平均滤波高可靠性要求
限幅平均滤波混合干扰环境
一阶滞后滤波周期性干扰抑制
加权递推平均滤波需快速响应的系统
消抖滤波开关量采集
限幅消抖滤波高可靠性开关量采集

5. 实际应用建议

  1. 复合使用:对于复杂噪声环境,可组合使用多种滤波算法
  2. 参数调整:所有算法参数需根据实际信号特性调整
  3. 资源考量:在资源受限的MCU上慎用高内存占用的算法
  4. 实时性平衡:根据系统响应要求选择合适的算法复杂度
  5. 动态调整:可考虑根据信号变化率动态调整滤波参数
http://www.jsqmd.com/news/547346/

相关文章:

  • Python实战 | 利用pykrige实现克里金(Kriging)插值及空间热力图绘制
  • 2026南通抖音代运营优质服务商推荐榜 - 优质品牌商家
  • RT-DETR调参实战:如何通过YAML文件中的10个关键参数,将mAP提升5%以上
  • 现代响应式图片的最佳实践,使用<picture>元素,结合了格式优化(AVIF/WebP)、降级兼容(JPEG)和性能优化(fetchpriority=“high“)
  • 【STM32实战】步进电机S型曲线算法优化与误差补偿策略
  • OpenClaw沙盒体验:星图平台GLM-4.7-Flash镜像快速试用
  • 保姆级教程:用薛定谔Schrodinger Maestro搞定共价对接,从蛋白处理到结果分析
  • SpringBoot+Vue学习资源推荐系统源码+论文
  • 避坑指南:ThingsBoard PostgreSQL数据库性能调优与表分区实战
  • 提升javascript开发效率:用快马一键生成常用工具函数库
  • 医美私信获客新范式:快商通AI私信机器人如何实现高效客户转化
  • OpenClaw跨平台方案:Qwen3.5-4B-Claude模型在Windows/macOS双环境部署
  • 逆向工程必备:用aardio和Sunny中间件抓取手机App封包的3种实战姿势
  • REncoder:Arduino轻量级旋转编码器与按键驱动库
  • 别再只会docker push了!Harbor镜像上传的5个隐藏技巧与实战避坑指南
  • JSP + Servlet:构建动态Web应用的经典组合
  • 提升开放平台开发效率,快马AI工具链自动化集成与测试
  • Vin象棋:基于Yolov5的智能象棋辅助工具
  • 告别音频切换烦恼:AudioSwitch让你一键掌控电脑声音系统
  • 从零到一:利用Nessus定制化基线脚本实现精准合规审计
  • PostgreSQL权限管理实操:Homebrew安装后,如何正确创建postgres用户并导入项目数据
  • ComfyUI Qwen-Image-Edit-F2P 人脸生成图像:创意应用案例,让你的自拍变身艺术照
  • 双阶段目标检测算法演进:从R-CNN到Mask R-CNN的技术突破与应用实践
  • 实战指南:通过快马部署企业级oh-my-opencode管理系统
  • 原神帧率解锁终极方案:genshin-fps-unlock完全指南
  • 毕设程序java高校学生心理健康预约系统 基于SpringBoot的大学生心理咨询服务平台设计与实现 高校心理健康服务预约管理系统的设计与开发
  • Nuitka打包Python脚本为.exe的完整避坑指南(含Selenium解决方案)
  • 保姆级教程:在Cesium三维地球上用kriging.js绘制降雨分布图(附完整代码)
  • Poppler Windows版技术架构深度解析:跨平台PDF处理的零配置解决方案
  • 软件从业者心脏保护指南:日常防护与科学锻炼全攻略