找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7066|回復(fù): 1
收起左側(cè)

10種常用的濾波算法源碼與資料分享

[復(fù)制鏈接]
ID:327448 發(fā)表于 2018-9-13 17:33 | 顯示全部樓層 |閱讀模式
0.png

濾波源程序如下:
  1. #include <stdio.h>
  2. #include <absacc.h>
  3. #include <intrins.h>
  4. #include <./Atmel/at89x52.h>
  5. #include "source.h"
  6. main()
  7. {
  8.     filter_1();
  9.         filter_2();
  10.         filter_3();
  11.         filter_4();
  12.     filter_5();
  13.         filter_6();
  14.         filter_7();
  15.         filter_8();
  16.     filter_9();
  17.         filter_10();
  18. }
  19. unsigned char get_ad(void){
  20.         static unsigned char i;
  21.         return i++;
  22. }
  23. void delay(void){
  24.         unsigned char i=0;
  25.         while(1){
  26.                 i++;
  27.                 if(i>20) return;
  28.         }
  29. }
  30. /***限幅濾波**/
  31. #define A 10 //設(shè)置兩次采樣允許的最大偏差值
  32. char value;  //上次采用后的有效值變量
  33. char filter_1(void){
  34.     char  new_value;  //本次采樣值變量
  35.     new_value=get_ad();  //讀入本次采樣值
  36.     if((new_value-value>A)||(value-new_value>A)) //比較是否超出最大偏差值
  37.         return  value; //如果超出,返回上次的有效值作為本次的有效值
  38.     return  new_value;// 如果沒有超出,返回本次的采樣值作為本次的有效值
  39. }
  40. /***中位值濾波法***/
  41. #define N 11 //設(shè)置連續(xù)采樣的次數(shù)

  42. char filter_2(void){
  43.     char  value_buf[N]; //緩存N次采樣值的存儲(chǔ)變量
  44.     char  count,i,j,temp; //i,j是冒泡排序的下標(biāo)變量,count是采樣數(shù)據(jù)讀入的下標(biāo)變量
  45.                       //temp是臨時(shí)變量
  46.     for(count=0;count<N;count++) //連續(xù)讀入N個(gè)采樣值
  47.     {
  48.       value_buf[count]=get_ad();
  49.       delay();
  50.     }
  51.     for(j=0;j<N;j++) //氣泡排序,由小到大
  52.     {
  53.         for(i=0;i<N-j;i++)
  54.         {
  55.            if(value_buf[i]>value_buf[i+1])
  56.          {
  57.            temp=value_buf[i];
  58.            value_buf[i]=value_buf[i+1];
  59.            value_buf[i+1]=temp;
  60.            }
  61.          }
  62.      }
  63.      return value_buf[(N-1)/2]; //將排序后N個(gè)采樣值的中間值作為最后結(jié)果返回
  64. }
  65. /**算數(shù)平均濾波法**/
  66. /* N為進(jìn)行平均運(yùn)算的每組采樣值的數(shù)量,依據(jù)實(shí)際情況可以改變*/
  67. #undef N
  68. #define N 12 //設(shè)置每組參與平均運(yùn)算的采樣值個(gè)數(shù)

  69. char filter_3(){
  70.     int  sum=0; //求和變量,用于存儲(chǔ)采樣值的累加值
  71.     char count;//采樣數(shù)據(jù)讀入的下標(biāo)變量
  72.     for(count=0;count<N;count++) //連續(xù)讀入N個(gè)采樣值,并累加
  73.     {
  74.       sum+=get_ad();
  75.       delay();
  76.     }
  77.     return (char)(sum/N); //講累加值進(jìn)行平均計(jì)算作為返回值
  78. }
  79. /**遞推平均濾波法**/
  80. #undef N
  81. #define N 12 //設(shè)置FIFO隊(duì)列的長度
  82. char  value_buf[N];//FIFO隊(duì)列變量
  83. char  i=0; //隊(duì)列的下標(biāo)變量

  84. char filter_4(){
  85.     char count;
  86.         int  sum=0;
  87.         value_buf[i++]=get_ad();
  88.         if(i==N)  i=0;
  89.     for(count=0;count<N;count++)
  90.       sum+=value_buf[count];
  91.     return(char)(sum/N);
  92. }
  93. /**中位值平均濾波法**/
  94. /* 采樣值N為每組采樣值的數(shù)量,依據(jù)實(shí)際情況可以改變*/
  95. #undef N
  96. #define N 12 //設(shè)置每組采樣值的數(shù)量
  97. char filter_5()
  98. {
  99.    char count,i,j,temp; //i,j是冒泡排序的下標(biāo)變量,count是采樣數(shù)據(jù)讀入的下標(biāo)變量
  100.    char value_buf[N]; // 緩沖N個(gè)采樣值的存儲(chǔ)變量
  101.    int  sum=0; //求和變量,用于存儲(chǔ)采樣值的累加值
  102.    for  (count=0;count<N;count++) //連續(xù)讀入N個(gè)采樣值
  103.    {
  104.       value_buf[count] = get_ad();
  105.       delay();
  106.    }
  107.    for (j=0;j<N-1;j++) //氣泡排序,由小到大
  108.    {
  109.       for (i=0;i<N-j;i++)
  110.       {
  111.          if ( value_buf[i]>value_buf[i+1] )
  112.          {
  113.             temp = value_buf[i];
  114.             value_buf[i] = value_buf[i+1];
  115.              value_buf[i+1] = temp;
  116.          }
  117.       }
  118.    }
  119.    for(count=1;count<N-1;count++)
  120.     sum += value_buf[count]; //去掉兩端的最小和最大采樣值,對中間的N-2個(gè)采樣值求和
  121.    return (char)(sum/(N-2));// 返回中間N-2個(gè)采樣值的平均值
  122. }
  123. /**限幅平均濾波法**/
  124. /* A值可以根據(jù)實(shí)際情況調(diào)整,value為上次采樣的有效值,new_value為當(dāng)前采樣值 */
  125. /* N為進(jìn)行平均運(yùn)算的每組采樣值的數(shù)量,依據(jù)實(shí)際情況可以改變*/
  126. #undef A
  127. #undef N
  128. #define A 10 //設(shè)置兩次采樣允許的最大偏差值
  129. #define N 12 //設(shè)置每組參與平均運(yùn)算的采樣值個(gè)數(shù)
  130. char value;  //上次采用后的有效值變量

  131. char filter_6()
  132. {
  133.     char  new_value;  //本次采樣值變量
  134.     int  sum=0; //求和變量,用于存儲(chǔ)采樣值的累加值
  135.     char count;//采樣數(shù)據(jù)讀入的下標(biāo)變量
  136.         for(count=0;count<N;count++)
  137.     {
  138.                 new_value=get_ad();  //讀入本次采樣值
  139.               if((new_value-value>A)||(value-new_value>A)) //比較是否超出最大偏差值
  140.                       new_value=value; //如果超出,返回上次的有效值作為本次的有效值
  141.               sum+=new_value; //累加采樣的有效值
  142.               value=new_value;
  143.               delay();
  144.     }
  145.     return (char)(sum/N); //將累加值進(jìn)行平均計(jì)算作為返回值
  146. }
  147. /**一階滯后濾波法**/
  148. /* 為加快程序處理速度假定基數(shù)為100,a=0~100 */
  149. #define COE 50 //定義加權(quán)系數(shù)
  150. char value; //上一個(gè)采樣值變量
  151. char filter_7()
  152. {
  153.    char  new_value; //本次采樣值變量
  154.    new_value = get_ad();
  155.    return (100-COE)*value + COE*new_value; //返回的本次濾波結(jié)果
  156. }


  157. /**加權(quán)遞推平均濾波法**/
  158. /* coe數(shù)組為加權(quán)系數(shù)表,存在程序存儲(chǔ)區(qū)。*/
  159. #undef N
  160. #define N 12  //設(shè)置FIFO隊(duì)列的長度

  161. char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12}; //加權(quán)系數(shù)
  162. char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;
  163. char filter_8()
  164. {
  165.    char count; //采樣數(shù)據(jù)讀入的下標(biāo)變量
  166.    char value_buf[N]; //緩存N個(gè)采樣值的存儲(chǔ)變量
  167.    int  sum=0; //求和變量,用于存儲(chǔ)采樣值的累加值
  168.    for (count=0;count<N;count++)
  169.    {
  170.       value_buf[count] = get_ad(); //讀入采樣值
  171.       delay();
  172.    }
  173.    for (count=0;count<N;count++)
  174.       sum += value_buf[count]*coe[count]; //累加采樣值和系數(shù)的乘積
  175.    return (char)(sum/sum_coe); //累加值與系數(shù)和相除作為返回結(jié)果
  176. }

  177. /**消抖濾波法**/
  178. #undef N
  179. #define N 12 //設(shè)置計(jì)數(shù)器溢出值
  180. char filter_9()
  181. {
  182.    char count=0; //計(jì)數(shù)變量
  183.    char new_value; //本次采樣值變量
  184.    new_value = get_ad(); //讀入本次采樣值
  185.    while (value !=new_value);
  186.    {
  187.       count++; //計(jì)數(shù)器加1
  188.       if (count>=N)   return new_value; //如果本次采樣值與當(dāng)前有效值不相等,
  189. //且計(jì)數(shù)器溢出,返回本次采樣值
  190.        delay();
  191.       new_value = get_ad();
  192.    }
  193.    return value; //如果本次采樣值與當(dāng)前有效值相等,則返回當(dāng)前有效值
  194. }


  195. /**限幅消抖濾波法**/

  196. /* A值可以根據(jù)實(shí)際情況調(diào)整,value為上次采樣的有效值,new_value為當(dāng)前采樣值 */
  197. /* N為計(jì)數(shù)器的溢出值*/
  198. #undef A
  199. #undef N
  200. #define A 10 //設(shè)置兩次采樣允許的最大偏差值
  201. #define N 12 //設(shè)置計(jì)數(shù)器溢出值
  202. char value;  //有效值變量

  203. char filter_10()
  204. {
  205.    char count=0; //計(jì)數(shù)變量
  206.    char new_value; //本次采樣值變量
  207.    new_value = get_ad(); //讀入本次采樣值
  208.         if((new_value-value>A)||(value-new_value>A)) //比較是否超出最大偏差值
  209.                 new_value=value; //如果超出,返回有效值作為本次的采樣有效值
  210.    while (value !=new_value);
  211.    {
  212.       count++; //計(jì)數(shù)器加1
  213.       if (count>=N)   return new_value; //如果本次采樣值與當(dāng)前有效值不相等,
  214.                                                                                 //且計(jì)數(shù)器溢出,返回本次采樣值
  215.        delay();
  216.       new_value = get_ad();
  217.    }
  218.    return value; //如果本次采樣值與當(dāng)前有效值相等,則返回當(dāng)前有效值
  219. }
復(fù)制代碼

1、限幅濾波法(又稱程序判斷濾波法)
 A、方法:
  根據(jù)經(jīng)驗(yàn)判斷,確定兩次采樣允許的最大偏差值(設(shè)為A
  每次檢測到新值時(shí)判斷:
  如果本次值與上次值之差<=A,則本次值有效
  如果本次值與上次值之差>A,則本次值無效,放棄本次值,用上次值代替本次值
 B、優(yōu)點(diǎn):
  能有效克服因偶然因素引起的脈沖干擾
 C、缺點(diǎn)
  無法抑制那種周期性的干擾
  平滑度差
2、中位值濾波法
 A、方法:
  連續(xù)采樣N次(N取奇數(shù))
  把N次采樣值按大小排列
  取中間值為本次有效值
 B、優(yōu)點(diǎn):
  能有效克服因偶然因素引起的波動(dòng)干擾
  對溫度、液位的變化緩慢的被測參數(shù)有良好的濾波效果
 C、缺點(diǎn):
  對流量、速度等快速變化的參數(shù)不宜
3、算術(shù)平均濾波法
 A、方法:
  連續(xù)取N個(gè)采樣值進(jìn)行算術(shù)平均運(yùn)算
  N值較大時(shí):信號平滑度較高,但靈敏度較低
  N值較小時(shí):信號平滑度較低,但靈敏度較高
  N值的選。阂话懔髁,N=12;壓力:N=4
 B、優(yōu)點(diǎn):
  適用于對一般具有隨機(jī)干擾的信號進(jìn)行濾波
  這樣信號的特點(diǎn)是有一個(gè)平均值,信號在某一數(shù)值范圍附近上下波動(dòng)
 C、缺點(diǎn):
  對于測量速度較慢或要求數(shù)據(jù)計(jì)算速度較快的實(shí)時(shí)控制不適用
  比較浪費(fèi)RAM
4、遞推平均濾波法(又稱滑動(dòng)平均濾波法)
 A、方法:
  把連續(xù)取N個(gè)采樣值看成一個(gè)隊(duì)列
  隊(duì)列的長度固定為N
  每次采樣到一個(gè)新數(shù)據(jù)放入隊(duì)尾,并扔掉原來隊(duì)首的一次數(shù)據(jù).(先進(jìn)先出原則)
  把隊(duì)列中的N個(gè)數(shù)據(jù)進(jìn)行算術(shù)平均運(yùn)算,就可獲得新的濾波結(jié)果
  N值的選。毫髁浚N=12;壓力:N=4;液面,N=4~12;溫度,N=1~4
 B、優(yōu)點(diǎn):
  對周期性干擾有良好的抑制作用,平滑度高
  適用于高頻振蕩的系統(tǒng)
 C、缺點(diǎn):
  靈敏度低
  對偶然出現(xiàn)的脈沖性干擾的抑制作用較差
  不易消除由于脈沖干擾所引起的采樣值偏差
  不適用于脈沖干擾比較嚴(yán)重的場合
  比較浪費(fèi)RAM
5、中位值平均濾波法(又稱防脈沖干擾平均濾波法)
 A、方法:
  相當(dāng)于“中位值濾波法”+“算術(shù)平均濾波法”
  連續(xù)采樣N個(gè)數(shù)據(jù),去掉一個(gè)最大值和一個(gè)最小值
  然后計(jì)算N-2個(gè)數(shù)據(jù)的算術(shù)平均值
  N值的選取:3~14
 B、優(yōu)點(diǎn):
  融合了兩種濾波法的優(yōu)點(diǎn)
  對于偶然出現(xiàn)的脈沖性干擾,可消除由于脈沖干擾所引起的采樣值偏差
 C、缺點(diǎn):
  測量速度較慢,和算術(shù)平均濾波法一樣
  比較浪費(fèi)RAM

6、限幅平均濾波法
 A、方法:
  相當(dāng)于“限幅濾波法”+“遞推平均濾波法”
  每次采樣到的新數(shù)據(jù)先進(jìn)行限幅處理,
  再送入隊(duì)列進(jìn)行遞推平均濾波處理
 B、優(yōu)點(diǎn):
  融合了兩種濾波法的優(yōu)點(diǎn)
  對于偶然出現(xiàn)的脈沖性干擾,可消除由于脈沖干擾所引起的采樣值偏差
 C、缺點(diǎn):
  比較浪費(fèi)RAM
7、一階滯后濾波法
 A、方法:
  取a=0~1
  本次濾波結(jié)果=1-a*本次采樣值+a*上次濾波結(jié)果
 B、優(yōu)點(diǎn):
  對周期性干擾具有良好的抑制作用
  適用于波動(dòng)頻率較高的場合
 C、缺點(diǎn):
  相位滯后,靈敏度低
  滯后程度取決于a值大小
  不能消除濾波頻率高于采樣頻率的1/2的干擾信號
8、加權(quán)遞推平均濾波法
 A、方法:
  是對遞推平均濾波法的改進(jìn),即不同時(shí)刻的數(shù)據(jù)加以不同的權(quán)
  通常是,越接近現(xiàn)時(shí)刻的數(shù)據(jù),權(quán)取得越大。
  給予新采樣值的權(quán)系數(shù)越大,則靈敏度越高,但信號平滑度越低
 B、優(yōu)點(diǎn):
  適用于有較大純滯后時(shí)間常數(shù)的對象
  和采樣周期較短的系統(tǒng)
 C、缺點(diǎn):
  對于純滯后時(shí)間常數(shù)較小,采樣周期較長,變化緩慢的信號
  不能迅速反應(yīng)系統(tǒng)當(dāng)前所受干擾的嚴(yán)重程度,濾波效果差
9、消抖濾波法
 A、方法:
  設(shè)置一個(gè)濾波計(jì)數(shù)器
  將每次采樣值與當(dāng)前有效值比較:
  如果采樣值=當(dāng)前有效值,則計(jì)數(shù)器清零
  如果采樣值<>當(dāng)前有效值,則計(jì)數(shù)器+1,并判斷計(jì)數(shù)器是否>=上限N(溢出)
   如果計(jì)數(shù)器溢出,則將本次值替換當(dāng)前有效值,并清計(jì)數(shù)器
 B、優(yōu)點(diǎn):
  對于變化緩慢的被測參數(shù)有較好的濾波效果,
  可避免在臨界值附近控制器的反復(fù)開/關(guān)跳動(dòng)或顯示器上數(shù)值抖動(dòng)
 C、缺點(diǎn):
  對于快速變化的參數(shù)不宜
  如果在計(jì)數(shù)器溢出的那一次采樣到的值恰好是干擾值,則會(huì)將干擾值當(dāng)作有效值導(dǎo)入系統(tǒng)
10、限幅消抖濾波法
 A、方法:
  相當(dāng)于“限幅濾波法”+“消抖濾波法”
  先限幅,后消抖
 B、優(yōu)點(diǎn):
  繼承了“限幅”和“消抖”的優(yōu)點(diǎn)
  改進(jìn)了“消抖濾波法”中的某些缺陷,避免將干擾值導(dǎo)入系統(tǒng)
 C、缺點(diǎn):
  對于快速變化的參數(shù)不宜

所有資料51hei提供下載:
濾波算法.rar (198.22 KB, 下載次數(shù): 132)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:228340 發(fā)表于 2019-1-23 14:31 | 顯示全部樓層
多謝分享
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表