久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6945|回復: 1
收起左側

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

[復制鏈接]
ID:327448 發表于 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 //設置兩次采樣允許的最大偏差值
  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 //設置連續采樣的次數

  42. char filter_2(void){
  43.     char  value_buf[N]; //緩存N次采樣值的存儲變量
  44.     char  count,i,j,temp; //i,j是冒泡排序的下標變量,count是采樣數據讀入的下標變量
  45.                       //temp是臨時變量
  46.     for(count=0;count<N;count++) //連續讀入N個采樣值
  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個采樣值的中間值作為最后結果返回
  64. }
  65. /**算數平均濾波法**/
  66. /* N為進行平均運算的每組采樣值的數量,依據實際情況可以改變*/
  67. #undef N
  68. #define N 12 //設置每組參與平均運算的采樣值個數

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

  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為每組采樣值的數量,依據實際情況可以改變*/
  95. #undef N
  96. #define N 12 //設置每組采樣值的數量
  97. char filter_5()
  98. {
  99.    char count,i,j,temp; //i,j是冒泡排序的下標變量,count是采樣數據讀入的下標變量
  100.    char value_buf[N]; // 緩沖N個采樣值的存儲變量
  101.    int  sum=0; //求和變量,用于存儲采樣值的累加值
  102.    for  (count=0;count<N;count++) //連續讀入N個采樣值
  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個采樣值求和
  121.    return (char)(sum/(N-2));// 返回中間N-2個采樣值的平均值
  122. }
  123. /**限幅平均濾波法**/
  124. /* A值可以根據實際情況調整,value為上次采樣的有效值,new_value為當前采樣值 */
  125. /* N為進行平均運算的每組采樣值的數量,依據實際情況可以改變*/
  126. #undef A
  127. #undef N
  128. #define A 10 //設置兩次采樣允許的最大偏差值
  129. #define N 12 //設置每組參與平均運算的采樣值個數
  130. char value;  //上次采用后的有效值變量

  131. char filter_6()
  132. {
  133.     char  new_value;  //本次采樣值變量
  134.     int  sum=0; //求和變量,用于存儲采樣值的累加值
  135.     char count;//采樣數據讀入的下標變量
  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); //將累加值進行平均計算作為返回值
  146. }
  147. /**一階滯后濾波法**/
  148. /* 為加快程序處理速度假定基數為100,a=0~100 */
  149. #define COE 50 //定義加權系數
  150. char value; //上一個采樣值變量
  151. char filter_7()
  152. {
  153.    char  new_value; //本次采樣值變量
  154.    new_value = get_ad();
  155.    return (100-COE)*value + COE*new_value; //返回的本次濾波結果
  156. }


  157. /**加權遞推平均濾波法**/
  158. /* coe數組為加權系數表,存在程序存儲區。*/
  159. #undef N
  160. #define N 12  //設置FIFO隊列的長度

  161. char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12}; //加權系數
  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; //采樣數據讀入的下標變量
  166.    char value_buf[N]; //緩存N個采樣值的存儲變量
  167.    int  sum=0; //求和變量,用于存儲采樣值的累加值
  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]; //累加采樣值和系數的乘積
  175.    return (char)(sum/sum_coe); //累加值與系數和相除作為返回結果
  176. }

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


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

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

  203. char filter_10()
  204. {
  205.    char count=0; //計數變量
  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++; //計數器加1
  213.       if (count>=N)   return new_value; //如果本次采樣值與當前有效值不相等,
  214.                                                                                 //且計數器溢出,返回本次采樣值
  215.        delay();
  216.       new_value = get_ad();
  217.    }
  218.    return value; //如果本次采樣值與當前有效值相等,則返回當前有效值
  219. }
復制代碼

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

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

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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草视频在线播放 | 午夜影院 | 国产一区二区视频在线观看 | 一级毛片视频在线观看 | 国产精品一区二区三区在线播放 | 日韩一区二区三区在线 | 日韩一区二区三区av | 国产一区二区免费 | 欧美日韩亚洲视频 | 国产高清视频一区 | 美女艹b | 欧美精品一区二区三区在线播放 | 国产一区二区视频在线观看 | 午夜久久久久久久久久一区二区 | 精品一级毛片 | 国产精品毛片一区二区三区 | 精品国产一区二区三区性色av | 久久成人在线视频 | 国产精品久久久久久福利一牛影视 | 97视频免费| 天天看天天操 | 岛国精品 | 国产九九精品 | 国产成人精品高清久久 | 午夜亚洲 | 久久国产精品久久久久久 | 视频一区二区在线 | 国产成人免费网站 | 麻豆久久久9性大片 | 久久精品欧美一区二区三区不卡 | 亚洲免费成人 | 国产激情91久久精品导航 | 黄色日本片 | 日韩成人免费视频 | av网站免费在线观看 | 99久久久国产精品 | 美人の美乳で授乳プレイ | 狠狠av | 一级黄色片网站 | 欧美日韩成人在线观看 | 久久亚洲国产精品日日av夜夜 |