限幅滤波
程序中进行数据选择限幅
/*限幅滤波算法*/
#define Limit_A 50
char data; //上次数据
char filter1(void)
{
char datanew;
datanew = getdata(); //当前数据
if((datanew - data)>Limit_A || data - datanew)>Limit_A) return data;
else return datanew;
}
中值滤波
获取一系列数据取中间值
/*中值滤波算法*/
#define Num_Of_Filter 11
char filter2()
{
char value_buf[Num_Of_Filter];
char count,i,j,temp;
//获取数据
for(count = 0;count<Num_Of_Filter;count++)
{
value_buf[count] = get_data();
//delay
}
//插补排序
for(j=0;j<(Num_Of_Filter-1);j++)
{
for(i=0;i<j;i++)
{
if(value_buf[j]<value_buf[j+1])
{
temp = value_buf[j];
value_buf[j] = value_buf[j+1];
value_buf[j+1] = temp;
}
}
}
//获取中值
return value_buf[(Num_Of_Filter-1)/2];
}
算术平均
取一系列数据的平均值作为输出
/*算术平均算法*/
#define Num_Of_Average 20
char filter3()
{
int sum = 0;
for(count = 0;count<Num_Of_Average;count++)
{
sum += get_data();
//delay
}
return (char)(sum/Num_Of_Average);
}
加权平均
对采样数据乘权重,最后除以总权
#define Num_Of_Weighting 10 //加权数个数
char codeWgt[Num_Of_Weighting] = {1,2,3,4,5,5,4,3,2,1};
#define Sum_Of_Wgt (1+2+3+4+5+5+4+3+2+1) //总权重
char filter4()
{
int sum=0;
char i;
for(i=0;i<Num_Of_Weighting;i++)
{
sum = get_data() * codeWgt[i]; //每一项分权
}
return (char)(sum/Sum_Of_Wgt); //加权和平均
}
滑动平均
丢失最旧数据,加入最新数据,进行算数平均
#define Num_Of_SlideAve 10 //个数
char SlideAve_Buf[Num_Of_SlideAve];
char filter5()
{
static char current_Num = 0;
char count = 0;
int sum = 0;
SlideAve_Buf[current_Num++] = get_data();
if(current_Num == Num_Of_SlideAve)
current_Num = 0;
for(;count<Num_Of_SlideAve;count++)
{
sum+=SlideAve_Buf[count];
}
return (char)(sum/Num_Of_SlideAve);
}
低通滤波
分配给上次数据(上次低通滤波输出)更大的权重,对此次数据采取部分权重,修正当前数据。抑制了数据的剧烈变换,只取少量当前数据的权。
/*低通滤波*/
float a = 0.05;
//Yn=a* Xn+(1-a) *Yn-1
char filter6()
{
static char last_val = 0;
char current_val,finOut;
current_val = get_data();
finOut = a * current_val + (1-a) * last_val;
last_val = finOut;
return finOut;
}
这些算法是基本滤波使用,不限于单独使用,可以混合使用。