標題: AD數據濾波算法,適用于各種MCU實時數據處理的場合 [打印本頁]
作者: 韋.小.寶 時間: 2018-8-27 09:10
標題: AD數據濾波算法,適用于各種MCU實時數據處理的場合
前面閑來無事,整理了下平時用得比較多的部分MCU濾波算法,當然 代碼網上都有,我只是做了一個搬運工,合并了一些算法,整理成模塊函數,需要用的時候直接調用就可以。
這里簡單介紹包含的內容,詳細代碼和使用說明在附件里。大家可自行查閱。
QQ截圖20180827090759.png (84.41 KB, 下載次數: 75)
下載附件
2018-8-27 09:08 上傳
QQ截圖20180827090823.png (58.44 KB, 下載次數: 62)
下載附件
2018-8-27 09:08 上傳
AD濾波算法函數模塊說明:
一、該模塊包含濾波算法有:中位值濾波、中位值平均濾波、遞推平均濾波、一階滯后濾波。用戶可根據項目不同情況選用不同的濾波算法。
1.1、中位值濾波:連續采樣N次(N取奇數),把N次采樣值按大小排列,取中間值為本次有效值。適用范圍能有效克服因偶然因素引起的波動干擾,對溫度、液位的變化緩慢的被測參數有良好的濾波效果。不過對流量、速度等快速變化的參數不宜。
1.2、中位值平均濾波:連續采用N個數據,去掉一個最大值和一個最小值,然后計算N-2個數據的算術平均值。適用范圍:對應偶然出現的脈沖性干擾,可消除由于脈沖干擾所引起的采樣值偏差。但是測量速度較慢, 比較浪費RAM。
1.3遞推平均濾波:把連續取N個采樣值看成一個隊列,隊列的長度固定為N,每次采樣到一個新數據放入隊尾,并扔掉原來隊首的一次數據,把隊列中得N個數據進行算術平均運算,就可以獲得新的濾波結果。
適用范圍:對周期性干擾有良好的抑制作用,平滑度高,適用于高頻振蕩的系統。缺點是靈敏度低,對偶然出現的脈沖性干擾的抑制作用較差,不易消除由于脈沖干擾所引起的采樣值偏差,不適用于脈沖干擾比較嚴重的場合。
1.4、一階滯后濾波:對周期性干擾具有良好的抑制作用,適用于波動頻率較高得場合。缺點就是相位滯后,靈敏度低,滯后程度取決于a的大小,不能消除濾波頻率高于采樣頻率1/21/2的干擾信號。本次濾波結果result=(1-a)*本次采樣值+a*上次值。a=(0~1)
二、濾波函數
2.1、中位值/中位值平均濾波函數
函數名:FILTER_median(TYPE_STATE Flag)
輸入值:Flag:選擇中位值濾波或中位值平均濾波
ON:中位值平均濾波 OFF:中位值濾波
返回值:濾波結果
2.2、遞推平均濾波函數
函數名:FILTER_recursive()
輸入值:無
返回值:sum:濾波結果
2.3、一階滯后濾波函數
函數名:FILTER_firstorder()
輸入值:無
返回值:value:濾波結果
備注:在干電池剩余電量檢測中,經過測試對比數據,使用中位值平均濾波算法比較合適。數據整體表現平穩,靈敏度較高,脈沖干擾直接濾除。測試數據如下:
單片機源程序如下:
- /*********************************************************
- *文件名: filter.h
- *日 期: 2018/7/26
- *描 述: AD濾波算法函數頭文件
- *備 注:
- **********************************************************/
- #ifndef __FILTER_H__
- #define __FILTER_H__
- //typedef unsigned char uint8_t;
- //typedef unsigned short int uint16_t;
- //typedef unsigned int uint32_t;
- //typedef unsigned __int64 uint64_t;
- typedef enum {OFF = 0x0, ON = 0x1} TYPE_STATE;
- extern unsigned short int meanvalue; // ADC值聲明 meanvalue根據情況改變
- #define AD_VALUE meanvalue // ADC采集值 meanvalue根據情況改變可直接宏定義AD函數
- #define A 50 // 一階滯后濾波系數
- #define N 9 // 采樣次數 不同的濾波方法取值不同
- #define TIME 300 //AD讀取延時,等待AD采集完成 大致夠AD采集時間即可
- /******** 函******* 數 ******* 聲 ******* 明 ********/
- unsigned short int FILTER_limit(void); //限幅濾波
- unsigned short int FILTER_median(TYPE_STATE Flag); //中位值濾波 中位值平均濾波 Flag:中位值平均濾波使能
- unsigned short int FILTER_recursive(void); //遞推平均濾波
- unsigned short int FILTER_firstorder(void); //一階滯后濾波
- #endif
復制代碼
0.png (43.75 KB, 下載次數: 69)
下載附件
2018-8-27 16:35 上傳
所有資料51hei提供下載:
濾波算法.rar
(43.04 KB, 下載次數: 258)
2018-8-27 09:09 上傳
點擊文件名下載附件
包含c文件、頭文件和說明文檔
下載積分: 黑幣 -5
作者: JyChal 時間: 2019-4-21 10:32
好東西啊,多謝樓主分享
作者: JyChal 時間: 2019-4-21 10:41
這些濾波算法確實挺適合單片機使用,簡單方便,哈,謝謝樓主分享
作者: songster 時間: 2019-4-21 18:35
可以的,碼農的搬運工,學習了,正好最近在學習32的AD數據采集
作者: irisice008 時間: 2019-5-17 21:16
非常好的資料,多謝樓主分享
作者: jxchen 時間: 2019-5-19 19:38
THANSK ~~~~~~~~~~~~
作者: kudar 時間: 2019-5-23 12:51
正是我需要的,謝謝。
作者: wdliming 時間: 2019-9-14 22:48
謝謝分享~~
作者: leo2002zhang 時間: 2019-9-16 10:30
謝謝樓主,不錯。以前AD數據都沒有考慮濾波。。。
作者: waerdeng 時間: 2019-9-16 18:54
東西比較豐富,大家保存備用
作者: eee123 時間: 2019-10-8 11:07
大自然的搬運工
作者: jianfeii 時間: 2019-10-9 09:24
這個寫法比較基礎,用結構體寫的話會更好用一些
作者: cici8718 時間: 2019-11-7 16:34
謝謝分享
作者: cici8718 時間: 2019-11-7 16:39
學習了,之前只做了中值平均濾波
作者: 肥佬的黑貓 時間: 2019-11-9 11:36
謝謝大佬的分享
作者: pmsjzj 時間: 2019-12-7 10:43
好東西,感謝分享
作者: aking991 時間: 2019-12-7 14:39
源碼中有幾處帶問號“?”的應是什么?
num=num<N?num:N;
value = (value==0)?AD_VALUE:value; // 三目運算,避免第一次采樣value值為0
作者: wubangdi 時間: 2020-4-15 15:16
謝謝分享~~
作者: 神出沒 時間: 2020-4-16 10:58
不錯,每天來逛逛,下載點資料
作者: jack2dawn 時間: 2020-4-30 11:30
不錯,值得參考
作者: 天道hs 時間: 2020-6-16 19:53
感謝樓主分享
| 歡迎光臨 (http://www.denmoz.com/bbs/) |
Powered by Discuz! X3.1 |