在AD收集中常常要用到数字滤波,而不同情况下又有不同的滤波需求,下面是10种经典的软件滤波办法的程序和优缺陷剖析:
1、限幅滤波法(又称程序判别滤波法)
2、中位值滤波法
3、算术均匀滤波法
4、递推均匀滤波法(又称滑动均匀滤波法)
5、中位值均匀滤波法(又称防脉冲搅扰均匀滤波法)
6、限幅均匀滤波法
7、一阶滞后滤波法
8、加权递推均匀滤波法
9、消抖滤波法
10、限幅消抖滤波法
1、限副滤波
A、办法:依据经历判别,确认两次采样答应的最大偏差值(设为A),每次检测到新值时判别:
假如本次值与前次值之差<=A,则本次值有用
假如本次值与前次值之差>A,则本次值无效,抛弃本次值,用前次值替代本次值
B、长处:能有用战胜因偶尔要素引起的脉冲搅扰
C、缺陷:无法按捺那种周期性的搅扰,滑润度差
程序:
/* A值可依据实践情况调整,value为有用值,new_value为当时采样值,滤波程序回来有用的实践值 */
#define A 10
char value;
char filter()
{
char new_value;
new_value = get_ad();
if ( ( new_value – value > A ) || ( value – new_value > A )
return value;
return new_value;
}
2、中位值滤波法
A、办法:接连采样N次(N取奇数),把N次采样值按巨细摆放 ,取中心值为本次有用值
B、长处:能有用战胜因偶尔要素引起的动摇搅扰,对温度、液位的改变缓慢的被测参数有杰出的滤波作用
C、缺陷:对流量、速度等快速改变的参数不宜
程序:
/* N值可依据实践情况调整
排序选用冒泡法*/#define N 11
char filter()
{
char value_buf[N];
char count,i,j,temp;
for ( count=0;count{
value_buf[count] = get_ad();
delay();
}
for (j=0;j{
for (i=0;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、算术均匀滤波法
A、办法:接连取N个采样值进行算术均匀运算
N值较大时:信号滑润度较高,但灵敏度较低
N值较小时:信号滑润度较低,但灵敏度较高
N值的选取:一般流量,N=12;压力:N=4
B、长处:适用于对一般具有随机搅扰的信号进行滤波
这样信号的特点是有一个均匀值,信号在某一数值规模邻近上下动摇
C、缺陷:关于丈量速度较慢或要求数据计算速度较快的实时操控不适用比较糟蹋RAM
程序:
#define N 12
char filter()
{
int sum = 0;
for ( count=0;count{
sum + = get_ad();
delay();
}
return (char)(sum/N);
}