滤波算法(二)—— 中位值滤波算法

1、算法介绍

        中位值滤波算法的实现方法是采集N个周期的数据,去掉N个周期数据中的最大值和最小值,取剩下的数据的平均值。中位值滤波算法特别适用于会偶然出现异常值的系统。中位值滤波算法应用比较广泛,比如用于一些比赛的评分,经常是去掉一个最高分去掉一个最低分,将其他评分取平均值作为选手的最终得分。

优点:相比于平均值滤波算法,中位值滤波算法能够有效滤除偶然的脉冲干扰。

缺点:与平均值滤波算法相同,中位值滤波算法也存在反应速度慢、滞后的问题。

2、实现代码

        下面的代码是中位值滤波的示例代码。

float data[10];

float middleFilter(float in_data)
{
	float sum = 0;
	float temp[10];
	float change;
	int i,j;
	//记录数据
	for(i=0; i<9; i++)
	{
		data[i]=data[i+1];
	}
	data[9] = in_data;
	//复制数据
	for(i=0; i<10; i++)
		temp[i] = data[i];
	//冒泡法排序
	for(i=1; i<10; i++)
		for(j=0; j<10-i; j++)
		{
			if(temp[i] > temp[i+1])
			{
				change = temp[i];
				temp[i] = temp[i+1];
				temp[i+1] = change;
			}
		}
	//求和
	for(i=1; i<9; i++)
		sum = sum + temp[i];
	//返回平均值
	return(sum/8);

}

        在上面的代码中,分为几个步骤:

步骤1:读取新数据,并更新数据数组;

步骤2:复制数据到临时数组,以便保持原始数据的顺序不变;

步骤3:对临时数组进行排序;

步骤4:计算中位平均值。

3、示例

        下面我们通过一个示例来体会中位值滤波的作用,滤波对象为车速信号,滤波效果如下图所示。图中,横轴为时间,单位:秒,纵轴为速度,单位km/h。其中,蓝色为滤波前的数据,红色为滤波后的数据。有图中可以看出,原始数据存在两个异常值,可能是采集过程的数据干扰或数据处理时的异常等原因造成的。采用中位值滤波算法可以有效滤波这种异常值造成的影响。

相对于中位值滤波算法,平均值滤波算法则无法解决这个问题,如下图所示,为采用平均值滤波算法对相同的原始数据进行处理的效果,可以看到平均值滤波无法滤波异常值,而且异常值影响的时间比较长。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章