11種常見的AD濾波算法


1 種方法 限幅濾波法(又稱程序判斷濾波法)

A 方法

根據經驗判斷,確定兩次采樣允許的最大偏差值(設為 A)每次檢測到新值時判斷:如果本次值與上次值
之差<=A,則本次值有效如果本次值與上次值之差>A,則本次值無效,放棄本次值,用上次值代替本次值

B 優點

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

C 缺點

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

D 實例程序

 1: /* A 值可根據實際情況調整value 為有效值,new_value 為當前采樣值濾波程序返回有效的實際值 */
 2: #define A 10
 3: char value;
 4: char filter()
 5: {
 6:     char new_value;
 7:     new_value = get_ad();
 8:     if ( ( new_value - value > A ) || ( value - new_value > A )
 9:         return value;
 10:     return new_value;
 11: }

2種方法 中位值濾波法

A 方法

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

B 優點

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

C 缺點

對流量、速度等快速變化的參數不宜

D 實例程序

 1: /* N 值可根據實際情況調整排序采用冒泡法*/
 2: #define N 11
 3: char filter()
 4: {
 5:     char value_buf[N];
 6:     char count,i,j,temp;
 7:     for ( count="0";count<N;count++)
 8:     {
 9:         value_buf[count] = get_ad();
 10:         delay();
 11:     }
 12:     for (j=0;j<N-1;j++)
 13:     {
 14:         for (i=0;i<N-j;i++)
 15:         {
 16:             if ( value_buf>value_buf[i+1] )
 17:             {
 18:                 temp = value_buf;
 19:                 value_buf = value_buf[i+1];
 20:                 value_buf[i+1] = temp;
 21:             }
 22:         }
 23:     }
 24:  
 25:     return value_buf[(N-1)/2];
 26: } 

3種方法 算術平均濾波法

A 方法

連續取 N 個采樣值進行算術平均運算 N 值較大時:信號平滑度較高,但靈敏度較低 N 值較小時:信號平
滑度較低,但靈敏度較高 N 值的選取:一般流量,N=12;壓力:N=4

B 優點

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

C 缺點

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

D 實例程序

 1: #define N 12
 2: char filter()
 3: {
 4:     int sum = 0;
 5:     for ( count="0";count<N;count++)
 6:     {
 7:         sum + = get_ad();
 8:         delay();
 9:     }
 10:     return (char)(sum/N);
 11: }

4種方法 遞推平均濾波法(又稱滑動平均濾波法)

A 方法

把連續取 N 個采樣值看成一個隊列隊列的長度固定為 N 每次采樣到一個新數據放入隊尾,並扔掉原來隊首
的一次數據.(先進先出原則)把隊列中的 N 個數據進行算術平均運算,就可獲得新的濾波結果 N 值的選取:
流量,N=12;壓力:N=4;液面,N=4~12;溫度,N=1~4

B 優點

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

C 缺點

靈敏度低對偶然出現的脈沖性干擾的抑制作用較差不易消除由於脈沖干擾所引起的采樣值偏差不適用於
脈沖干擾比較嚴重的場合比較浪費 RAM

D 實例程序

 1: #define N 12
 2: char value_buf[N];
 3: char i="0";
 4: char filter()
 5: {
 6:     char count;
 7:     int sum=0;
 8:  
 9:     value_buf[i++] = get_ad();
 10:  
 11:     if ( i == N ) i = 0;
 12:  
 13:     for ( count="0";count<N,count++)
 14:         sum = value_buf[count];
 15:  
 16:     return (char)(sum/N);
 17: }

5種方法 中位值平均濾波法(又稱防脈沖干擾平均濾波法)

A 方法

相當於“中位值濾波法”+“算術平均濾波法”連續采樣 N 個數據,去掉一個最大值和一個最小值然后計
算 N-2 個數據的算術平均值 N 值的選取:3~14

B 優點

融合了兩種濾波法的優點對於偶然出現的脈沖性干擾,可消除由於脈沖干擾所引起的采樣值偏差

C 缺點

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

D 實例程序

 1: #define N 12
 2: char filter()
 3: {
 4:     char count,i,j;
 5:     char value_buf[N];
 6:     int sum=0;
 7:  
 8:     for (count=0;count<N;count++)
 9:     {
 10:         value_buf[count] = get_ad();
 11:         delay();
 12:     }
 13:  
 14:     for (j=0;j<N-1;j++)
 15:     {
 16:         for (i=0;i<N-j;i++)
 17:         {
 18:             if ( value_buf>value_buf[i+1] )
 19:             {
 20:                 temp = value_buf;
 21:                 value_buf = value_buf[i+1];
 22:                 value_buf[i+1] = temp;
 23:             }
 24:         }
 25:     }
 26:  
 27:     for(count=1;count<N-1;count++)
 28:         sum += value[count];
 29:  
 30:     return (char)(sum/(N-2));
 31: } 

6種方法 限幅平均濾波法

A 方法

相當於“限幅濾波法”+“遞推平均濾波法” 每次采樣到的新數據先進行限幅處理
再送入隊列進行遞推平均濾波處理

B 優點

融合了兩種濾波法的優點
對於偶然出現的脈沖性干擾,可消除由於脈沖干擾所引起的采樣值偏差

C 缺點

比較浪費 RAM

D 實例程序

略 參考子程序限幅濾波法和算術平均濾波法

7 種方法 一階滯后濾波法

A 方法

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

B 優點

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

C 缺點

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

D 實例程序

 1: /* 為加快程序處理速度假定基數為 100,a=0~100 */
 2: #define a 50
 3: char value;
 4: char filter()
 5: {
 6:     char new_value;
 7:     new_value = get_ad();
 8:  
 9:     return (100-a)*value + a*new_value;
 10: } 

第8種方法 加權遞推平均濾波法

A 方法

是對遞推平均濾波法的改進,即不同時刻的數據加以不同的權通常是,越接近現時刻的資料,權取得越大
給予新采樣值的權系數越大,則靈敏度越高,但信號平滑度越低

B 優點

適用於有較大純滯后時間常數的對象和采樣周期較短的系統

C 缺點

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

D 實例程序

 1: /* coe 數組為加權系數表,存在程序存儲區。*/
 2: #define N 12
 3: char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};
 4: char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;
 5: char filter()
 6: {
 7:     char count;
 8:     char value_buf[N];
 9:     int sum=0;
 10:     for (count=0,count<N;count++)
 11:     {
 12:         value_buf[count] = get_ad();
 13:         delay();
 14:     }
 15:     for (count=0,count<N;count++)
 16:         sum += value_buf[count]*coe[count];
 17:  
 18:     return (char)(sum/sum_coe);
 19: } 

9種方法 消抖濾波法

A 方法

設置一個濾波計數器將每次采樣值與當前有效值比較:如果采樣值=當前有效值,則計數器清零如果采樣
值<>當前有效值,則計數器+1,並判斷計數器是否>=上限 N(溢出)如果計數器溢出,則將本次值替換當前有
效值,並清計數器

B 優點

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

C 缺點

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

D 實例程序

 1: #define N 12
 2: char filter()
 3: {
 4:     char count="0";
 5:     char new_value;
 6:     new_value = get_ad();
 7:     while (value !=new_value);
 8:     {
 9:         count++;
 10:         if (count>=N) return new_value;
 11:             delay();
 12:         new_value = get_ad();
 13:     }
 14:     return value;
 15: } 

10種方法 限幅消抖濾波法

A 方法

相當於“限幅濾波法”+“消抖濾波法”先限幅后消抖

B 優點

繼承了“限幅”和“消抖”的優點改進了“消抖濾波法”中的某些缺陷,避免將干擾值導入系統

C 缺點

對於快速變化的參數不宜

D 實例程序

略 參考子程序第 1 種方法 限幅濾波法(又稱程序判斷濾波法)和第 9 種方法 消抖濾波法

11 種方法 IIR

數字濾波器

A 方法

確定信號帶寬,濾之。Y(n) = a1*Y(n-1) + a2*Y(n-2) + ... + ak*Y(n-k) + b0*X(n) + b1*X(n-1) + b2*X(n-2) + ...+ bk*X(n-k)

B 優點

高通,低通,帶通,帶阻任意。設計簡單(用 matlab)

C 缺點

運算量大

D 實例程序

 1: #define N 3
 2: char value;
 3: char filter()
 4: {
 5:     char new_value;
 6:     new_value = get_ad();
 7:     value = value + (new_value - value)/N;
 8:     return value;
 9: }

這個程序的意思是把臨近兩個的變化減小至 1/N

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM