单片机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(count0; countN; count) { value_buf[count] get_ad(); delay(); } for(j0; j(N-1); j) for(i0; i(N-j); i) if(value_buf[i]value_buf[i1]) { temp value_buf[i]; value_buf[i] value_buf[i1]; value_buf[i1] 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(count0; countN; 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 i0; char filter() { char new_value, sum0; new_valueget_ad(); value_buf[i]new_value; if(iN) i0; for(count0; countN; count) sumvalue_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 sum0; for(count0; countN; count) Value_buf[count] get_ad(); for(j0; j(N-1); j) for(i0; i(N-j); i) if(Value_buf[i]Value_buf[i1]) { temp Value_buf[i]; Value_buf[i] Value_buf[i1]; Value_buf[i1]temp; } for(count1; countN-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 i0; char filter() { char new_value, sum0; new_valueget_ad(); if(abs(new_value-value)A) value_buf[i]new_value; if(iN) i0; for(count0; countN; count) sumvalue_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_valueget_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_coe123456789101112; char filter() { char count; char value_buf[N]; int sum0; for(count0; countN; count) value_buf[count]get_ad(); for(count0; countN; count) sumvalue_buf[count]*coe[count]; return (char)(sum/sum_coe); }3.8.2 特点分析优点新数据权重高响应速度快缺点平滑度较低权重设计可根据实际需求调整权重分布3.9 消抖滤波3.9.1 算法原理通过计数器机制消除信号抖动。#define N 12 char filter() { char count0, new_value; new_valueget_ad(); while(value!new_value) { count; if(countN) return new_value; new_valueget_ad(); } return value; }3.9.2 特点分析优点有效消除临界值附近的抖动缺点对快速变化信号不适用应用场景按键检测、开关量采集等3.10 限幅消抖滤波3.10.1 算法原理结合限幅和消抖两种滤波方式。#define A 10 #define N 12 char value; char filter() { char new_value, count0; new_valueget_ad(); while(value!new_value) { if(abs(value-new_value)A) { count; if(countN) return new_value; new_valueget_ad(); } return value; } }3.10.2 特点分析优点双重保护可靠性高缺点实现复杂度高工程建议先调限幅参数A再调消抖计数N4. 算法性能对比与选型指南算法类型抗脉冲干扰抗周期性干扰实时性RAM占用适用场景限幅滤波优差优低慢变信号中位值滤波良中中中温度等慢变信号算术平均滤波中良差高随机噪声抑制递推平均滤波中优中高周期性干扰中位值平均滤波优良差高高可靠性要求限幅平均滤波优良中高混合干扰环境一阶滞后滤波中优优低周期性干扰抑制加权递推平均滤波中良良高需快速响应的系统消抖滤波良差差低开关量采集限幅消抖滤波优中差低高可靠性开关量采集5. 实际应用建议复合使用对于复杂噪声环境可组合使用多种滤波算法参数调整所有算法参数需根据实际信号特性调整资源考量在资源受限的MCU上慎用高内存占用的算法实时性平衡根据系统响应要求选择合适的算法复杂度动态调整可考虑根据信号变化率动态调整滤波参数