限幅滤波法就是通过软件来限制本次采样值的上次采样值的偏差,若本次采样值和上次采样值的偏差超过了设定的最大偏差值,则丢弃本次的采样值。
下面看C代码的实现
//返回两个整数差
unsigned int num_sub( unsigned int a, unsigned int b )
{
return ( a >= b ? ( a - b ) : ( b - a ) );
}
#define A 200 //允许最大误差值
unsigned int filter1( void )
{
static unsigned int value;
unsigned int new_value;
new_value = ReadVol_CH2();
if( num_sub( new_value, value ) > A )
{
return value;
}
value = new_value;
return new_value;
}
A为连续两次采样的最大误差值,若两次采样值的差超过了允许最大误差,则丢弃本次采样值。若误差小于允许最小误差,则认为本次采样值有效。
void main( void )
{
while( 1 )
{
val = ReadVol_CH2(); //读取AD采样值
val1 = filter1();
printf( "A%d\r\n", val );
printf( "B%d\r\n", val1 );
}
}
主程序中循环读取AD口的采样值,并将采样值通过限幅滤波算法进行滤波,通过串口分别打印原始采样值和滤波后的值,并通过串口将数据打印来,并在串口波形软件上显示。
蓝色曲线为采样的原始数据波形图,橙色曲线为经过限幅滤波算法滤波后的波形图。通过两组曲线可以看出,经过限幅滤波算法后,将原始曲线中的尖峰数据滤除掉了,使得采样数据更加平滑。
限幅滤波法可以滤除偶然因素引起的脉冲干扰,但是要求对系统的采样数据范围要有准确的判断,否则如果允许误差值设置不合理,可能会将系统中正常的数据滤掉。