限幅平均滤波法相当于“限幅滤波法”+“递推平均滤波法”,每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理。
下面看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 filter6( void ) //采样正弦波 相位有延时
{
static unsigned int value_buf[N];
static unsigned int i = 0;
unsigned int count;
unsigned int new_value = 0;
static unsigned int last_value = 0;
int sum = 0;
new_value = ReadVol_CH2();
if( num_sub( new_value, last_value ) < A )
{
value_buf[i++] = new_value;
last_value = new_value;
}
else
{
value_buf[i++] = last_value;
}
if( i == N )
{
i = 0;
}
for( count = 0; count < N; count++ )
{
sum += value_buf[count];
}
return ( unsigned int )( sum / N );
}
首先通过限幅滤波法对采样的数据进行筛选,对符合要求的数据,循环存储到数组中,最后对数组中的采样值取算数平均值。
void main( void )
{
while( 1 )
{
val = ReadVol_CH2(); //读取AD采样值
val1 = filte6();
printf( "A%d\r\n", val );
printf( "B%d\r\n", val1 );
}
}
主程序中循环读取AD口的采样值,并将采样值通过限幅平均滤波法进行滤波,通过串口分别打印原始采样值和滤波后的值,并通过串口将数据打印来,并在串口波形软件上显示。
蓝色曲线为采样的原始数据波形图,橙色曲线为经过限幅平均滤波法滤波后的波形图。通过两组曲线可以看出,经过滤波算法后,可以有效的滤出系统中出现的脉冲干扰,使得采样数据更加平滑。
限幅平均滤波法融合了限幅滤波法和递推平均滤波法的两种滤波算法的优点 ,使采样结果更加准确,但是计算速度会变慢,也需要一定的空间来存储数据。