一:限幅濾波
- 思路 先根據經驗判斷,確定兩次採樣允許的最大誤差(設爲A)每次檢測到新採樣數據值時進行判斷:如果本次新採樣數值與上次採樣的數據值差<=A,
則本次採樣值有效,令本次採樣結果=新採樣值;如果本次採樣的值和上次採樣的結果差是>A則認爲本次採樣值無效,放棄本次採樣的值,濾波結果=上次採樣值。 - 優點 能有效克服因偶然因素引起的脈衝干擾。
- 缺點 無法抑制那種週期性干擾,且平滑性差。
- 例程
/***************************************************
函數名稱:AmlitudeLimiterFilter()――限幅濾波法(程序判斷濾波法)
*說明:
1調用函數
GetAD(),該函數用來取得當前採樣值
2變量說明
Value: 最近一次採樣的值,該變量爲全局變量
NewValue: 當前採樣的值
ReturnValue: 返回值
3常量說明
A:兩次採樣的最大誤差值,該值需要使用者根據實際情況設置
*入口: Value, 上次有效的採樣值,在主程序裏賦值
*出口:ReturnValue,返回值,本次濾波的值
***************************************************/
#define A 10
unsigned char Value;
unsigned char AmplitudeLimiterFilter()
{
unsigned char NewValue;
unsigned char ReturnValue;
NewValue = GetAD();
if( ( (NewValue-Value)>A ) || ( (Value-NewValue)>A ) )
ReturnValue = Value;
else ReturnValue = NewValue;
return (ReturnValue);
}
二:中位值濾波
- 思路 連續採樣N次,把N次採樣值按大小排列,取中間值爲本次有效值。
- 優點:能有效克服因偶然因素引起的波動干擾,對溫度、液位等緩慢變化的被測量參數良好的濾波效果。
- 缺點:對流量、速度等快速變化的參數不宜。
- 例子:
/********************************************************
*函數名稱:MiddleValueFilter()――中位值濾波法
*說明 :
1 調用函數
GetAD(), 該函數用來獲得當前的採樣值
Delay(), 基本延時函數
2變量說明
ArrDataBuffer[N], 用來存放一次性採樣的N組數據
Temp, 完成冒泡法使用的臨時寄存器
I,j,k,循環使用的參數值
3常量說明
N ,數組的長度
*入口:
*出口:ArrDataBuffer[(N-1)/2],返回值,本次濾波的結果
********************************************************/
unsigned char MiddleValueFilter()
{
unsigned char i,j,k;
unsigned char Temp;
unsigned char ArrDataBuffer[N];
for(i=0; i<N; i++)
{
ArrDataBuffer[i] = GetAD();
Delay();
}
for(j=0; j<N-1; j++)
{
for(k=0; k<N-j; k++)
{
if(ArrDataBuffer[k] > ArrDataBuffer[k+1] )
{
Temp = ArrDataBuffer[k];
ArrDataBuffer[k] = ArrDataBuffer[k+1];
ArrDataBuffer[k+1] = temp;
}
}
}
return (ArrDataBuffer[ (N-1)/2 ]) ;
}
三:算術平均濾波法
- 思路 連續取N個採樣值進行算術平均運算(N較大時平滑性好但是靈敏度差,反之,則相反。)
- 優點:對一般隨機的干擾的信號進行濾波,這種信號的特點是一個平均值,信號一般在一個範圍內波動。
- 對於測量速度慢或要求數據計算快的實時控制不適用。且比較消耗RAM
- 例程:
/**********************************************************
*函數名稱:ArithmetcalAverageValueFilter() ――算術平均濾波法
*說明
1調用函數
GetAD(), 該函數用來取得當前採樣值
Delay(), 基本延時函數
2變量說明
Value,平均值
Sum,連續採樣之和
i,循環使用的變量
3常量說明
N, 數組的長度
*入口:
*出口:Value,返回值,本次濾波結果
**********************************************************/
#define N 12
unsigned char ArithmeticalAvergeValueFilter()
{
unsigned char i;
unsigned char Value;
unsigned short Sum;
Sum = 0;
for(i=0; i<N; i++)
{
Sum += GetAD();
Delay();
}
Value /= N;
return Value;
}
四:遞推平均濾波法
- 思路: 把連續N個採樣值看成一個隊列,隊列的長度固定爲N。每次採樣到一個新數據放入隊尾,並扔掉原來隊首的一次數據(先進先出原則)。把隊列中N個數據進行平均運算,得到的結果爲本次濾波的結果。(要選擇合適的N)
- 優點 對週期性干擾有良好的抑制作用,平滑度高,適用於高頻振盪的系統。
- 缺點 靈敏度低。對偶然出現的脈衝性干擾作用差;不易消除由脈衝干擾所引起的採樣值偏差,不合適脈衝干擾比較嚴重的場合。消耗RAM大。缺點 靈敏度低。對偶然出現的脈衝性干擾作用差;不易消除由脈衝干擾所引起的採樣值偏差,不合適脈衝干擾比較嚴重的場合。消耗RAM大。
- 例程
/************************************************
*函數名稱 GlideAverageValueFilter() ――遞推平均濾波法
*說明
1調用函數
GetAd(), 該函數用來取得當前採樣值
Delay(), 該函數延時
2變量說明
Data[], 暫存數據的數組屬於全局變量
Value,平均值
Sum,連續採樣之和
i 循環變量
3常量說明
N, 數組的長度
*入口:Data[],暫存數據
*出口:Value, 返回值,本次濾波結果
************************************************/
#define N 12
unsigned char Data[N];
unsigned char GlideAverageValueFilter( Data[0] )
{
unsigned char i;
unsigned char Value;
unsigned short Sum;
Sum = 0;
Data[N-1] = GetAD();
for(i=0; i<N-1; i++)
{
Data[i] = Data[i+1];
Sum += Data[i];
}
Value = Sum / N;
return (Value);
}
五:中位值平均濾波法
- 思路 連續採樣N個採樣值,去掉一個最大和最小值,然後計算N-2個數據的平均值
- 融合了中位值濾波法和平均值濾波法的優點,對於偶然性出現的脈衝干擾,可消除由其引起的採樣偏差。對週期性干擾有良好的抑制作用,平滑度高,適用於高頻振盪場合。
- 缺點和算術平均濾波法一樣,測量速度慢比較浪費RAM.
- 例程:
/**************************************************
*函數名稱 MiddleAverageValueFilter()――中位值平均濾波法
*說明
1函數調用
GetAD(),獲取當前數據函數
Delay(), 基本的延時函數
2變量說明
ArrDataBuffer[N] ,用來存放一次性採樣值的N組數據
Temp, 完成起泡法使用的臨時存放寄存器
i,j,k,循環使用的參數值
Value,平均值
Sum,連續採樣之和
3常量說明
N,數組長度
*入口:
*出口:Value, 返回值,本次濾波結果
**************************************************/
#define N 12
unsigned char MidleAverageValueFilter()
{
unsigned char i,j,k,l;
unsigned char Temp;
unsigned char ArrDataBuffer[N];
unsigned short Sum;
unsigned char Value;
//採樣N組數據,放入ArrDataBuffer[]中
for( i=0; i<N; i++)
{
ArrDataBuffer[i] = GetAD();
Delay();
}
//採樣值由小到大排列,排列採用起泡法
for(j=0; j<N-1; j++)
{
for(k=0; k<N-j; k++)
{
if( ArrDataBuffer[k] > ArrDataBuff[k+1] )
{
Temp = ArrDataBuffer[k];
ArrDataBuffer[k] = ArrDataBuffer[k+1];
ArrDataBuffer[k] = Temp;
}
}
}
//去掉最小和最大值,並求和
for(l=1; l<N-1; l++) {
Sum += ArrDataBuffer[l];
}
Value = Sum/(n-2);
return (Value);
}
六:遞推中位值平均濾波法
- 思路: 中位值濾波法+遞推平均濾波法
把連續N 個採樣值看成一個隊列,把長度固定爲N每次新採樣值放在隊尾並把原隊首的數據扔掉。把隊列中N個數據的最大和最小值去掉,然後再計算N-2個數據的平均值。 - 優點: 融合兩種濾波法,對於偶然出現的脈衝干擾可消除由其引起的採樣 值偏差。
- 缺點 : 比較浪費RAM
- 例程
/****************************************************
*函數名稱 filer( char NEW_DATA, char QUEUE[], char n )
*說明
1調用函數
2變量
max ,存放數據中的最大值
min , 存放數據中的最小值
sum, 存放所有采樣值之和
i 循環變量
3常量說明
*入口: NEW_DATA = 新採樣值
QUEUE = 隊列
n = 隊列長度
*出口: sum = 濾波結果
***************************************************/
char filter( char NEW_DATA ,char QUEUE[] , char n ) {
char max;
char min;
int sum;
char i;
QUEUE[0] = NEW_DATA;
max = QUEUE[0];
min = QUEUE[0];
sum = QUEUE[0];
for( i=n-1 ; i!= 0; i--) {
if( QUEUE[i] > max )
max = QUEUE[i];
else if( QUEUE[i] < min )
min = QUEUE[i];
sum += QUEUE[i];
QUEUE[i] = QUEUE [i-1];
}
i = n-2;
sum = sum – max – min + i/2;
//說明 +i/2 是爲了四捨五入
sum = sum/2;
return sum;
}
七:限幅平均濾波法
- 思路 限幅濾波+遞推平均濾波法。每次採樣的數據先進行限幅濾波後,再放入隊列中進行遞推平均濾波處理
- 優點 融合兩種濾波的優點,對於偶然出現的脈衝干擾,可消除由於脈衝干擾引起的採樣偏差。優點 融合兩種濾波的優點,對於偶然出現的脈衝干擾,可消除由於脈衝干擾引起的採樣偏差。
- 缺點 比較消耗RAM
- 例程
/***********************************************
*函數名稱 LimitRangeAverageValueFilter()――限幅平均濾波法
*說明
1調用函數
GetAD(),獲取當前採樣值
Delay(), 基本延時函數
2變量說明
Value,平均值
Sum,隊列採樣值之和
i ,循環變量
3常量說明
N ,數組長度
*入口:Data[] 隊列存放數組
*出口:Value 濾波的平均值
***********************************************/
#define A 10
#define N 12
unsigned char Data[N];
unsigned char LimitRangeAverageValueFilter( Data[] )
{
unsigned char i;
unsigned char Value;
unsigned short Sum;
Data[N] = GetAD();
if( ( (Data[N] – Data[N-1] ) >A ) || ( (Data[N-1] – Data[N] ) >A ) )
Data[N] = Data[N-1];
Sum = Data[N];
for(i=0; i<N-1; i++)
{
Data[i] = Data[i+1];
Sum += Data[i];
}
Value = Sum/N;
return Value;
}
八:一階滯後濾波法
- 思路 本次濾波結果 = a * 本次採樣值 + (1-a)*上次濾波結果
a代表濾波係數,a = 0~1; - 優點 對週期性干擾具有良好的抑制作用,適用於波動頻率較高的場合相對於各類平均濾波的方法來說,一階濾波比較節省RAM空間
- 缺點 相位滯後,靈敏度。滯後程度取決於a值大小。另外,這種方法不能消除濾波頻率高於1/2採樣頻率的干擾信號。
對於沒有乘法的和除法的運算指令單片機來說,運算工作量大 - 例程
/***************************************************
*函數名稱 OneFactorialFilter()――一階滯後濾波法
*說明
1調用函數
GetAd(),該函數用來獲取當前取樣值
Delay(),基本延時函數
2變量說明
Value,上次濾波結果
NewValue,本次採樣值
3常量說明
A 濾波係數
*入口:
*出口:ReturnValue 返回值,本次濾波結果
***************************************************/
#define A 128
unsigned char Value;
unsigned char OneFactorialFilter()
{
unsigned char NewValue;
unsined char ReturnValue;
NewValue = GetAD();
ReturnValue = (255-a)*NewValue + a*Value;
ReturnValue /= 255;
return (ReturnValue);
}
九;消抖濾波法
- 思路:設置一個濾波計數器。將每次採樣值與當前值比較。如果採樣值=當前值,則計數器清0;如果採樣值不等於當前值,則計數器+1。然後判斷計數器是否》=上限N。如果計數器溢出,則將本次值替換當前有效值,並清計數器。
- 優點 對於變化緩慢的被測參數良好的濾波效果。可避免在臨界值附近控制器的反覆開/關跳動或顯示器上數數值抖動
- 缺點 對快速變化不宜。而且,如果在計數器溢出的那一次採樣到的值恰好是干擾值則會將干擾值當作有效值導入系統。
- 例程
/************************************************
*函數名稱 AvoidDitheringFilter()――消抖濾波法
*說明 1調用函數
GetAD(),該函數用來取得當前採樣值
2變量說明
Count,濾波計數器,該變量爲全局變量
Value,當前有效值,該變量爲全局變量
NewValue, 當前採樣值
3常量說明
N 濾波計數器閾值
*入口
*出口:Value ,返回值,本次濾波結果
************************************************/
#define N 20
unsigned char Count;
unsigned char Value;
unsigned char AvoidDitheringFilter()
{
unsigned char NewValue;
NewValue = GetAD();
if( NewValue == Value )
Count = 0;
else
{
Count++;
if(Count>N)
{
Count=0;
Value = NewValue;
}
}
return (Value);
}
還有一個叫加權遞推濾平均濾波法將不再介紹了