AD采集中的10种经典软件滤波程序优缺点分析(附程序)
++)
{
value_buf[count] = get_ad();
delay();
}
for (j=0;j《N-1;j++)
{
for (i=0;i《N-j-1;i++)
{
if ( value_buf》value_buf[i+1] )
{
temp = value_buf;
value_buf = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
for(count=1;count《N-1;count++)
sum +=value[count];
return(char)(sum/(N-2));
}
6、限幅平均滤波法
A、方法:
相当于"限幅滤波法"+"递推平均滤波法"
每次采样到的新数据先进行限幅处理,
再送入队列进行递推平均滤波处理
B、优点:
融合了两种滤波法的优点 对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
C、缺点:
比较浪费RAM
程序略 参考子程序1、3
7、一阶滞后滤波法
A、方法:
取a=0~1
本次滤波结果=(1-a)*本次采样值+a*上次滤波结果
B、优点:
对周期性干扰具有良好的抑制作用 适用于波动频率较高的场合
C、缺点:
相位滞后,灵敏度低 滞后程度取决于a值大小 不能消除滤波频率高于采样频率的1/2的干扰信号
程序:
/* 为加快程序处理速度假定基数为100,a=0~100 */
#define a 50
char value;
char filter()
{
char new_value;
new_value = get_ad();
return ((100-a)*value + a*new_value);
}
8、加权递推平均滤波法
A、方法:
是对递推平均滤波法的改进,即不同时刻的数据加以不同的权
通常是,越接近现时刻的数据,权取得越大。
给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低
B、优点:
适用于有较大纯滞后时间常数的对象和采样周期较短的系统
C、缺点:
对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号 不能迅速反应系统当前所受干扰的严重程度,滤波效果差
程序:
/* coe数组为加权系数表,存在程序存储区。*/
#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();
delay();
}
for (count=0,count《N;count++)
sum += value_buf[count]*coe[count];
return (char)(sum/sum_coe);
}
9、消抖滤波法
A、方法:
设置一个滤波计数器
将每次采样值与当前有效值比较:
如果采样值=当前有效值,则计数器清零
如果采样值《》当前有效值,则计数器+1,并判断计数器是否》=上限N(溢出)
如果计数器溢出,则将本次值替换当前有效值,并清计数器
B、优点:
对于变化缓慢的被测参数有较好的滤波效果,
可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动
C、缺点:
对于快速变化的参数不宜
如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统
程序:
#define N 12
char filter()
{
char count=0;
char new_value;
new_value =get_ad();
while (value!=new_value)
{
count++;
if (count》=N)return new_value;
delay();
new_value =get_ad();
}
return value;
}
10、限幅消抖滤波法
A、方法:
相当于"限幅滤波法"+"消抖滤波法"
先限幅,后消抖
B、优点:
继承了"限幅"和"消抖"的优点
改进了"消抖滤波法"中的某些缺陷,避免将干扰值导入系统
C、缺点:
对于快速变化的参数不宜
程序略 参考子程序1、9
- 12位串行A/D转换器MAX187的应用(10-06)
- AGC中频放大器设计(下)(10-07)
- 低功耗、3V工作电压、精度0.05% 的A/D变换器(10-09)
- PIC16C5X单片机睡眠状态的键唤醒方法(11-16)
- 用简化方法对高可用性系统中的电源进行数字化管理(10-02)
- 利用GM6801实现智能快速充电器设计(11-20)