1、20. ?Serial.begin(9600); / 初始化串口通信21. ?randomSeed(analogRead(0); / 产生随机种子22. ?Value = 300;23. 24. ?25. void loop() 26. ?Filter_Value = Filter(); / 获得滤波器输出值27. ?Value = Filter_Value; / 最近一次有效采样的值,该变量为全局变量28. ?Serial.println(Filter_Value); / 串口输出29. ?delay(50);30. 31. ?32. / 用于随机产生一个300左右的当前值33. int G
2、et_AD() 34. ?return random(295, 305);35. 36. ?37. / 限幅滤波法(又称程序判断滤波法)38. #define FILTER_A 139. int Filter() 40. ?int NewValue;41. ?NewValue = Get_AD();42. ?if(NewValue - Value) FILTER_A) | (Value - NewValue) FILTER_A)43. ? return Value;44. ?else45. ? return NewValue;46. 2、中位值滤波法中位值滤波法连续采样N次(N取奇数),把N次
3、采样值按大小排列,取中间值为本次有效值。6. C、优点:能有效克服因偶然因素引起的波动干扰;8. ?对温度、液位的变化缓慢的被测参数有良好的滤波效果。9. D、缺点:10. ?对流量、速度等快速变化的参数不宜。11. E、整理:12. */13. ?14. int Filter_Value;16. void setup() 17. ?19. 21. void loop() 23. ?25. 27. / 用于随机产生一个300左右的当前值28. int Get_AD() 32. / 中位值滤波法33. #define FILTER_N 10134. int Filter() 35. ?int f
4、ilter_bufFILTER_N;int i, j;37. ?int filter_temp;38. ?for(i = 0; i FILTER_N; i+) 39. ? filter_bufi = Get_AD(); delay(1);/ 采样值从小到大排列(冒泡法)for(j = 0; j filter_bufi + 1) 46. ?filter_temp = filter_bufi;47. ?filter_bufi = filter_bufi + 1;48. ?filter_bufi + 1 = filter_temp;49. ?50. ? 51. ?52. ?return filter
5、_buf(FILTER_N - 1) / 2;53. 3、算术平均滤波法算术平均滤波法连续取N个采样值进行算术平均运算:N值较大时:信号平滑度较高,但灵敏度较低;N值较小时:信号平滑度较低,但灵敏度较高;N值的选取:一般流量,N=12;压力:N=4。适用于对一般具有随机干扰的信号进行滤波;这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。11. D、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用;比较浪费RAM。14. E、整理:15. */16. ?17. int Filter_Value;22. 24. void loop() 25. ?28. 30. / 用于随
6、机产生一个300左右的当前值31. int Get_AD() 32. ?33. 35. / 算术平均滤波法36. #define FILTER_N 1237. int Filter() int i;int filter_sum = 0; filter_sum += Get_AD();return (int)(filter_sum / FILTER_N);45. 4、递推平均滤波法(又称滑动平均滤波法)递推平均滤波法(又称滑动平均滤波法)把连续取得的N个采样值看成一个队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),把队列中的N个数据进行算术平均运
7、算,获得新的滤波结果。流量,N=12;压力,N=4;液面,N=4-12;温度,N=1-4。对周期性干扰有良好的抑制作用,平滑度高;适用于高频振荡的系统。灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差;不易消除由于脉冲干扰所引起的采样值偏差;14. ?不适用于脉冲干扰比较严重的场合;16. E、整理:17. */19. int Filter_Value;21. void setup() 24. 26. void loop() 37. / 递推平均滤波法(又称滑动平均滤波法)38. #define FILTER_N 1239. int filter_bufFILTER_N + 1;40. int
8、Filter() filter_bufFILTER_N = Get_AD(); filter_bufi = filter_bufi + 1; / 所有数据左移,低位仍掉 filter_sum += filter_bufi;49. 5、中位值平均滤波法(又称防脉冲干扰平均滤波法)中位值平均滤波法(又称防脉冲干扰平均滤波法)采一组队列去掉最大值和最小值后取平均值,相当于“中位值滤波法”+“算术平均滤波法”。连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值。3-14。9. C、优点:融合了“中位值滤波法”+“算术平均滤波法”两种滤波法的优点。对于偶然出现的脉冲性干扰,可
9、消除由其所引起的采样值偏差。对周期干扰有良好的抑制作用。平滑度高,适于高频振荡的系统。14. D、缺点:计算速度较慢,和算术平均滤波法一样。17. E、整理:18. */19. ?20. int Filter_Value;22. void setup() 27. void loop() 30. ?31. 33. / 用于随机产生一个300左右的当前值34. int Get_AD() 36. 38. / 中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法1)39. #define FILTER_N 100int filter_temp, filter_sum = 0;53. ?54. ?55.
10、?56. ?57. ?58. ?/ 去除最大最小极值后求平均59. ?for(i = 1; i+) filter_sum += filter_bufi;60. ?return filter_sum / (FILTER_N - 2);61. 62. ?63. ?64. /?中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法2)65. /*66. #define FILTER_N 10067. int Filter() 68. ? int i;69. ? int filter_sum = 0;70. ? int filter_max, filter_min;71. ? int filter_buf
11、FILTER_N;72. ?73. ?filter_bufi = Get_AD();74. ?delay(1);75. ?76. ? filter_max = filter_buf0;77. ? filter_min = filter_buf0;78. ? filter_sum = filter_buf0;79. ? for(i = FILTER_N - 1; i 0; i-) 80. ? filter_max)81. ?filter_max=filter_bufi;82. ?else if(filter_bufi FILTER_A) | (filter_bufFILTER_N - 2 - f
12、ilter_bufFILTER_N - 1) filter_bufFILTER_N - 1 = filter_bufFILTER_N - 2;return (int)filter_sum / (FILTER_N - 1);7、一阶滞后滤波法一阶滞后滤波法取a=0-1,本次滤波结果=(1-a)*本次采样值+a*上次滤波结果。5. C、优点:对周期性干扰具有良好的抑制作用;适用于波动频率较高的场合。8. D、缺点:相位滞后,灵敏度低;滞后程度取决于a值大小;不能消除滤波频率高于采样频率1/2的干扰信号。15. int Filter_Value;16. int Value;18. void setu
13、p() 35. / 一阶滞后滤波法36. #define FILTER_A 0.01Value = (int)(float)NewValue * FILTER_A + (1.0 - FILTER_A) * (float)Value);return Value;42. 8、加权递推平均滤波法加权递推平均滤波法是对递推平均滤波法的改进,即不同时刻的数据加以不同的权;通常是,越接近现时刻的数据,权取得越大。给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。适用于有较大纯滞后时间常数的对象,和采样周期较短的系统。对于纯滞后时间常数较小、采样周期较长、变化缓慢的信号;不能迅速反应系统当前所受干扰的严重程度,滤波效果差。17. void setup() 20. 22. void loop() Serial.println(Fi
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1