限幅濾波法
1.方法限幅濾波法又稱嵌位濾波法,或程序判斷濾波法。這種濾波法的思路是:
先根據經驗判斷,確定兩次採樣允許的最大偏差值(設爲A)每次檢測到新採樣值時進行判斷:
(1)如果本次新採樣值與上次濾波結果之差<A,則本次採樣值有效,令本次濾波結果=新採樣值;
(2)如果本次採樣值與上次濾波結果之差>A,則本次採樣值無效,放棄本次值,令本次濾波結果=上次濾波結果。
2,優點
能有效克服因偶然因素引起的脈衝干擾。
3,缺點
無法抑制那種週期性的干擾,且平滑度差
4,例程
*******函數名稱: AmplitudeL.imiterFilter()-限幅濾波法(又稱程序判斷濾波法)*
說明:
1,調用函數
GetAD(),該函數用來取得當前來樣值
2.變量說明
value:最近一次有效採樣的值,該變量爲全局變量
NewValue:當前採樣的值
ReturnValue:返回值
3,常量說明
A:兩次採樣的最大誤差值,該值需要使用者根據實際情況設置
*入口: Value,上一次有效的採樣值,在主程序裏賦值
*出口: ReturnValue,返回值,本次濾波結果
#define A 10
unsigned char Value;
unsigned char AmplitudelimiterFilter()
{
unsiqned char NewValue;
unsigned char ReturnValue;
NewValue - GetAD();
if(((NewValue- Value) >A)) | | ((Value -NewValue)>A)))
ReturnValue = Value;
else
ReturnValue = NewValue;return(ReturnValue) ;
}
中位值濾波法
1,方法
連續採樣N次(N取奇數),把N次採樣值按大小排列,取中間值爲本次有效值。可見,中位值濾波法體現了“中庸”的哲學思想精髓。
2.優點
能有效克服因偶然因素引起的波動干擾;對溫度、液位等變化緩慢的被測參數有良好的濾波效果。
3.缺點
對流量、速度等快速變化的參數不宜。
4.例程
*******函數名稱: 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];//一次採集N組數據,放入ArrDataBuffer[]中
for (i=0;<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]); //取中間值
}
}
算術平均濾波法
1.方法
連續取N個採樣值進行算術平均運算。N值較大時,信號平滑度較高,但靈敏度較低;N值較小時,信號平滑度較低,但靈敏度較高。N值的選取:對於一般流量,N=12;對於壓力,N=4.
2.優點
適用於對一般具有隨機干擾的信號進行濾波。這種信號的特點是有一個平均值,信號在某一數值範圍附近上下波動。
3,缺點
對於測量速度較慢或要求數據計算速度較快的實時控制不適用。由於需要開設隊列存儲歷次採樣數據,因此比較消耗RAM
4,例程
***********函數名稱: ArithmeticalAveragevalueFilter()-算術平均濾波法*
說明:
1、調用函數
GetAD(),該函數用來取得當前採樣值
Delay(),基本延時函數
2、變量說明
Value,平均值
Sum,連續採樣之和
i,循環使用的參數值
3、常量說明
N,數組長度
*人口:
*出口: Value,返回值,本次濾波結果********/
#define N 12
unsigned char ArithmeticalAverageValueF ilter()
{
unsigned char i;
unsigned char Value;
unsigned short Sum=0;
for(i=0;i<N;i++)
{
Sum += GetAD();
Delay();
}
value = Sum/N;
return(Value);
}
遞推平均濾波法
1,方法
遞推平均濾波法又稱滑動平均濾波法。把連續N個採樣值看成一個隊列,隊列的長度固定爲N,每次採樣到一個新數據放入隊尾,並扔掉原來隊首的一次數據(先進先出原則)。把隊列中的N個數據進行平均運算,即可獲得新的濾波結果。N值的選取:流量,N=12;壓力: N-4;液麪,N-4~12;溫度,N=1~4.
2·優點
對週期性干擾有良好的抑制作用,平滑度高;適用於高頻振盪的系統。
3.缺點
靈敏度低。對偶然出現的脈衝性干擾的抑制作用較差;不易消除由脈衝干擾所引起的採樣值偏差;不適用於脈衝干擾比較嚴重的場合。由於需要開設隊列存儲歷次採樣數據,因此比較消耗RAM.
4,例程
****函數名稱: GlideAverageValueFilter()-遞推(滑動)平均濾波法****
說明:
1、調用函數
GetAD(),該函數用來取得當前採樣值
Delay(),基本延時函數
2、變量說明
Data[],暫存數據的數組屬於全局變量
Value,平均值
sum,連續採樣之和
i,循環使用的參數值
3、常量說明
N,數組長度
*人口:
*出口: value,返回值,本次濾波結果
define N 12
unsigned char Data[];
unsigned char GlideAverageValueFilter(Data[])
{
unsigned char i;
unsigned char Value;
unsigned short Sum=0;
Data[N] =GetAD();//採集數據放到數組最高位
for(i=0;i<N;i++)
{
Data[i]= Data[i+ 1]; //所有數據左移,低位扔掉
Sum += Data[i];//求和
}
Value = Sum/N;
return(Value);//求平均
}
中位值平均濾波法
1.方法
中位值平均濾波法又稱防脈衝干擾平均濾波法。相當於“中位值濾波法”+“算術平均濾波法”。具體方法是連續採樣N個數據,去掉一個最大值和一個最小值;然後計算N-2個數據的平均值。N值的選取: 3~14.其實,中位值濾波法在生活中也可以見到。比如在許多比賽中,統計評委的打分時,往往就是採用這種方法。我們經常在電視裏聽到主持人說: “去掉一個最高分,去掉一個最低分,某某選手平均得分xxx分
2,優點
融合了兩種濾波法的優點。對於偶然出現的脈衝性干擾,可消除由其引起的採樣值偏差。對週期性干擾有良好的抑制作用,平滑度高,適用於高頻振盪的系統。
3.缺點
和算術平均濾波法一樣,測量速度較慢,比較浪費RAM
4.例程
****函數名稱: MiddleAverageValueFilter()-中位值平均濾波法*
說明:
1、調用函數
GetAD(),該函數用來取得當前採樣值
Delay(),基本延時函數
2、變量說明
ArrDataBuffer[N],用來存放一次性採集的N組數據
Temp,完成起泡法使用的臨時寄存器
i, j,k,循環使用的參數值
value,平均值
Sum,連續採樣之和
3、常量說明
N,數組長度
*入口:
*出口: Value,返回值,本次濾波結果******
# define N 12
unsigned char MiddleAverageValueF ilter()
{
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]>ArrDataBuffer[k+ 1])
{
Temp= ArrDataBuffer[k];
ArrDataBuffer[k] = ArrDataBuffer[k+ 1];
ArrDataBuffer[k + 1] =Temp;
}
}
}
for(l=1;l<N-1;l++)
Sum +=ArrDataBuffer[l];
value = Sum/(N-2);
return(Value);
}
遞推中位值平均濾波法
1.方法
遞推中位值平均濾波法,相當於“中位值濾波法”+“遞推平均濾波法”。這種方法是,把連續N個採樣值看成一個隊列,隊列的長度固定爲N。每次採樣到一個新數據放入隊尾,並扔掉原來隊首的一次數據(先進先出原則)。把隊列中的N個數據先去掉一個最大值和一個最小值,然後計算N-2個數據的平均值。遞推中位值平均濾波法是一種比較實用的濾波方法。其濾波效果參見圖遞推中位值平均濾波效果圖。我們對照一下前面介紹的遞推平均濾波法(參見圖遞推平均濾波效果圖),就會發現二者的不同。顯然,在消除了最大值和最小值之後,再取平均值,得到的濾波結果更趨於平滑、可信。
2.優點
融合了兩種濾波法的優點。對於偶然出現的脈衝性干擾,可消除由其引起的採樣值偏差。
3,缺點
由於需要開設隊列存儲歷次採樣數據,因此比較消耗RAM.
4,例程
//單字節遞推中位值平均濾波
//功能:1.將新採樣值壓人隊列
// 2.將隊列中數據減去最大值和最小值,然後求平均值(小數四舍五人)
//入口: NEW_DATA = 新採樣值
// QUEUE = 隊列
// n = 隊列長度
//出口:=濾波結果(平均值)
char filterl(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 = sum + QUEUE[i]; //追加到和值
QUEUE[i]=QUEUE[i-1]; //隊列更新
}
i=n-2;
sum =sum-max-min + i/2;
sum =sum/i; //平均值=(和值-最大值-最小值+n/2)/(隊列長度-2)
//說明:+(n-2)/2的目的是爲了四舍五人
return ((char) sum);
}
限幅平均濾波法
1.方 法
相當於“限幅濾波法”+“遞推平均濾波法”。每次採樣到的新數據先進行限幅處理,再送入隊列進行遞推平均濾波處理。
2.優點
融合了兩種濾波法的優點。對於偶然出現的脈衝性干擾,可消除由於脈衝干擾所引起的採樣值偏差。
3,缺點
由於需要開設隊列存儲歷次採樣數據,因此比較消耗RAM.
4.例程
*****函數名稱: LimitRangeAveragevalueFilter()-限幅平均濾波法*****
說明:
1、調用函數GetAD(),該函數用來取得當前採樣值
Delay(),基本延時函數
2、變量說明Data[],暫存數據的數組屬於全局變量
value,平均值
Sum,連續採樣之和
i,循環使用的參數值
3、常量說明
N,數組長度
A:兩次採樣的最大誤差值,該值需要使用者根據實際情況設置
人口:
出口: Value,返回值,本次濾波結果
# define A 10
#define N 12
unsigned char Data[];
unsigned char LimitRangeAverageValueFilter(Data[])
{
unsigned char i ;
unsigned char Value;
unsigned short Sum Data[N]= GetAD();
if(((Data[N]-Data[N-1]) >A)||(Data[-1]-Data[N)>A))
Data[N] = Data[N-1];
else
Data[N] =NewWalue;
for(i=0;i <N;i++)
{
Data[i] = Data[i+ 1];//所有數據左移,低位扔掉
Sum += Data[i];//求和
}
Value= Sum/N;//求平均
return(Value);
}
一階滯後濾波法
1·方法
本次濾波結果=a×本次採樣值+(1-a)×上次濾波結果。a代表濾波係數,a=0~1.一階濾波法也是一種比較實用的濾波方法。
2.優點
對週期性干擾具有良好的抑制作用,適用於波動頻率較高的場合。相對於各類平均濾波的方法來說,一階濾波法比較節省RAM空間
3.缺點
相位滯後,靈敏度低。滯後程度取決於a值大小。另外,這種方法不能消除濾波頻率高於1/2採樣頻率的干擾信號。對於沒有乘/除法運算指令的單片機來說。一階濾波法的程序運算工作量較大。
4.例程
**********函數名稱: OneFactorialFilter()-一階滯後濾波法
說明:
1、調用函數GetAD(),該函數用來取得當前採樣值
Delay(),基本延時函數
2、變量說明
Value,上次濾波結果
Newalue,本次採樣結果
3、常量說明
a,濾波係數
*入口:
*出口: ReturnValue,返回值,本次濾波結果*
#define a 128
unsigned char value;
OneFactorialFilter()
{
unsigned char NewValue;
unsigned char ReturnValue;
NewValue = GetAD();
ReturnValue = (255-a) * NewValue + a*Value;
ReturnValue/= 255;
return(Returnvalue);
}
加權遞推平均濾波法
1.方法
加權遞推平均濾波法是對遞推平均濾波法的改進,即不同時刻的數據加以不同的權。通常是,越接近現時刻的數據,權取得越大。給予新採樣值的權係數越大,則靈敏度越高,但信號平滑度越低。
2.優點
適用於有較大純滯後時間常數的對象,和採樣週期較短的系統。
3.缺點
對於純滯後時間常數較小、採樣週期較長、變化緩慢的信號,不能迅速反應系統當前所受干擾的嚴重程度,濾波效果差。由於需要開設隊列存儲歷次採樣數據,因此比較消耗RAM,而且運算的工作量也很大。
4.例程
*******函數名稱: AAGAFilter()-加權遞推平均濾波法********
//(AAGA: AddAuthorityGlideAverageValue)
說明:
1、調用函數
GetAD (),該函數用來取得當前採樣值
Delay(),基本延時函數
2、變量說明
Data[],暫存數據的數組屬於全局變量
value,平均值
Sum,連續採樣之和
i,循環使用的參數值
3、常量說明
N,數組長度
Coefficient[N],每一組數據的權(係數)
CoeSum ,係數和
*人口:
*出口: Value,返回值,本次濾波結果
# define N 10
const Coefficient[N]=(1,2,3,4,5,6,7,8,9,10};
constCoeSum = 55;
unsigned char Data[];
unsigned char AAGAFilter()
{
unsigned char i;
unsigned char Value;
unsigned short Sum=0;
Data[N] = GetAD();//來集數據放到數組最高位
for(i=0;i<N;i++)
{
Data[i] = Data[i+1];//所有數據左移,低位扔掉
Sum += Data[i] * Coefficient[i];//按權求和
}
Sum/= CoeSum;
value =Sum/N;
return(value );//求平均
}
另外,在實踐中得到的經驗,複合濾波確實比只採用單種濾波方法所取得的效果好。