久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12220|回復: 20
收起左側

AD數據濾波算法,適用于各種MCU實時數據處理的場合

  [復制鏈接]
ID:390280 發表于 2018-8-27 09:10 | 顯示全部樓層 |閱讀模式
前面閑來無事,整理了下平時用得比較多的部分MCU濾波算法,當然 代碼網上都有,我只是做了一個搬運工,合并了一些算法,整理成模塊函數,需要用的時候直接調用就可以。
這里簡單介紹包含的內容,詳細代碼和使用說明在附件里。大家可自行查閱。 QQ截圖20180827090759.png QQ截圖20180827090823.png

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:濾波結果
備注:在干電池剩余電量檢測中,經過測試對比數據,使用中位值平均濾波算法比較合適。數據整體表現平穩,靈敏度較高,脈沖干擾直接濾除。測試數據如下:

單片機源程序如下:
  1. /*********************************************************
  2. *文件名:  filter.c
  3. *日  期:  2018/7/26
  4. *描  述:  AD濾波算法函數集合
  5. *備  注:  
  6. **********************************************************/
  7. #include "filter.h"
  8. /*************************************
  9.   函數名:Delay
  10.   描  述:軟件延時
  11.   輸入值:ncount :延時時長
  12.   返回值:無
  13. **************************************/
  14. void Delay(unsigned short int ncount)
  15. {
  16.   for(; ncount != 0; ncount--);
  17. }


  18. /*
  19. uint16_t FILTER_limit()                                        //限幅濾波  A為兩次采樣最大偏差值
  20. {
  21.   uint16_t new_value=0,value=0;

  22.   new_value = AD_VALUE;

  23.   if ( ( new_value - value > A ) || ( value - new_value > A ) )
  24.                 return value;
  25.   else
  26.                 return new_value;

  27. }
  28.         
  29. */        
  30.         
  31. /*****************************************************
  32.   函數名:FILTER_median
  33.   描  述:中位值濾波:連續采樣N次(N取奇數),
  34.         把N次采樣值按大小排列,取中間值為本次有效值。
  35.         適用范圍能有效克服因偶然因素引起的波動干擾,
  36.         對溫度、液位的變化緩慢的被測參數有良好的濾波效果。
  37.         不過對流量、速度等快速變化的參數不宜。
  38.         
  39.   中位值平均濾波:連續采用N個數據,去掉一個最大值
  40.         和一個最小值,然后計算N-2個數據的算術平均值。
  41.         適用范圍:對應偶然出現的脈沖性干擾,可消除由于脈沖
  42.         干擾所引起的采樣值偏差。但是測量速度較慢, 比較浪費RAM。
  43.         
  44.   輸入值:Flag:選擇中位值濾波或中位值平均濾波
  45.           ON:中位值平均濾波  OFF:中位值濾波
  46.   返回值:濾波結果
  47.         備注:中位值濾波:N取奇數,N=2^x次方+1 為宜
  48.                                 中位值平均濾波:N=2^x次方+2 為宜
  49. ******************************************************/
  50. unsigned short int FILTER_median(TYPE_STATE Flag)        //中位值濾波   中位值平均濾波  N為采樣次數,取奇數  Flag:中位值平均濾波使能
  51. {
  52.                 unsigned short int value_buf[N],temp=0;                        
  53. #if(Flag)
  54.                 unsigned short int sum=0;
  55. #endif
  56.                 unsigned char count,i,j;
  57.                
  58.                 for (count=0;count<N;count++)
  59.                         {
  60.                                 value_buf[count] = AD_VALUE;
  61.                                 Delay(300);                                                                                                //等待AD轉換
  62.                         }
  63.                         
  64.                 for(j=0;j<N-1;j++)                                                                          //排序
  65.                         {
  66.                                 for(i=0;i<N-j-1;i++)        
  67.                                         {
  68.                                                 if ( value_buf[i] > value_buf[i+1] )
  69.                                                         {
  70.                                                                 temp =        value_buf[i];
  71.                                                                 value_buf[i] = value_buf[i+1];
  72.                                                                 value_buf[i+1] = temp;
  73.                                                         }
  74.                                         }
  75.                         }
  76. #if(Flag)
  77.                 for(count=1;count<N-1;count++)                                //中位求平均 由Flag標志控制
  78.                         sum+=value_buf[count];
  79.                         return (uint16_t)(sum/(N-2));
  80. #endif
  81.                 return value_buf[(N-1)/2];                                                //中位值
  82. }



  83. /***************************************************
  84.   函數名:FILTER_recursive
  85.   描  述:遞推平均濾波:把連續取N個采樣值看成一個隊列,
  86.         隊列的長度固定為N,每次采樣到一個新數據放入隊尾,并
  87.         扔掉原來隊首的一次數據,把隊列中得N個數據進行算術平
  88.         均運算,就可以獲得新的濾波結果。
  89.         適用范圍:對周期性干擾有良好的抑制作用,平滑度高,
  90.         適用于高頻振蕩的系統。缺點是靈敏度低,對偶然出現的
  91.         脈沖性干擾的抑制作用較差,不易消除由于脈沖干擾所引
  92.         起的采樣值偏差,不適用于脈沖干擾比較嚴重的場合
  93.   輸入值:無
  94.   返回值:sum:濾波結果
  95.         備注:N=2^x次方 為宜
  96. ***************************************************/
  97. unsigned short int FILTER_recursive()                                        //遞推平均濾波  N為隊列長度
  98. {
  99.         unsigned short int sum=0;
  100.         unsigned char count=0;
  101.         static unsigned char i=0,num=0;
  102.         static unsigned short int value_temp[N];
  103.         do{
  104.         if(i<N)                                                                                                        //每次采樣到一個新數據放入隊尾,并扔掉原來隊首的一次數據。(先進先出原則)
  105.         {                                                                                                                                //把隊列中的N個數據進行算術平均運算,就可獲得新的濾波結果
  106.                 value_temp[i] = AD_VALUE;
  107.                 i++;
  108.                 i=(i==N)?0:i;                                                                        //三目運算 i清零
  109.         }
  110.         num++;
  111.         num=num<N?num:N;
  112. }while(num<N);
  113.         for(count=0;count<N;count++)               
  114.                 sum += value_temp[count];
  115.       
  116.         sum = sum/N;        
  117.         return sum;
  118. }



  119. /*****************************************************************
  120.   函數名:FILTER_firstorder
  121.   描  述:一階滯后濾波:取a=(0,1)
  122.         本次濾波結果result=(1-a)*本次采樣值+a*上次值
  123.         對周期性干擾具有良好的抑制作用,
  124.         適用于波動頻率較高得場合。缺點就是相位滯后,靈敏度低,
  125.         滯后程度取決于a的大小,不能消除濾波頻率高于采樣頻率1/21/2的干擾信號
  126.   輸入值:無
  127.   返回值:value:濾波結果
  128.         備注:A取值0——100 A值越小,濾波結果越平穩,但是靈敏度越低
  129.                                                                                  A值越大,靈敏度越高,但是濾波結果越不穩定
  130. *****************************************************************/
  131. unsigned short int FILTER_firstorder()                                        //一階滯后濾波,A取值0——100  
  132. {                                                                                                                                                        
  133.         static unsigned short int value=0;                                                
  134.         unsigned short int new_value;
  135.         value = (value==0)?AD_VALUE:value;        // 三目運算,避免第一次采樣value值為0
  136.         new_value = AD_VALUE;                                                               
  137.         
  138.         value = (100-A)*value/100 + A*new_value/100;
  139.         return value;
  140. }
復制代碼

  1. /*********************************************************
  2. *文件名:  filter.h
  3. *日  期:  2018/7/26
  4. *描  述:  AD濾波算法函數頭文件
  5. *備  注:  
  6. **********************************************************/
  7. #ifndef __FILTER_H__
  8. #define __FILTER_H__

  9. //typedef unsigned          char uint8_t;
  10. //typedef unsigned short     int uint16_t;
  11. //typedef unsigned           int uint32_t;
  12. //typedef unsigned       __int64 uint64_t;

  13. typedef enum {OFF = 0x0, ON = 0x1} TYPE_STATE;


  14. extern unsigned short int meanvalue;                                //        ADC值聲明 meanvalue根據情況改變

  15. #define  AD_VALUE          meanvalue                //        ADC采集值 meanvalue根據情況改變可直接宏定義AD函數
  16. #define A 50                                                                                // 一階滯后濾波系數
  17. #define N 9                                                                                // 采樣次數 不同的濾波方法取值不同
  18. #define TIME        300                                                        //AD讀取延時,等待AD采集完成 大致夠AD采集時間即可

  19. /******** 函******* 數 ******* 聲 ******* 明 ********/
  20. unsigned short int FILTER_limit(void);                  //限幅濾波
  21. unsigned short int FILTER_median(TYPE_STATE Flag);                  //中位值濾波   中位值平均濾波 Flag:中位值平均濾波使能
  22. unsigned short int FILTER_recursive(void);        //遞推平均濾波
  23. unsigned short int FILTER_firstorder(void);        //一階滯后濾波

  24. #endif

復制代碼

0.png

所有資料51hei提供下載:
濾波算法.rar (43.04 KB, 下載次數: 258)

評分

參與人數 2黑幣 +55 收起 理由
hzd530 + 5 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:517610 發表于 2019-4-21 10:32 | 顯示全部樓層
好東西啊,多謝樓主分享
回復

使用道具 舉報

ID:517610 發表于 2019-4-21 10:41 | 顯示全部樓層
這些濾波算法確實挺適合單片機使用,簡單方便,哈,謝謝樓主分享
回復

使用道具 舉報

ID:225960 發表于 2019-4-21 18:35 | 顯示全部樓層
可以的,碼農的搬運工,學習了,正好最近在學習32的AD數據采集
回復

使用道具 舉報

ID:346927 發表于 2019-5-17 21:16 | 顯示全部樓層
非常好的資料,多謝樓主分享
回復

使用道具 舉報

ID:18591 發表于 2019-5-19 19:38 | 顯示全部樓層
THANSK ~~~~~~~~~~~~
回復

使用道具 舉報

ID:511677 發表于 2019-5-23 12:51 | 顯示全部樓層
正是我需要的,謝謝。
回復

使用道具 舉報

ID:20672 發表于 2019-9-14 22:48 | 顯示全部樓層
謝謝分享~~
回復

使用道具 舉報

ID:428438 發表于 2019-9-16 10:30 | 顯示全部樓層
謝謝樓主,不錯。以前AD數據都沒有考慮濾波。。。
回復

使用道具 舉報

ID:71535 發表于 2019-9-16 18:54 | 顯示全部樓層
東西比較豐富,大家保存備用
回復

使用道具 舉報

ID:124631 發表于 2019-10-8 11:07 | 顯示全部樓層
大自然的搬運工
回復

使用道具 舉報

ID:142699 發表于 2019-10-9 09:24 | 顯示全部樓層
這個寫法比較基礎,用結構體寫的話會更好用一些
回復

使用道具 舉報

ID:68129 發表于 2019-11-7 16:34 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:68129 發表于 2019-11-7 16:39 | 顯示全部樓層
學習了,之前只做了中值平均濾波
回復

使用道具 舉報

ID:298628 發表于 2019-11-9 11:36 | 顯示全部樓層
謝謝大佬的分享
回復

使用道具 舉報

ID:46475 發表于 2019-12-7 10:43 | 顯示全部樓層
好東西,感謝分享
回復

使用道具 舉報

ID:65956 發表于 2019-12-7 14:39 | 顯示全部樓層
源碼中有幾處帶問號“?”的應是什么?
num=num<N?num:N;

value = (value==0)?AD_VALUE:value;        // 三目運算,避免第一次采樣value值為0
回復

使用道具 舉報

ID:607998 發表于 2020-4-15 15:16 | 顯示全部樓層
謝謝分享~~
回復

使用道具 舉報

ID:108573 發表于 2020-4-16 10:58 | 顯示全部樓層
不錯,每天來逛逛,下載點資料
回復

使用道具 舉報

ID:72029 發表于 2020-4-30 11:30 | 顯示全部樓層
不錯,值得參考
回復

使用道具 舉報

ID:392070 發表于 2020-6-16 19:53 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲 欧美 日韩 在线 | 凹凸日日摸日日碰夜夜 | 欧美成人精品欧美一级 | 国际精品鲁一鲁一区二区小说 | 国产精品色综合 | 久久久久国产一区二区三区 | 成人免费视频网站在线观看 | 欧美成人一区二区 | 日韩成人免费视频 | www.狠狠干 | 欧美亚洲一区二区三区 | 中文字幕亚洲精品 | 国产成人精品一区二区 | h视频免费在线观看 | 日韩av在线一区二区 | 中文字幕在线观看www | 久久青视频| 自拍偷拍欧美 | 久久久影院 | 国产精品精品 | 国产精品一区二区av | 日韩高清不卡 | 中文字幕av亚洲精品一部二部 | 欧美黄色一区 | 久久久久久久综合 | 日韩在线免费视频 | 在线视频亚洲 | 韩国毛片一区二区三区 | 久久r久久 | 亚洲综合二区 | 精品美女视频在线观看免费软件 | 日韩国产黄色片 | 夜夜爽99久久国产综合精品女不卡 | 狠狠草视频 | 亚洲天堂av网 | 国产h在线 | 99热最新网址 | 日韩高清一区二区 | 金莲网 | 午夜久久久 | 精品一区二区在线观看 |