找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16587|回复: 16
打印 上一主题 下一主题
收起左侧

STM32 ADC采样的十种滤波加程序

  [复制链接]
跳转到指定楼层
楼主

  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "lcd.h"
  6. #include "adc.h"
  7. #include "usartbo.h"

  8. u16 ftable[255] = {
  9.         2048, 2098, 2148, 2198, 2248, 2298, 2348, 2398, 2447, 2496,
  10. 2545, 2594, 2642, 2690, 2737, 2785, 2831, 2877, 2923, 2968,
  11. 3013, 3057, 3100, 3143, 3185, 3227, 3267, 3307, 3347, 3385,
  12. 3423, 3460, 3496, 3531, 3565, 3598, 3631, 3662, 3692, 3722,
  13. 3750, 3778, 3804, 3829, 3854, 3877, 3899, 3920, 3940, 3958,
  14. 3976, 3992, 4007, 4021, 4034, 4046, 4056, 4065, 4073, 4080,
  15. 4086, 4090, 4093, 4095, 4095, 4095, 4093, 4090, 4086, 4080,
  16. 4073, 4065, 4056, 4046, 4034, 4021, 4007, 3992, 3976, 3958,
  17. 3940, 3920, 3899, 3877, 3854, 3829, 3804, 3778, 3750, 3722,
  18. 3692, 3662, 3631, 3598, 3565, 3531, 3496, 3460, 3423, 3385,
  19. 3347, 3307, 3267, 3227, 3185, 3143, 3100, 3057, 3013, 2968,
  20. 2923, 2877, 2831, 2785, 2737, 2690, 2642, 2594, 2545, 2496,
  21. 2447, 2398, 2348, 2298, 2248, 2198, 2148, 2098, 2047, 1997,
  22. 1947, 1897, 1847, 1797, 1747, 1697, 1648, 1599, 1550, 1501,
  23. 1453, 1405, 1358, 1310, 1264, 1218, 1172, 1127, 1082, 1038,
  24. 995, 952, 910, 868, 828, 788, 748, 710, 672, 635,
  25. 599, 564, 530, 497, 464, 433, 403, 373, 345, 317,
  26. 291, 266, 241, 218, 196, 175, 155, 137, 119, 103,
  27. 88, 74, 61, 49, 39, 30, 22, 15, 9, 5,
  28. 2, 0, 0, 0, 2, 5, 9, 15, 22, 30,
  29. 39, 49, 61, 74, 88, 103, 119, 137, 155, 175,
  30. 196, 218, 241, 266, 291, 317, 345, 373, 403, 433,
  31. 464, 497, 530, 564, 599, 635, 672, 710, 748, 788,
  32. 828, 868, 910, 952, 995, 1038, 1082, 1127, 1172, 1218,
  33. 1264, 1310, 1358, 1405, 1453, 1501, 1550, 1599, 1648, 1697,
  34. 1747, 1797, 1847, 1897, 1947
  35. };

  36. int a=0;
  37. int b=1;
  38. /*//////////////////////////////////////////////////////////////////////////
  39. 方法一:限幅滤波法
  40. 方法:根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断:
  41.       如果本次值与上次值之差<=A,则本次值有效,
  42.       如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。
  43. 优点:能克服偶然因素引起的脉冲干扰
  44. 缺点:无法抑制周期性的干扰,平滑度差
  45. //////////////////////////////////////////////////////////////////////////*/

  46. #define  A 51
  47. u16 Value1;

  48. u16 filter1()
  49. {
  50.   u16 NewValue;
  51.         Value1 = ftable[b-1];
  52.   NewValue = ftable[b];
  53.         b++;
  54.         a++;
  55.         if(a==255) a=0;
  56.         if(b==255) b=1;
  57.   if(((NewValue - Value1) > A) || ((Value1 - NewValue) > A))
  58.         {
  59.                 print_host(ftable[a],NewValue);
  60.     return NewValue;
  61.         }
  62.   else
  63.         {
  64.                  print_host(ftable[a],Value1);
  65.      return Value1;
  66.         }
  67. }

  68. /*//////////////////////////////////////////////////////////////////////////
  69. 方法二:中位值滤波法
  70. 方法: 连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。
  71. 优点:克服偶然因素(对温度、液位的变化缓慢的被测参数有良好的滤波效果)
  72. 缺点:对流量、速度等快速变化的参数不宜
  73. //////////////////////////////////////////////////////////////////////////*/
  74. #define N 3

  75. u16 value_buf[N];
  76. u16 filter2()
  77. {  
  78.   u16 count,i,j,temp;
  79.   for(count=0;count<N;count++)
  80.   {
  81.     value_buf[count] =  ftable[a];
  82.           a++;
  83.           if(a==255) a=0;
  84.   }
  85.         for (j=0;j<N-1;j++)
  86.         {
  87.                  for (i=0;i<N-j;i++)
  88.                  {
  89.                         if ( value_buf[i] >  value_buf[i+1] )
  90.                         {
  91.                          temp = value_buf[i];
  92.                          value_buf [i]= value_buf[i+1];
  93.                          value_buf[i+1] = temp;
  94.                         }
  95.                  }
  96.         }
  97. //        printf("%d\n",value_buf[(N-1)/2]);
  98.         return value_buf[(N-1)/2];
  99. }
  100. void pros2()
  101. {
  102.    print_host(4,filter2());
  103. }
  104. /*//////////////////////////////////////////////////////////////////////////
  105. 方法三:算术平均滤波法
  106. 方法:连续取N个采样值进行算术平均运算:( N值的选取:一般流量,N=12;压力:N=4。)
  107.       N值较大时:信号平滑度较高,但灵敏度较低;
  108.       N值较小时:信号平滑度较低,但灵敏度较高;     
  109. 优点:适用于对一般具有随机干扰的信号进行滤波;这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动
  110. 缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费RAM。
  111. ////////////////////////////////////////////////////////////////////////*/

  112. #define N 5
  113. u16 filter3()
  114. {
  115.         u16 sum = 0,count;
  116.         for ( count=0;count<N;count++)
  117.         {
  118.                 sum = sum+ ftable[a];
  119.                 a++;
  120.                 if(a==255) a=0;
  121.         }
  122.         print_host(4,sum/N);
  123. //        printf("%d\n",sum/N);
  124.         return (sum/N);
  125. }

  126. /*//////////////////////////////////////////////////////////////////////////
  127. 方法四:递推平均滤波法(又称滑动平均滤波法)
  128. 方法: 把连续取得的N个采样值看成一个队列,队列的长度固定为N,
  129.        每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),
  130.        把队列中的N个数据进行算术平均运算,获得新的滤波结果。
  131.        N值的选取:流量,N=12;压力,N=4;液面,N=4-12;温度,N=1-4。
  132. 优点:对周期性干扰有良好的抑制作用,平滑度高;
  133.       适用于高频振荡的系统。
  134. 缺点:灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差;
  135.       不易消除由于脉冲干扰所引起的采样值偏差;
  136.       不适用于脉冲干扰比较严重的场合;
  137.       比较浪费RAM。
  138. ////////////////////////////////////////////////////////////////////////*/

  139. #define FILTER4_N 3
  140. u16 filter_buf[FILTER4_N + 1];
  141. u16 filter4()
  142. {
  143.   int i;
  144.   int filter_sum = 0;
  145.   filter_buf[FILTER4_N] = ftable[a];               
  146.         a++;
  147.         if(a==255) a=0;
  148.   for(i = 0; i < FILTER4_N; i++)
  149.         {
  150.     filter_buf[i] = filter_buf[i + 1]; // 所有数据左移,低位仍掉
  151.     filter_sum += filter_buf[i];
  152.   }
  153. //        printf("%d\n",filter_sum / FILTER4_N);
  154.   return (int)(filter_sum / FILTER4_N);
  155. }


  156. void pros4(void)
  157. {
  158.         u16 i=0;
  159.   print_host(4,filter4());
  160. }
  161. /*//////////////////////////////////////////////////////////////////////////
  162. 方法五:中位值平均滤波法(又称防脉冲干扰平均滤波法)
  163. 方法: 采一组队列去掉最大值和最小值后取平均值,     (N值的选取:3-14)。
  164.       相当于“中位值滤波法”+“算术平均滤波法”。
  165.       连续采样N个数据,去掉一个最大值和一个最小值,
  166.       然后计算N-2个数据的算术平均值。   
  167. 优点: 融合了“中位值滤波法”+“算术平均滤波法”两种滤波法的优点。
  168.        对于偶然出现的脉冲性干扰,可消除由其所引起的采样值偏差。
  169.        对周期干扰有良好的抑制作用。
  170.        平滑度高,适于高频振荡的系统。
  171. 缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费RAM。
  172. ////////////////////////////////////////////////////////////////////////*/

  173. #define N 3
  174. int filter5()
  175. {
  176.   int i, j;
  177.   int filter_temp, filter_sum = 0;
  178.   int filter_buf[N];
  179.   for(i = 0; i < N; i++)
  180.         {
  181.     filter_buf[i] = ftable[a];
  182.                 a++;
  183.                 if(a==255)   a=0;
  184.     delay_us(10);
  185.   }
  186.   // 采样值从小到大排列(冒泡法)
  187.   for(j = 0; j < N - 1; j++)
  188.         {
  189.     for(i = 0; i < N - 1 - j; i++)
  190.                 {
  191.       if(filter_buf[i] > filter_buf[i + 1])
  192.                         {
  193.         filter_temp = filter_buf[i];
  194.         filter_buf[i] = filter_buf[i + 1];
  195.         filter_buf[i + 1] = filter_temp;
  196.       }
  197.     }
  198.   }
  199.   // 去除最大最小极值后求平均
  200.   for(i = 1; i < N - 1; i++) filter_sum += filter_buf[i];
  201. //        printf("%d\n",filter_sum / ( N - 2));
  202.   return filter_sum / (N - 2);
  203. }

  204. void pros5(void)
  205. {
  206.         u16 i=0;
  207.         for(i=0;i<255;i++)
  208.         {
  209.      print_host(ftable[i],filter5());
  210.         }
  211. }

  212. /*//////////////////////////////////////////////////////////////////////////
  213. 方法六:限幅平均滤波法
  214. 方法: 相当于“限幅滤波法”+“递推平均滤波法”;
  215.        每次采样到的新数据先进行限幅处理,
  216.        再送入队列进行递推平均滤波处理。
  217. 优点: 融合了两种滤波法的优点;
  218.       对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。
  219. 缺点:比较浪费RAM。
  220. ////////////////////////////////////////////////////////////////////////*/
复制代码

全部资料51hei下载地址:
十大滤波.7z (206.02 KB, 下载次数: 564)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏27 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:280151 发表于 2019-8-9 09:30 | 只看该作者
很有用    太谢谢了
回复

使用道具 举报

板凳
ID:140183 发表于 2019-8-17 20:24 | 只看该作者
之前学了一下STC单片机.现在要学习STM32.非常感谢!
回复

使用道具 举报

地板
ID:582109 发表于 2019-8-18 12:24 | 只看该作者
太有用了
回复

使用道具 举报

5#
ID:511461 发表于 2019-10-23 19:15 | 只看该作者
资料共享,大家互相学习
回复

使用道具 举报

6#
ID:47541 发表于 2019-10-24 09:41 | 只看该作者

资料共享,大家互相学习
回复

使用道具 举报

7#
ID:67425 发表于 2019-10-29 11:22 | 只看该作者
感谢楼主分享
回复

使用道具 举报

8#
ID:25310 发表于 2019-11-26 08:48 | 只看该作者
实用资料果断收藏!
回复

使用道具 举报

9#
ID:701882 发表于 2020-3-12 20:21 | 只看该作者
互相学习
回复

使用道具 举报

10#
ID:502584 发表于 2020-7-18 10:18 | 只看该作者
非常感谢楼主的无私奉献!
回复

使用道具 举报

11#
ID:246133 发表于 2020-7-23 09:03 | 只看该作者
太有用了,非常感谢楼主分享。
回复

使用道具 举报

12#
ID:326430 发表于 2020-7-23 16:10 | 只看该作者
你这软件是什么软件?
回复

使用道具 举报

13#
ID:807274 发表于 2020-7-23 16:51 | 只看该作者
学了一下STC单片机.现在要学习STM32.非常感谢!
回复

使用道具 举报

14#
ID:511461 发表于 2020-8-1 21:17 | 只看该作者
727742898 发表于 2020-7-23 16:10
你这软件是什么软件?

山外调试助手,我分享过,这是链接http://www.51hei.com/bbs/dpj-193123-1.html
回复

使用道具 举报

15#
ID:457079 发表于 2021-2-2 10:15 | 只看该作者
很好的东西 非常有用啊
回复

使用道具 举报

16#
ID:904778 发表于 2021-4-12 23:17 | 只看该作者
好东西,最近DIY小玩意要用,多谢分享
回复

使用道具 举报

17#
ID:536912 发表于 2023-1-5 14:51 | 只看该作者
感谢分享
非常感谢楼主的无私奉献!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表