欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习:通用软件滤波算法-递推平均滤波法

程序员文章站 2022-04-14 21:06:06
...

一、处理思想

回顾一下算术平均滤波法的处理思想:采集N组数据求算术平均值作为单次数据的有效值。

假设N为10,采集某组数据时,若第2次采集时环境已发生较大变化,而我们需要再采集8次数据,才能将数据变化反映到有效值上。可以看出改算法的实时性较差。

而当N取不同值时,大致有一下规律:  N↑     实时性↓      滤波平滑度↑

为了解决实时性问题,有一种改进算法:递推平均滤波法

处理思想是:设置一个长度为N的队列,将采集到的数据放到队尾,同时丢弃队首数据;以保证队列中的N个数据都为最新数据。再将队列中的N个数据求算术平均值,作为有效值。

若在某次采集中数据发送较大变化也可实时反映到有效值上。

二、C实现

队列是种特殊的线性表,实现的方法也有很多:例如数组、单链表、循环链表等

本文使用数组实现(设数组长度为N,队首为Quece[N-1],队尾为Quece[0])

其实现原理也很简单:每当有数据进队列时,将所有数组元素右移,丢弃队首数据,再把新数据插入到队尾即可。

学习:通用软件滤波算法-递推平均滤波法

#define TARGET_tYPE int
 
#define N 8
 
//队列
TARGET_tYPE value_buf[N];
 
//初始化队列
void Init_Queue()
{
	for(int i = 0; i < N; i++)
	{
		value_buf[i] = 0;
	}
}
 
//插入队列
void Add_Queue(TARGET_tYPE value)
{
	//数组元素右移
	for(int i = N-1; i > 0; i--)
	{
		value_buf[i] = value_buf[i-1];
	}
	//插入新元素
	value_buf[0] = value;
}
 
//求队列和
TARGET_tYPE Sum_Queue()
{
	TARGET_tYPE ADDER = 0;
	for(int i = 0; i < N; i++)
	{
		ADDER = ADDER + value_buf[i];
	}
	return ADDER;
}
 
TARGET_tYPE Smoothing_arithmetic_mean_FILTER()
{
	//采集数据插入队列
	Add_Queue(get_data());
	
	return Sum_Queue()/N;
}

 

三、滤波效果

学习:通用软件滤波算法-递推平均滤波法

图1. 温度传感器滤波效果

学习:通用软件滤波算法-递推平均滤波法

图2. 水位传感器滤波效果

四、优缺点

优点

平滑度高,对周期性干扰有良好的抑制作用;实时性较好,非常适用于高频振荡的系统(图2);

缺点

灵敏度低,对偶然出现的脉冲干扰抑制性差