1. 程式人生 > >非常值得一看—九種濾波演算法C語言實現

非常值得一看—九種濾波演算法C語言實現

關注“嵌入式軟體開發學習圈”免費獲取更多學習教程


今天帶著大家學習濾波演算法c語言(九種濾波演算法)實現,以及程式碼,大家可以學習瞭解下。。。。

1.限幅濾波演算法(程式判斷濾波演算法)

方法解析:

根據經驗判斷,確定兩次取樣允許的最大偏差值(設定為A),每次檢測到新值時判斷:

如果本次值與上次值之差<=A,則本次值有效,

如果本次值與上次值只差>A,則本次值無效,放棄本次值,用上次值代替本次值。

優點:

能有效克服因偶然因素引起的脈衝干擾

缺點:

無法抑制那種週期性的干擾,平滑度差

#define A 10  

char value;  

char filter()  

{  

   char  new_value;  

   new_value = get_ad();  

   if ( ( new_value - value > A ) || ( value - new_value > A )  

      return value;  

   return new_value;  

}  

2.中位值濾波法

方法解析:

連續取樣N次(N取奇數),把N次取樣值按大小排列,取中間值為本次有效值

優點:

能有效克服因偶然因素引起的波動干擾,對溫度,液位的變化緩慢的被測引數有良好的濾波效果

缺點:

對流量,速度等快速變化的引數不宜


#define N  11

  

char filter()  

{  

   char value_buf[N];  

   char count,i,j,temp;  

   for ( count=0;count<N;count++)  

   {  

      value_buf[count] = get_ad();  

      delay();  

   }  

   for (j=0;j<N-1;j++)  

   {  

      for (i=0;i<N-j;i++)  

      {  

         if ( value_buf[i]>value_buf[i+1] )  

         {  

            temp = value_buf[i];  

            value_buf[i] = value_buf[i+1];   

             value_buf[i+1] = temp;  

         }  

      }  

   }  

  return value_buf[(N-1)/2];  

}  


3.算術平均濾波


方法解析:

連續取N個取樣值進行平均運算,N值較大時:訊號平滑度較高,但靈敏度較低

N值較小時:訊號平滑度較低,但靈敏度較高。N值的選取:一般12左右。

優點:

適應於對一般具有隨機干擾的訊號進行濾波,這樣訊號的特點是有一個平均值,訊號在某一數值範圍附近上下波動

缺點:

對於測量速度較慢或要求資料計算速度較快的實時控制並不適用,比較浪費RAM


#define N 12  

char filter()  

{  

   int  sum = 0;  

   for ( count=0;count<N;count++)  

   {  

      sum + = get_ad();  

    delay();  

   }  

   return (char)(sum/N);  



4.遞推平均濾波(滑動平均濾波法)

方法解析:

把連續取N個取樣值看成一個佇列,佇列的長度固定為N,每次取樣到一個新資料放入隊尾,並扔掉原來隊首的一次資料(先進先出)。

把佇列中的N個數據進行算術平均運算,就可獲得新的濾波結果。N值的選取:一般12.

優點:

對週期性干擾有良好的抑制作用,平滑度高,適應於高頻振盪的系統

缺點:

靈敏度低,對偶然出現的脈衝性干擾的抑制作用較差。不易消除由於脈衝干擾所引起打的取樣值偏差,不適用於脈衝干擾比較嚴重的場合

浪費RAM



#define N 12   

char value_buf[N];  

char i=0;  

char filter()  

{  

   char count;  

   int  sum=0;  

   value_buf[i++] = get_ad();  

   if ( i == N )   i = 0;  

   for ( count=0;count<N,count++)  

      sum = value_buf[count];  

   return (char)(sum/N);  

}  


5.中位值平均濾波法(防脈衝干擾平均濾波法)


方法解析:

相當於中位值濾波+算術平均濾波,連續取樣N個數據,去掉一個最大值和一個最小值,然後計算N-2個數據的算術平均值。

N值的選取:3-14

優點:融合了兩種濾波法的優點

對於偶然出現的脈衝性干擾,可消除由於脈衝干擾所引起的取樣值偏差。

缺點:

測量速度較慢,和演算法平均濾波一樣,浪費RAM。





#define N 12  

char filter()  

{  

   char count,i,j;  

   char value_buf[N];  

   int  sum=0,temp=0;  

   for  (count=0;count<N;count++)  

   {  

      value_buf[count] = get_ad();  

      delay();  

   }  

   for (j=0;j<N-1;j++)  

   {  

      for (i=0;i<N-j;i++)  

      {  

         if ( value_buf[i]>value_buf[i+1] )  

         {  

            temp = value_buf[i];  

            value_buf[i] = value_buf[i+1];   

             value_buf[i+1] = temp;  

         }  

      }  

   }  

   for(count=1;count<N-1;count++)  

      sum += value[count];  

   return (char)(sum/(N-2));  

}  


6一階滯後濾波法


方法解析:

取a=0-1

本次濾波結果=(1-a)*本次取樣值+a*上次濾波結果

優點:

對週期性干擾具有良好的抑制作用,適用於波動頻率較高的場合

缺點:

相位滯後,靈敏度低,滯後程度取決於a值的大小,不能消除濾波頻率高於取樣頻率的1/2的干擾訊號

#define a 50  

char value;  

char filter()  

{  

   char  new_value;  

   new_value = get_ad();  

   return (100-a)*value + a*new_value;   

}  


7.加權遞推平均濾波法


方法解析:

是對遞推平均濾波法的改進,即不同時刻的資料加以不同的權

通常是,越接近現時刻的資料,權取得越大,給予新取樣值的權係數越大,則靈敏度越高,但訊號平滑度越低。

優點:

適用於有較大純滯後時間常數的物件,和取樣週期較短的系統

缺點:

 對於純滯後時間常數較小,取樣週期較長,變化緩慢的訊號,不能迅速反應系統當前所受干擾的嚴重程度,濾波效果差。

#define N 12  

char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};  

char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;  

char filter()  

{  

   char count;  

   char value_buf[N];  

   int  sum=0;  

   for (count=0,count<N;count++)  

   {  

      value_buf[count] = get_ad();  

      delay();  

   }  

   for (count=0,count<N;count++)  

      sum += value_buf[count]*coe[count];  

   return (char)(sum/sum_coe);  

}  




8.消抖濾波法

方法解析:

設定一個濾波計數器,將每次取樣值與當前有效值比較:

如果取樣值=當前有效值,則計數器清零,如果取樣值<>當前有效值,則計數器+1,並判斷計數器是否>=上限N(溢位),如果計數器溢位,則將本次值替換當前有效值,並清計數器

優點:

對於變化緩慢的被測引數有較好的濾波效果,可避免在臨界值附近控制器的反覆開/關跳動或顯示器上數值抖動

缺點:

對於快速變化的引數不宜,如果在計數器溢位的那一次取樣到的值恰好是干擾值,則會將干擾值當作有效值匯入系統

#define N 12  

char filter()  

{  

   char count=0;  

   char new_value;  

   new_value = get_ad();  

   while (value !=new_value);  

   {  

      count++;  

      if (count>=N)   return new_value;  

       delay();  

      new_value = get_ad();  

   }  

   return value;      

}  


9.低通數字濾波

解析:

低通濾波也稱一階滯後濾波,方法是第N次取樣後濾波結果輸出值是(1-a)乘第N次取樣值加a乘上次濾波結果輸出值。可見a<<1。

該方法適用於變化過程比較慢的引數的濾波的C程式函式如下

float low_filter(float low_buf[])  

{  

    float sample_value;  

    float X=0.01;  

    sample_value=(1_X)*low_buf[1]+X*low buf[0];  

    retrun(sample_value);  

}  

獲取相關學習資料留言“濾波演算法”


關注微信公眾號嵌入式軟體開發學習圈獲取更多嵌入式學習資訊

如需獲取其他學習資料,直接在微信公眾號留言



關注“嵌入式軟體開發學習圈”免費獲取更多學習教程


今天帶著大家學習濾波演算法c語言(九種濾波演算法)實現,以及程式碼,大家可以學習瞭解下。。。。

1.限幅濾波演算法(程式判斷濾波演算法)

方法解析:

根據經驗判斷,確定兩次取樣允許的最大偏差值(設定為A),每次檢測到新值時判斷:

如果本次值與上次值之差<=A,則本次值有效,

如果本次值與上次值只差>A,則本次值無效,放棄本次值,用上次值代替本次值。

優點:

能有效克服因偶然因素引起的脈衝干擾

缺點:

無法抑制那種週期性的干擾,平滑度差

#define A 10  

char value;  

char filter()  

{  

   char  new_value;  

   new_value = get_ad();  

   if ( ( new_value - value > A ) || ( value - new_value > A )  

      return value;  

   return new_value;  

}  

2.中位值濾波法

方法解析:

連續取樣N次(N取奇數),把N次取樣值按大小排列,取中間值為本次有效值

優點:

能有效克服因偶然因素引起的波動干擾,對溫度,液位的變化緩慢的被測引數有良好的濾波效果

缺點:

對流量,速度等快速變化的引數不宜


#define N  11  

char filter()  

{  

   char value_buf[N];  

   char count,i,j,temp;  

   for ( count=0;count<N;count++)  

   {  

      value_buf[count] = get_ad();  

      delay();  

   }  

   for (j=0;j<N-1;j++)  

   {  

      for (i=0;i<N-j;i++)  

      {  

         if ( value_buf[i]>value_buf[i+1] )  

         {  

            temp = value_buf[i];  

            value_buf[i] = value_buf[i+1];   

             value_buf[i+1] = temp;  

         }  

      }  

   }  

  return value_buf[(N-1)/2];  

}  


3.算術平均濾波


方法解析:

連續取N個取樣值進行平均運算,N值較大時:訊號平滑度較高,但靈敏度較低

N值較小時:訊號平滑度較低,但靈敏度較高。N值的選取:一般12左右。

優點:

適應於對一般具有隨機干擾的訊號進行濾波,這樣訊號的特點是有一個平均值,訊號在某一數值範圍附近上下波動

缺點:

對於測量速度較慢或要求資料計算速度較快的實時控制並不適用,比較浪費RAM


#define N 12  

char filter()  

{  

   int  sum = 0;  

   for ( count=0;count<N;count++)  

   {  

      sum + = get_ad();  

    delay();  

   }  

   return (char)(sum/N);  



4.遞推平均濾波(滑動平均濾波法)

方法解析:

把連續取N個取樣值看成一個佇列,佇列的長度固定為N,每次取樣到一個新資料放入隊尾,並扔掉原來隊首的一次資料(先進先出)。

把佇列中的N個數據進行算術平均運算,就可獲得新的濾波結果。N值的選取:一般12.

優點:

對週期性干擾有良好的抑制作用,平滑度高,適應於高頻振盪的系統

缺點:

靈敏度低,對偶然出現的脈衝性干擾的抑制作用較差。不易消除由於脈衝干擾所引起打的取樣值偏差,不適用於脈衝干擾比較嚴重的場合

浪費RAM



#define N 12   

char value_buf[N];  

char i=0;  

char filter()  

{  

   char count;  

   int  sum=0;  

   value_buf[i++] = get_ad();  

   if ( i == N )   i = 0;  

   for ( count=0;count<N,count++)  

      sum = value_buf[count];  

   return (char)(sum/N);  

}  


5.中位值平均濾波法(防脈衝干擾平均濾波法)


方法解析:

相當於中位值濾波+算術平均濾波,連續取樣N個數據,去掉一個最大值和一個最小值,然後計算N-2個數據的算術平均值。

N值的選取:3-14

優點:融合了兩種濾波法的優點

對於偶然出現的脈衝性干擾,可消除由於脈衝干擾所引起的取樣值偏差。

缺點:

測量速度較慢,和演算法平均濾波一樣,浪費RAM。





#define N 12  

char filter()  

{  

   char count,i,j;  

   char value_buf[N];  

   int  sum=0,temp=0;  

   for  (count=0;count<N;count++)  

   {  

      value_buf[count] = get_ad();  

      delay();  

   }  

   for (j=0;j<N-1;j++)  

   {  

      for (i=0;i<N-j;i++)  

      {  

         if ( value_buf[i]>value_buf[i+1] )  

         {  

            temp = value_buf[i];  

            value_buf[i] = value_buf[i+1];   

             value_buf[i+1] = temp;  

         }  

      }  

   }  

   for(count=1;count<N-1;count++)  

      sum += value[count];  

   return (char)(sum/(N-2));  

}  


6一階滯後濾波法


方法解析:

取a=0-1

本次濾波結果=(1-a)*本次取樣值+a*上次濾波結果

優點:

對週期性干擾具有良好的抑制作用,適用於波動頻率較高的場合

缺點:

相位滯後,靈敏度低,滯後程度取決於a值的大小,不能消除濾波頻率高於取樣頻率的1/2的干擾訊號

#define a 50  

char value;  

char filter()  

{  

   char  new_value;  

   new_value = get_ad();  

   return (100-a)*value + a*new_value;   

}  


7.加權遞推平均濾波法


方法解析:

是對遞推平均濾波法的改進,即不同時刻的資料加以不同的權

通常是,越接近現時刻的資料,權取得越大,給予新取樣值的權係數越大,則靈敏度越高,但訊號平滑度越低。

優點:

適用於有較大純滯後時間常數的物件,和取樣週期較短的系統

缺點:

 對於純滯後時間常數較小,取樣週期較長,變化緩慢的訊號,不能迅速反應系統當前所受干擾的嚴重程度,濾波效果差。

#define N 12  

char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};  

char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;  

char filter()  

{  

   char count;  

   char value_buf[N];  

   int  sum=0;  

   for (count=0,count<N;count++)  

   {  

      value_buf[count] = get_ad();  

      delay();  

   }  

   for (count=0,count<N;count++)  

      sum += value_buf[count]*coe[count];  

   return (char)(sum/sum_coe);  

}  




8.消抖濾波法

方法解析:

設定一個濾波計數器,將每次取樣值與當前有效值比較:

如果取樣值=當前有效值,則計數器清零,如果取樣值<>當前有效值,則計數器+1,並判斷計數器是否>=上限N(溢位),如果計數器溢位,則將本次值替換當前有效值,並清計數器

優點:

對於變化緩慢的被測引數有較好的濾波效果,可避免在臨界值附近控制器的反覆開/關跳動或顯示器上數值抖動

缺點:

對於快速變化的引數不宜,如果在計數器溢位的那一次取樣到的值恰好是干擾值,則會將干擾值當作有效值匯入系統

#define N 12  

char filter()  

{  

   char count=0;  

   char new_value;  

   new_value = get_ad();  

   while (value !=new_value);  

   {  

      count++;  

      if (count>=N)   return new_value;  

       delay();  

      new_value = get_ad();  

   }  

   return value;      

}  


9.低通數字濾波

解析:

低通濾波也稱一階滯後濾波,方法是第N次取樣後濾波結果輸出值是(1-a)乘第N次取樣值加a乘上次濾波結果輸出值。可見a<<1。

該方法適用於變化過程比較慢的引數的濾波的C程式函式如下

float low_filter(float low_buf[])  

{  

    float sample_value;  

    float X=0.01;  

    sample_value=(1_X)*low_buf[1]+X*low buf[0];  

    retrun(sample_value);  

}  

獲取相關學習資料留言“濾波演算法”


關注微信公眾號嵌入式軟體開發學習圈獲取更多嵌入式學習資訊

如需獲取其他學習資料,直接在微信公眾號留言