簡單常用濾波演算法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
4.遞推平均濾波(滑動平均濾波法)#define N 12 char filter() { int sum = 0; for ( count=0;count<N;count++) { sum + = get_ad(); delay(); } return (char)(sum/N);
方法解析:
把連續取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
10個重要的演算法C語言實現原始碼:拉格朗日,牛頓插值,高斯,龍貝格,牛頓迭代,牛頓-科特斯,雅克比,秦九昭,冪法,高斯塞德爾
(一)拉格朗日插值多項式 #include <stdio.h> #include <conio.h> #include <alloc.h> &n
磁碟排程演算法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