1. 程式人生 > >簡單常用濾波演算法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;    
}

10.低通數字濾波

解析:

低通濾波也稱一階滯後濾波,方法是第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,則本次值有效, 如果本次值與

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

關注“嵌入式軟體開發學習圈”免費獲取更多學習教程 今天帶著大家學習濾波演算法c語言(九種濾波演算法)實現,以及程式碼,大家可以學習瞭解下。。。。 1.限幅濾波演算法(程式判斷濾波演算法) 方法解析: 根據經驗判斷,確定兩次取樣允許的最

簡單的K-means演算法C語言實現程式碼

K-means演算法是很典型的基於距離的聚類演算法,採用距離作為相似性的評價指標,即認為兩個物件的距離越近,其相似度就越大。該演算法認為簇是由距離靠近的物件組成的,因此把得到緊湊且獨立的簇作為最終目標。 演算法過程如下: 1)從N個樣本隨機選取K個樣本作為質心 2)對剩餘

SHA-1演算法C語言實現

> 程式碼轉載自:https://blog.csdn.net/testcs_dn/article/details/25771377?locationNum=13&fps=1 > 感謝博主分享 #include<stdio.h> void creat_w(uns

頁面置換演算法——最近最久未使用演算法(c語言實現)

作業系統實驗:用C語言程式設計實現最近最久未使用置換演算法(LRU) 最近最久未使用置換演算法(LRU),全稱Least Recently Used,是一種頁面置換演算法。 對於在記憶體中但又不用的資料塊(記憶體塊)叫做LRU,作業系統會根據哪些資料屬於LRU而將其移出記憶體而騰出空間來載入另外

建立雙向連結串列的演算法——C語言實現

建立雙向連結串列的演算法——C語言實現 雙向連結串列也叫雙鏈表,是連結串列的一種,它的每個節點包含兩個指標,分別指向直接後繼和直接前驅(頭節點的前驅指空,尾節點的後繼指空)。所以,從雙向連結串列中的任意一個非前驅非後繼節點開始,都能很方便地訪問它的前驅和後繼節點。 實際上如果熟練掌握了單向連

差分進化演算法 C語言實現

之前的一篇中貼出了自己研究生期間C實現的基本粒子群演算法,執行速度顯然要比其他的高階語言快,這也是各個程式語言之間的差別,現在對於曾經輝煌過的差分進化演算法進行C語言實現。變異策略採用DE/rand/1,這個是最常見的。有錯誤之處請之處。 /***************D

氣泡排序演算法C語言實現

第一部分   排序方法介紹 常用的排序方法:氣泡排序,選擇排序,插入排序及希爾排序等。        氣泡排序是常用的一種排序方法,其基本方法就是逐次比較。即一次比較兩個數,若它們的順序錯誤,則交換;重複進行,知道沒有需要交換為止。 以升序排序為例:        1.

MD5加密演算法C語言實現

md5.h #ifndef MD5_H #define MD5_H typedef struct { unsigned int count[2]; unsigned int state[4]; unsigned char buffe

磁碟排程演算法C語言實現

最短尋道時間優先(SSTF)演算法。要求訪問的磁軌,與當前磁頭所在的磁軌距離最近,以使每次的尋道時間最短。掃描排程(SCAN)演算法。該演算法不僅考慮到欲訪問的磁軌與當前磁軌間的距離,更優先考慮的是磁頭當前的移動方向。例如,當磁頭正在自裡向外移動時,SCAN演算法所考慮的下一

作業排程之先來先服務演算法C語言實現

程式碼如下 /*    @author WellsLiu    @url liuyanzhao.com*/#include"stdio.h"#include"stdlib.h"typedef st

處理機排程演算法C語言實現(註釋得當!!)

/* created by herbert on 10 Nov */ #include <iostream> #include <queue> #include <algorithm> #include <c

最短路徑之Dijkstra演算法 C語言實現

Dijkstra演算法(單源點路徑演算法,要求:圖中不存在負權值邊): 步驟: a.  初始時,S只包含源點,即S={v},v的距離為0。U包含除v外的其他頂點,即: U={其餘頂點},若v與U中頂點u有邊,則u的距離設定為相應的權值,若u v之間不存在邊,則    

一個簡單詞法分析器的C語言實現

1.1實驗描述 例如:對源程式: begin x:=9: if x>9 then x:=2*x+1/3; end # 的原始檔,經過詞法分析後輸出如下序列: <1,begin><10,x><18,:=><11,9><26,;><

SHA-256演算法 C語言實現

#include <stdio.h> #include <stdlib.h> #define SHA256_ROTL(a,b) (((a>>(32-b))&(0x7fffffff>>(31-b)))|(a<<

哈夫曼壓縮演算法C語言實現——步驟,詳細註釋原始碼

哈夫曼壓縮演算法的詳細實現步驟: 1、定義哈夫曼樹節點,用結構體。 2、利用C語言檔案讀寫,統計字元個數。 3、根據字元個數建立哈夫曼樹(不懂haffman資料結構的自己查下資料,我這裡就不再重複了) 4、根據哈夫曼樹為每個出現的字元編碼 5、壓縮:這裡涉及到位操作,用ch

爐石傳說爆牌魚斬殺演算法C語言實現

#include <stdio.h> int main() {     printf("請輸入敵方血量:\n");     int difangxue;     scanf("%d",&difangxue);     printf("請輸入自己血量:

九大排序演算法-C語言實現及詳解

概述 排序有內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。 我們這裡說說八大排序就是內部排序。     當n較大,則應採用時間複雜度為O(nlog2n)的排序方法:快

Dijkstra演算法 c語言實現

 Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。   Dijk