算法之十大濾波算法詳解

限幅濾波法

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 );//求平均

}


另外,在實踐中得到的經驗,複合濾波確實比只採用單種濾波方法所取得的效果好。

 

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