資源簡介
在嵌入式開發中經常會用到一些濾波算法,我整理了一些資料把這些算法封裝成可以直接調用的函數,方便以后的開發,包括限幅濾波、中位值濾波法、 算術平均濾波法、一階滯后濾波法、加權遞推平均濾波法、消抖濾波法 ,其他的一些包括卡爾曼濾波什么的之后有機會再整理
代碼片段和文件信息
#include?“filter.h“
/*
限幅濾波
A方法:?根據經驗判斷,確定兩次采樣允許的最大偏差值(設為A),每次檢測到新值時判斷:?如果本次值與上次值之差<=A,則本次值有效,如果本次值與上次值之差>A,則本次值無效,放棄本次值,用上次值代替本次值。
B優點:?能有效克服因偶然因素引起的脈沖干擾。
C缺點:?無法抑制那種周期性的干擾,平滑度差。
A值可根據實際情況調整
value為有效值,new_value為當前采樣值
濾波程序返回有效的實際值
*/
#define?DEVIATION??10
float?limit_filter(float?new_value)
{
????static?float?value?=?20.0;??//需要賦一個初值
????if?(?(?new_value?-?value?>?DEVIATION?)?||?(?value?-?new_value?>?DEVIATION?))
????????return?value;
????return?new_value;
}
/*
中位值濾波法
A方法:?取之前采樣的N次(N取奇數),把N次采樣值按大小排列,取中間值為本次有效值。
B優點:?能有效克服因偶然因素引起的波動干擾,對溫度、液位的變化緩慢的被測參數有良好的濾波效果。
C缺點:?對流量、速度等快速變化的參數不宜。
????排序采用冒泡法?只需要移動最后一個元素即可
*/
#define?MIDDLE_FILTER_N??11
float?middle_filter(?float?new_value)
{
????static?float?value_buf[MIDDLE_FILTER_N];
????float?temp?;
????uint8_t?count?i;
????for?(?count?=?0;?count?????{
????????value_buf[count]?=?value_buf[count?+?1]?;
????}
????value_buf[MIDDLE_FILTER_N?-?1]?=?new_value;
????for?(i?=?MIDDLE_FILTER_N;?i?>?0?;?i?--)
????{
????????if?(?value_buf[i]?????????{
????????????temp?=?value_buf[i];
????????????value_buf[i]?=?value_buf[i?-?1];
????????????value_buf[i?-?1]?=?temp;
????????}
????}
????return?value_buf[(MIDDLE_FILTER_N?-?1)?/?2];
}
/*
???算術平均濾波法
A方法:?連續取N個采樣值進行算術平均運算,N值較大時:信號平滑度較高,但靈敏度較低;N值較小時:信號平滑度較低,但靈敏度較高。N值的選取:一般流量,N=12;壓力:N=4。
B優點:?適用于對一般具有隨機干擾的信號進行濾波,這樣信號的特點是有一個平均值,信號在某一數值范圍附近上下波動。
C缺點:?對于測量速度較慢或要求數據計算速度較快的實時控制不適用,比較浪費RAM?。
???無需每次求一編所有的和,減去第一個數據加上新數據
*/
#define?AVERAGE_N?12
float?average_filter(float?new_value)
{
????static?float?average_value_buf[AVERAGE_N];
????static??float?average_sum?=?0;
????uint8_t?count;
????average_sum?-=?average_value_buf[0];
????for?(?count?=?0;?count?????{
????????average_value_buf[count]?=?average_value_buf[count?+?1]?;
????}
????average_value_buf[AVERAGE_N?-?1]?=?new_value;
????average_sum?+=?average_value_buf[11];
????return?(ave
評論
共有 條評論