ADC滤波 - 限幅平均滤波算法实现

一、总体思路介绍:

        限幅平均滤波算法由   限幅滤波算法  +   递推平均滤波算法组合而成,同时具备限幅滤波和递推平均滤波算法两种优势,能够对输入波形进行限幅+递推平均滤波运算,抗干扰能力强。

二、限幅滤波算法介绍:

        对于连续两次采集到的数据来说:

        1、如果第一次的采集数据与第二次的数据差值大于最大偏差值:则认定第二次采集的数据有误,不予记录,并默认第一次采集的数据是第二次的数据。

        2、如果第一次采集数据与第二次的数据差值小于最大偏差值:则认定第二次采集的数据有效,对第二次采集的数据进行保存。

三、递推平均滤波算法介绍:

        对于采集到的数据来说:将所有采集到的数据存放到一个数组(这里是容量为20的数组),将采集到的20个数据进行平均运算,输出平均值。如果有新的数据产生,则将最新的数据替换掉最旧的数据,是先进先出的一个思路,以此保证数据更新的实时性。

四、限幅平均滤波算法介绍:

        先对采集到的数据进行一个限幅滤波处理,将处理结果作为输入数据给到递推平均滤波处理,滤波后的结果就是限幅平均滤波算法的结果。

五、代码实现:

1、限幅滤波

//限幅滤波
struct clipping_filter
{
	unsigned char in_data;//输入的数据
	unsigned char old_data;//上一次的数据
	unsigned char max_deifference_value;//差值
	unsigned char out_data;//生效的数据
};

//限幅滤波运算
unsigned char clipping_filter_run(struct clipping_filter *object)
{
	if(((object -> in_data - object -> old_data) > object -> max_deifference_value) || ((object -> old_data - object -> in_data) > object -> max_deifference_value))
	{
		object -> out_data = object -> old_data;//让旧值生效
	}
	else
	{
		object -> old_data = object -> in_data;//新值变旧值
		object -> out_data = object -> in_data;//让新值生效
	}
	return(object -> out_data);
}

2、递推平均滤波

//递推平均滤波结构体
struct recursive_average
{
	unsigned char in_data;//输入的数据
	unsigned char data_num;//替换哪一位的数据
	unsigned char data[20];//存放数据,最多放20个
	unsigned int sum;//总和
	unsigned char out_value;//平均值
};

//递推平均滤波运算
unsigned char recursive_average_run(struct recursive_average *object)
{
	object -> data[object -> data_num] = object -> in_data;//将新值覆盖掉数组中的一个数据
	
	if(object -> data_num >= 0 && object -> data_num < 19) object -> data_num++;
	else                                                   object -> data_num = 0;
	
	//计算平均值
	object -> sum = 0;//清空总和
	for(unsigned char loop = 0; loop < 20; loop++)
	{
		object -> sum += object -> data[loop];//计算总和
	}
	object -> out_value = (object -> sum / 20);//取平均值
	
	return (object -> out_value);
}

3、限幅平均滤波

//限幅平均滤波算法  :  限幅 + 递推平均滤波算法
struct limiting_average
{
	unsigned char in_data;//输入的数据
	unsigned char max_deifference_value;//限幅差值
	unsigned char out_data;//输出的数据
	struct clipping_filter cliaverage;//限幅结构体
	struct recursive_average average;//递推平均结构体
};

//限幅平均滤波运算
unsigned char limiting_average_run(struct limiting_average *object)
{
	object -> cliaverage.max_deifference_value = object -> max_deifference_value;//将限幅最大值给到限幅结构体
	object -> cliaverage.in_data = object -> in_data;//将数据读入限幅结构体
	object -> average.in_data = clipping_filter_run(&(object -> cliaverage));//启动限幅运算,将运算结果给到递推平均滤波函数
	object -> out_data = recursive_average_run(&(object -> average));//读出结果
	return(object -> out_data);
}

六、使用示范:

        

int main()
{
    unsigned char num = 0;//采集到的数据
    unsigned char adc_value;//运算结果
    struct limiting_average adc;//定义一个运算对象
    adc.max_deifference_value = 30;//限幅30
    
    while(1)
    {
        adc.in_data = ++num;//输入读取到的数据
	    adc_value = limiting_average_run(&adc);//读出运算结果
    }
}

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值