在日常的项目设计中,经常要用到一些算法程序,假设对AD的取样函数为get_ad( )
5种滤波方法(很实用)
1、限幅滤波
/*A值可以根据实际情况调整
#define A 10 //设置两次采样的最大偏差值
char value; //上次采样的有效数据变量
char fifter( )
{
char new_value ; //本次采样的值变量
new_value=get_ad( ); //读如本次采样数据
if((new_value-value)>A||(value-new_value)>A) //比较是否超出最大偏差
return value; //如果超出,返回上次的有效值做为本次的有效值
else
return new_vlaue; //没有超出,返回本次采样值作为本次的有效值
}
2 中位值滤波方法
/* N值可以根据实际情况调整
#define N 11 //设置连续采样的次数
char fifter( )
{
char value_buf[N]; //连续采样N次值缓冲寄存器
char count i , j, temp; //i ,j是水泡下标量,count为采样数据读入的下标量
for(count=0;count<N;count++)
{
value_buf[count]=get_ad( );
delay();
for(j=0;j<N;j++) //水泡排序
{
for(i=0;i<N-j;i++)
{
if(value_buf>value_buf[i+1])
{
temp="value"_buf;
value_buf=valu_buf[i+1];
value_buf[i+1]=temp;
}
3 算术平均值方法
/*N (-----------)呵呵
#define N 13
void fifter( )
{
int sum="0"; //求和变量,用于采样的累加值
char count;
for(count=0;count<N;count++)
{
sum+=get_ad( );
}
return(char)(sum/N);
}
4 消抖滤波方法
#define N 13 //设置计数器益出值
char fifter( )
{
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 new_value
}
5//限幅消抖滤波方法
/*A值可以根据实际情况调整,value为上次采样有效值,new_value为当前采样值
/*N 设置计算器益处值
char value; //有效值变亮
char fifter( )
{
char count="0"; //计数变量
char new_value; //本次采样值
new_value=get_ad; //导入本次采样值
if((value-new_value)>N)||(new_value-value))
{
new_value=value;
while(value!=new_value)
{
count++; //
if(count>=N) return new_value;
delay( )
return value;
}
return value;
}
//以上为经常用到的算法
用户374544 2009-7-3 17:59