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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4479|回復: 0
打印 上一主題 下一主題
收起左側

下位機_平均值濾波之-鬼斧神工算法(平均值濾波之經典形式改進)

[復制鏈接]
跳轉到指定樓層
樓主
ID:90014 發表于 2015-9-15 15:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在十種經典軟件濾波算法中,可以看到很多算法都是平均值濾波算法變種,事實上最常用的也還是平均值濾波算法。但傳統的平均值濾波算法很占內存,每次運算都要求累加和,再求平均值,導致運算效率不高。
 今天介紹一種超簡潔超高效的平均濾波算法,此算法是以前搞單片機時一老師所創(單片機上的內存簡直是寸土寸金),僅僅用三個變量,就完成了平均值濾波的計算。剛開始看到這個算法是只覺得很佩服,后來用了各種各樣的算法后,才感到此算法簡直到了鬼斧神工的地步(別以為看完后覺得太簡單沒啥大不了的,正是因為太簡單才突出了它的了不起,最開始能想到將一個復雜的算法簡化到無法再簡的地步非一般功力所能做到的)。
  
 在該基礎上,我們再演變出一種帶死區和限幅控制的隊列平均值實用算法。
 采樣值 C、累加器 S,平均值 A,采樣次數 N
  
 傳統的平均值濾波算法:
 S = C(1) + C(2) + ... + C(N)
 A = S / N
 需要用循環來計算累加和,比較耗時,C(1~N)是緩存,隨采樣數N增大,所需內存量也增大
  
 向隊列平均值算法推進:
 S = C(1) + C(2) + ... + C(N) (第一次)
 C(x) = C(x + 1) (隊列前移)
 C(N) = C
 S = S - C(1) + C(N)
 A = S / N
 運算量有所改進(用指針維護循環隊列,不實際移動數據),占用內存問題不變
  
 鬼斧神工算法:
 初始化:A=初始值,S=A*N
 S = S - A + C
 A = S / N
 就這么簡單,三個變量(N可以是常數),只要 S 的量程足夠,N可以任意調整。
 可以看出,此算法是從隊列平均值算法演變而來,因沒有了隊列,每次計算時不知道該丟棄的最老的一個采樣值是多少,這里用了個替代的辦法,丟棄上次計算出的平均值。
 去掉了緩存維護,節省內存空間,同時也將運算量壓縮到了最小,執行效率非常高。調試時容易修改采樣數。
  
 優化算法:
 此算法的核心思想還是平均值濾波,雖然改進了運算量和內存占用,但同樣繼承了平均值濾波法 N 值較大時平滑度好,反應遲鈍的特點。
 為此,對算法引入 S7-200 系統濾波程序中死區的概念:采樣值偏差在死區范圍內時,進行濾波計算,采樣值偏差在死區范圍以外時直接使用采樣值,達到快速反應的效果。
 再溶合限幅濾波法去掉偶然的干擾脈沖:采樣值偏差在限幅范圍內時,進行濾波計算,采樣值偏差在限幅范圍以外時直接丟棄,使用上次濾波輸出值。顯然,限幅值應該大于死區值。
  
 將此算法寫成兩個子函數(也可以做成庫)
 ① 主濾波程序 AveFilter
 
 
  入口參數:
  EN  : 調用使能位
  bType :采樣值類型,'W'=整型、'F'=浮點型、'D'(或其它)=長整型,參數類型:字節
  wHi : 采樣值高位字(采樣值為整型是,實參必須為0),參數類型,2字節
  wLo : 采樣值低位字,參數類型,2字節
  rDie : 濾波死區,參數類型:浮點數
  rMaxErr : 最大允許偏差,參數類型:浮點數
  rLen :濾波隊列長度,參數類型:浮點數
 出/入口參數:
  rSum :累加和,參數類型:浮點數
  rAve :濾波輸出平均值,參數類型:浮點數
 命令行:CALL   AveFilter, 'W', 0, SMW28, 640.0, 32000.0, 4.0, VD0, VD4
  
 注意:本程序采樣值是參數類型可適應的,用 wHi/wLo 的組合來適應整型、長整型、浮點型的參數類型輸入,避免使用多個相同的子程序來適應不同類型的輸入參數。由 bType 來指定輸入的參數類型。
  
 ②濾波器初始化程序 InitFilter
 
  
 入口參數:
  EN  : 調用使能位
  rInit :初始值(一般為0),參數類型:浮點數
  rLen : 濾波隊列長度,參數類型:浮點數
 出/入口參數:
  rSum :累加和,參數類型:浮點數
  rAve :濾波輸出平均值,參數類型:浮點數
  命令行:CALL   InitFilter, 0.0, 4.0, VD0, VD4






十種經典軟件濾波算法中,可以看到很多算法都是平均值濾波算法變種,事實上最常用的也還是平均值濾波算法。但傳統的平均值濾波算法很占內存,每次運算都要求累加和,再求平均值,導致運算效率不高。
今天介紹一種超簡潔超高效的平均濾波算法,此算法是以前搞單片機時一老師所創(單片機上的內存簡直是寸土寸金),僅僅用三個變量,就完成了平均值濾波的計算。剛開始看到這個算法是只覺得很佩服,后來用了各種各樣的算法后,才感到此算法簡直到了鬼斧神工的地步(別以為看完后覺得太簡單沒啥大不了的,正是因為太簡單才突出了它的了不起,最開始能想到將一個復雜的算法簡化到無法再簡的地步非一般功力所能做到的)。
在該基礎上,我們再演變出一種帶死區和限幅控制的隊列平均值實用算法。采樣值 C、累加器 S,平均值 A,采樣次數 N;
傳統的平均值濾波算法
S = C(1) + C(2) + ... + C(N)
A = S / N
需要用循環來計算累加和,比較耗時,C(1~N)是緩存,隨采樣數N增大,所需內存量也增大
 
向隊列平均值算法推進
S = C(1) + C(2) + ... + C(N) (第一次)
C(x) = C(x + 1) (隊列前移)
C(N) = C
S = S - C(1) + C(N)
A = S / N
運算量有所改進(用指針維護循環隊列,不實際移動數據),占用內存問題不變
 
鬼斧神工算法
初始化:A=初始值,S=A*N
            S = S - A + C(i)  i從第二個起,不算A
            A = S / N
就這么簡單,三個變量(N可以是常數),只要 S 的量程足夠,N可以任意調整。
可以看出,此算法是從隊列平均值算法演變而來,因沒有了隊列,每次計算時不知道該丟棄的最老的一個采樣值是多少,這里用了個替代的辦法,丟棄上次計算出的平均值。
去掉了緩存維護,節省內存空間,同時也將運算量壓縮到了最小,執行效率非常高。調試時容易修改采樣數。
優化算法
此算法的核心思想還是平均值濾波,雖然改進了運算量和內存占用,但同樣繼承了平均值濾波法 N 值較大時平滑度好,反應遲鈍的特點。
為此,對算法引入 S7-200 系統濾波程序中死區的概念:采樣值偏差在死區范圍內時,進行濾波計算,采樣值偏差在死區范圍以外時直接使用采樣值,達到快速反應的效果。
再溶合限幅濾波法去掉偶然的干擾脈沖:采樣值偏差在限幅范圍內時,進行濾波計算,采樣值偏差在限幅范圍以外時直接丟棄,使用上次濾波輸出值。顯然,限幅值應該大于死區值。
將此算法寫成兩個子函數(也可以做成庫)
① 主濾波程序 AveFilter
入口參數:

 EN  : 調用使能位
 bType :采樣值類型,'W'=整型、'F'=浮點型、'D'(或其它)=長整型,參數類型:字節
 wHi : 采樣值高位字(采樣值為整型是,實參必須為0),參數類型,2字節
 wLo : 采樣值低位字,參數類型,2字節
 rDie : 濾波死區,參數類型:浮點數
 rMaxErr : 最大允許偏差,參數類型:浮點數
 rLen :濾波隊列長度,參數類型:浮點數
出/入口參數:
 rSum :累加和,參數類型:浮點數
 rAve :濾波輸出平均值,參數類型:浮點數
命令行:CALL   AveFilter, 'W', 0, SMW28, 640.0, 32000.0, 4.0, VD0, VD4
注意:本程序采樣值是參數類型可適應的,用 wHi/wLo 的組合來適應整型、長整型、浮點型的參數類型輸入,避免使用多個相同的子程序來適應不同類型的輸入參數。由 bType 來指定輸入的參數類型。

常用軟件濾波方法及其示例程序 http://www.zg4o1577.cn/bbs/dpj-38875-1.html

防脈沖干擾移動平均值法數字濾波器的C語言算法及其實現

在許多的數據采集系統中,現場的強電設備較多,不可避免地會產生尖脈沖干擾,這種干擾一般持續時間短,峰值大,對這樣的數據進行數字濾波處理時,僅僅采用算術平均或移動平均濾波時,盡管對脈沖干擾進行了1/n的處理,但,其剩余值仍然較大。
      這種場合最好的策略是:將被認為是受干擾的信號數據去掉,這就是防脈沖干擾平均值濾波法的原理
 防脈沖干擾平均值濾波法的算法是:對連續的n個數據進行排序,去掉其中最大和最小的2個數據,將剩余數據示平均值。

      在一般8051單片機的應用中為了加快數據處理速度,n可以取值6。 而對于具有較快速度的處理器,則n值可以適當取大一些。但最好是 n=2^k+2, k為整數,因為這樣在求平均值average=SUM/(n-2)=SUM/2^k時,可以寫成average=SUM>>k,用移位的方法,可以加快處理速度
   
      上述算法顯然還存在一個不足之處,就是每采集一個數據就要進行一次排序,這樣會大量占用系統寶貴的時間。這可以通過存儲當前數據中的最大值和最小值來改進。具體做法是:系統中用兩個變量來存儲當前n個數據的最大值和最小值在這個數組中的偏移量(也就是數組下標,存儲數組下標而直接不存儲數據本身是因為:在一般的系統中,n不會超無符號短整形的表示范圍,因此用一個char形變量就可以存儲了而如果直接存儲數據本身,則許多情況下要用int形變量,甚至更長的類型)。這樣只要在當前輸入的數據將要覆蓋的數據正好是當前的最大值或最小值時才在下個數組中查找最大值或最小值,而其他情況下則只要將輸入的數據與最大值和最小值比較就可以修改下最大值和最小值了,而且不用進行數據排序。

     這個算法很簡單,下面是對應的C語言代碼實現,可以很方便的應用的具體的51單片機或其他處理器上,只須做少量的修改。

 #include"stdio.h"
#define dtype unsigned int // 采集數據的數據類型
#define uint8 char

#define LEN  6   //移動算術平均的個數+2=SHIFT<<2+2
#define SHIFT 2   //2^SHIFT

uint8 pdata;    //移動指針
uint8 pmax,pmin;   //記錄數據表中最大值和最小值的位置,在一般的數據采集系統中,數據的長度>=8,因此用指針記錄而不是直接記錄最大值和最小值
dtype datas[LEN];

dtype szlb(dtype _data)
{  
/****************************/
/* 在調用此子程序前必須對 pdata,datas[]數組,  pmax,pmin進行初始化  */
/****************************/

 uint8 i;
 dtype average=0;  //清零,用來計算平均值
 pdata=(pdata+1)%LEN; //指針下標在0到LEN-1上滑動
 datas[pdata]=_data;  //采樣所得數據存入數據表中
 for(i=0;i<LEN;i++)
         average+=datas[i]; //求所有數據總和

/*******去除被認為是脈沖的數據******/
 if(_data>datas[pmax])
      pmax=pdata;   //得到最大值的指針
 else if(_data<datas[pmin])
      pmin=pdata;   //得到最小值的指針
 if(pdata==pmax)   //如果當前輸入值將存入當前最大值的位置時
 {      //由以上方法將不可行,必須從其他位置中查找極值
      for(i=0;i<LEN;i++)
          if(datas[i]>datas[pmax])
          pmax=i;
 }
 else if(pdata==pmin)//如果當前輸入值將存入當前最大值的位置時
 {      //由以上方法將不可行,必須從其他位置中查找極值
     for(i=0;i<LEN;i++)
          if(datas[i]<datas[pmin])
           pmin=i;
 }
 average=average-datas[pmax]-datas[pmin];//減去脈沖

 return (average>>SHIFT);    //求算術平均值
}

/******以下是在VC++6.0環境下運行的測試程序**/

/***通過手動輸入來模擬數據采集過程****/

void main()
{
 uint8 i;
 dtype _data;
 pdata=0;
 pmax=0;
 pmin=0;
 for(i=0;i<LEN;i++)
   datas[i]=0;
 printf("數據:                          最大       最小/n");
 while(1)
 {
      scanf("%u",&_data);
      szlb(_data);
      for(i=0;i<LEN;i++)
      printf("%-3u  ",datas[i]);
      printf("    %-3u      %-3u",datas[pmax],datas[pmin]);
      printf("/n");
 }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人午夜免费网站 | 国产精品日日摸夜夜添夜夜av | 高清一区二区三区 | 99久久免费精品视频 | 国产视频福利 | 日韩欧美在线免费观看 | 成人日批视频 | 午夜影院在线观看 | 国产 日韩 欧美 制服 另类 | 中文精品视频 | 美女黄网站 | 亚洲国产成人精品一区二区 | 国产视频欧美 | 久久久久久久久综合 | 免费黄色在线观看 | 精品欧美一区二区三区久久久 | 日韩欧美在 | 黄色在线免费观看 | 性高湖久久久久久久久 | 亚洲国产日本 | 国产日韩一区二区三免费 | 黄色免费在线网址 | 中文字字幕一区二区三区四区五区 | 丁香婷婷综合激情五月色 | 全部免费毛片在线播放网站 | 亚洲综合免费 | 中文字幕日韩欧美一区二区三区 | 国产精品无码久久久久 | 高清久久久 | 成人片网址 | 欧美激情久久久 | 国产日韩一区二区三免费高清 | 男女黄网站 | 97国产一区二区精品久久呦 | 9色网站 | 久久久精品一区二区 | 99在线国产| 一区二区三区中文字幕 | 亚洲国产午夜 | 久久精品一区二区 | www.亚洲一区 |