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。其中,藍色爲濾波前的數據,紅色爲濾波後的數據。有圖中可以看出,原始數據存在兩個異常值,可能是採集過程的數據干擾或數據處理時的異常等原因造成的。採用中位值濾波算法可以有效濾波這種異常值造成的影響。
相對於中位值濾波算法,平均值濾波算法則無法解決這個問題,如下圖所示,爲採用平均值濾波算法對相同的原始數據進行處理的效果,可以看到平均值濾波無法濾波異常值,而且異常值影響的時間比較長。