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