在感測器採集資料的過程中,難免因為各種各樣的干擾產生異常值,濾波分為電路濾波和演算法濾波。電路濾波是從源頭上解決(緩解)問題,但是使用成本比較高,即使使用了電路濾波也是不能保證每次採集的資料都是準確的,因為在實際的工作狀態中遇到的干擾各種各樣,演算法濾波的成本比較低,基本思想是採集多次資料對這些採集的資料進行處理最後選擇(或計算)出乙個可靠的資料放入資料庫,要注意演算法濾波需要建立在電路濾波的基礎上,因此將兩者結合起來才能夠保證每次寫入資料庫的資料是可靠的。
a、思路: 根據經驗判斷,確定兩次取樣允許的最大偏差值(設為a),每次檢測到新值時判斷:如果本次值與上次值之差<=a,則本次值有效,如果本次值與上次值之差》a,則本次值無效,放棄本次值,用上次值代替本次值。
b、優點: 能有效克服因偶然因素引起的脈衝干擾。
c、缺點: 無法抑制那種週期性的干擾。 平滑度差。
int filter_value;
int value;
void setup()
void loop()
// 用於隨機產生乙個300左右的當前值
int get_ad()
// 限幅濾波法(又稱程式判斷濾波法)
#define filter_a 1
int filter()
a、方法:
連續取樣n次(n取奇數),把n次取樣值按大小排列,
取中間值為本次有效值。
b、優點:
能有效克服因偶然因素引起的波動干擾;
對溫度、液位的變化緩慢的被測引數有良好的濾波效果。
c、缺點:
對流量、速度等快速變化的引數不宜。
int filter_value;
void setup()
void loop()
// 用於隨機產生乙個300左右的當前值
int get_ad()
// 中位值濾波法
#define filter_n 101
int filter()
// 取樣值從小到大排列(冒泡法)
for(j = 0; j < filter_n - 1; j++)
}} return filter_buf[(filter_n - 1) / 2];
}
a、方法:
連續取n個取樣值進行算術平均運算:
n值較大時:訊號平滑度較高,但靈敏度較低;
n值較小時:訊號平滑度較低,但靈敏度較高;
n值的選取:一般流量,n=12;壓力:n=4。
b、優點:
適用於對一般具有隨機干擾的訊號進行濾波;
這種訊號的特點是有乙個平均值,訊號在某一數值範圍附近上下波動。
c、缺點:
對於測量速度較慢或要求資料計算速度較快的實時控制不適用;
比較浪費ram。
int filter_value;
void setup()
void loop()
// 用於隨機產生乙個300左右的當前值
int get_ad()
// 算術平均濾波法
#define filter_n 12
int filter()
return (int)(filter_sum / filter_n);
}
a、方法:
取a=0-1,本次濾波結果=(1-a)本次取樣值+a上次濾波結果。
b、優點:
對週期性干擾具有良好的抑制作用;
適用於波動頻率較高的場合。
c、缺點:
相位滯後,靈敏度低;
滯後程度取決於a值大小;
不能消除濾波頻率高於取樣頻率1/2的干擾訊號。
int filter_value;
int value;
void setup()
void loop()
// 用於隨機產生乙個300左右的當前值
int get_ad()
// 一階滯後濾波法
#define filter_a 0.01
int filter()
a、方法:
相當於「限幅濾波法」+「消抖濾波法」;
先限幅,後消抖。
b、優點:
繼承了「限幅」和「消抖」的優點;
改進了「消抖濾波法」中的某些缺陷,避免將干擾值匯入系統。
c、缺點:
對於快速變化的引數不宜。
int filter_value;
int value;
void setup()
void loop()
// 用於隨機產生乙個300左右的當前值
int get_ad()
// 限幅消抖濾波法
#define filter_a 1
#define filter_n 5
int i = 0;
int filter()
} else
i = 0;
return value;
}
五大常用演算法
主要是演算法演算法的複雜度 1.分治法 話說遞迴與hanoi塔 二分法求方程近似解 用c 實現合併排序 求最大值和最小值的分治演算法 2.動態規劃法 動態規劃求0 1揹包問題 最長公共子串問題的實現 用動態規劃實現飛彈攔截 最大化投資回報問題的實現 3.貪心演算法 最小生成樹之prim演算法 最小生...
redis的五大基礎型別及使用場景
1 string redis的string型別到底存的是什麼?redis的儲存是二進位制安全的,不管什麼型別的資料,都會轉換成二進位制數字節組進行儲存,當取資料時,取出來的也是二進位制位元組陣列,然後在客戶端對陣列進行轉換。資料的長度是位元組長多,如 k1 99,長度就是2,k2 a,的長度就是1....
演算法之五大查詢演算法
五大經典查詢演算法 線性查詢,通過 遍歷,乙個乙個比較 核心演算法 順序查詢 public static int orderlookup int list,int key return 1 折半查詢 只能用於有順序的陣列 將需要查詢的數與陣列的中值進行比較,若小於,right指標左移,大於則右移,每...