常用数字滤波算法代码

限幅滤波

程序中进行数据选择限幅

/*限幅滤波算法*/
#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;
}

这些算法是基本滤波使用,不限于单独使用,可以混合使用。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值