下面直接看C代码的实现
#define A 200
#define N 20
//返回两个整数差
unsigned int num_sub( unsigned int a, unsigned int b )
{
return ( a >= b ? ( a - b ) : ( b - a ) );
}
unsigned int filter10( void )
{
unsigned int count = 0;
unsigned int new_value = 0;
static unsigned int last_value = 0;
new_value = ReadVol_CH2();
if( num_sub( new_value, last_value ) < A )
{
new_value = new_value;
}
else
{
new_value = last_value;
}
while( new_value != last_value)
{
count++;
if( count >= N )
{
last_value = new_value;
return new_value;
}
new_value = ReadVol_CH2();
if( num_sub( new_value, last_value ) < A )
{
new_value = new_value;
}
else
{
new_value = last_value;
}
}
return last_value;
}
void main( void )
{
while( 1 )
{
val = ReadVol_CH2(); //读取AD采样值
val1 = filter10();
printf( "A%d\r\n", val );
printf( "B%d\r\n", val1 );
}
}
主函数中实时采样AD端口的波形值,然后将采样值经过限幅消抖滤波法进行滤波,然后用串口输出原始采样值和滤波后的值,并在串口波形软件上显示采样的数据波形。
图中蓝色曲线为原始数据曲线,橙色曲线为经过滤波算法后的曲线。
限幅消抖滤波法继承了“限幅”和“消抖”的优点,改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统。