《Arduino11大滤波器(网上收集)》由会员分享,可在线阅读,更多相关《Arduino11大滤波器(网上收集)(20页珍藏版)》请在金锄头文库上搜索。
1、一、 限幅滤波法(又称程序判断滤波法)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_Value;17.int Value;18. 19.void setup() 20. Ser
2、ial.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 Get_AD() 34. return
3、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.二、 中位值滤波法1. /*2. A、名称:中位值滤波法3. B、方法:4. 连续采样 N 次(N 取奇数),把 N 次采样值按
4、大小排列,5. 取中间值为本次有效值。6. C、优点:7. 能有效克服因偶然因素引起的波动干扰;8. 对温度、液位的变化缓慢的被测参数有良好的滤波效果。9. D、缺点:10. 对流量、速度等快速变化的参数不宜。11.E、整理:shenhaiyu 2013-11-0112.*/13. 14.int Filter_Value;15. 16.void setup() 17. Serial.begin(9600); / 初始化串口通信18. randomSeed(analogRead(0); / 产生随机种子19.20. 21.void loop() 22. Filter_Value = Filter
5、(); / 获得滤波器输出值23. Serial.println(Filter_Value); / 串口输出24. delay(50);25.26. 27./ 用于随机产生一个 300 左右的当前值28.int Get_AD() 29. return random(295, 305);30.31. 32./ 中位值滤波法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_bufi + 1) 46. fi
6、lter_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.三、 算术平均滤波法1. /*2. A、名称:算术平均滤波法3. B、方法:4. 连续取 N 个采样值进行算术平均运算:5. N 值较大时:信号平滑度较高,但灵敏度较低;6. N 值较小时:信号平滑度较低,但灵敏度较高;7. N 值的选取:一般流量,N=12 ;压力:N=4。8. C、优点:9. 适用于对
7、一般具有随机干扰的信号进行滤波;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(analogRead(0); / 产生随机种子22.23. 24.void loop() 25. Filter_Value = Filter(
8、); / 获得滤波器输出值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. int filter_sum = 0;40. for(i = 0; i filter_bufi + 1) 52. filter_temp = filter_bufi;53.
9、filter_bufi = filter_bufi + 1;54. filter_bufi + 1 = filter_temp;55. 56. 57. 58. / 去除最大最小极值后求平均59. for(i = 1; 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 = f
10、ilter_bufFILTER_N - 2;44. for(i = 0; i 当前有效值,则计数器+1 ,并判断计数器是否=上限 N(溢出);7. 如果计数器溢出,则将本次值替换当前有效值,并清计数器。8. C、优点:9. 对于变化缓慢的被测参数有较好的滤波效果;10. 可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。11.D、缺点:12. 对于快速变化的参数不宜;13. 如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。14.E、整理:shenhaiyu 2013-11-0115.*/16. 17.int Filter_Value;18.int Va
11、lue;19. 20.void setup() 21. Serial.begin(9600); / 初始化串口通信22. randomSeed(analogRead(0); / 产生随机种子23. Value = 300;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)
12、;35.36. 37./ 消抖滤波法38.#define FILTER_N 1239.int i = 0;40.int Filter() 41. int new_value;42. new_value = Get_AD();43. if(Value != new_value) 44. i+;45. if(i FILTER_N) 46. i = 0;47. Value = new_value;48. 49. 50. else51. i = 0;52. return Value;53.十、 限幅消抖滤波法1. /*2. A、名称:限幅消抖滤波法3. B、方法:4. 相当于 “限幅滤波法”+“消抖滤
13、波法”;5. 先限幅,后消抖。6. C、优点:7. 继承了 “限幅”和“消抖”的优点;8. 改进了 “消抖滤波法”中的某些缺陷,避免将干扰值导入系统。9. D、缺点:10. 对于快速变化的参数不宜。11.E、整理:shenhaiyu 2013-11-0112.*/13. 14.int Filter_Value;15.int Value;16. 17.void setup() 18. Serial.begin(9600); / 初始化串口通信19. randomSeed(analogRead(0); / 产生随机种子20. Value = 300;21.22. 23.void loop() 24
14、. Filter_Value = Filter(); / 获得滤波器输出值25. Serial.println(Filter_Value); / 串口输出26. delay(50);27.28. 29./ 用于随机产生一个 300 左右的当前值30.int Get_AD() 31. return random(295, 305);32.33. 34./ 限幅消抖滤波法35.#define FILTER_A 136.#define FILTER_N 537.int i = 0;38.int Filter() 39. int NewValue;40. int new_value;41. NewValue = Get_AD();42. if(NewValue - Value) FILTER_A) | (Value - NewValue) FILTER_A)43. new_value = Value;44. else45. new_value = NewValue;46. if(Value != new_value) 47. i+;48. if(i FILTER_N) 49. i = 0;50. Value = new_value;51. 52. 53. else54.