十大滤波算法_第1页
十大滤波算法_第2页
十大滤波算法_第3页
十大滤波算法_第4页
十大滤波算法_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、十大滤波算法程序大全1、限幅滤波法(又称程序判断滤波法)ARDUINO 代码1. /*2. A、名称:限幅滤波法(又称程序判断滤波法)3. B、方法:4.     根据经验判断,确定两次采样允许的最大偏差值(设为A),5.     每次检测到新值时判断:6.     如果本次值与上次值之差<=A,则本次值有效,7.     如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。8. C、优点:9.     能有效克

2、服因偶然因素引起的脉冲干扰。10. D、缺点:11.     无法抑制那种周期性的干扰。12.     平滑度差。13. E、整理:shenhaiyu 2013-11-0114. */15.  16. int Filter_Value;17. int Value;18.  19. void setup() 20.   Serial.begin(9600);       / 初始化串口通信21.   randomSeed(analogRe

3、ad(0); / 产生随机种子22.   Value = 300;23. 24.  25. void loop() 26.   Filter_Value = Filter();       / 获得滤波器输出值27.   Value = Filter_Value;          / 最近一次有效采样的值,该变量为全局变量28.   Serial.println(Filter_Value); / 串口输出

4、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) >

5、; FILTER_A) | (Value - NewValue) > FILTER_A)43.     return Value;44.   else45.     return NewValue;46. 2、中位值滤波法ARDUINO 代码1. /*2. A、名称:中位值滤波法3. B、方法:4.     连续采样N次(N取奇数),把N次采样值按大小排列,5.     取中间值为本次有效值。6. C、优点:7.     能有效克服因偶然因

6、素引起的波动干扰;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(analo

7、gRead(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.

8、 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_N; i+) 39.     filter_bufi = Get_AD();40.     delay(1);41.   42. 

9、0; / 采样值从小到大排列(冒泡法)43.   for(j = 0; j < FILTER_N - 1; j+) 44.     for(i = 0; i < FILTER_N - 1 - j; i+) 45.       if(filter_bufi > filter_bufi + 1) 46.         filter_temp = filter_bufi;47.       &

10、#160; 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.    

11、0;连续取N个采样值进行算术平均运算:5.     N值较大时:信号平滑度较高,但灵敏度较低;6.     N值较小时:信号平滑度较低,但灵敏度较高;7.     N值的选取:一般流量,N=12;压力:N=4。8. C、优点:9.     适用于对一般具有随机干扰的信号进行滤波;10.     这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。11. D、缺点:12.     对于测量速度较慢或要求数据计

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.  &

13、#160;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 Filt

14、er() 38.   int i;39.   int 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、名称:递推平均滤波法

15、(又称滑动平均滤波法)3. B、方法:4.     把连续取得的N个采样值看成一个队列,队列的长度固定为N,5.     每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),6.     把队列中的N个数据进行算术平均运算,获得新的滤波结果。7.     N值的选取:流量,N=12;压力,N=4;液面,N=4-12;温度,N=1-4。8. C、优点:9.     对周期性干扰有良好的抑制作用,平滑度高;10.  &#

16、160;  适用于高频振荡的系统。11. D、缺点:12.     灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差;13.     不易消除由于脉冲干扰所引起的采样值偏差;14.     不适用于脉冲干扰比较严重的场合;15.     比较浪费RAM。16. E、整理:shenhaiyu 2013-11-0117. */18.  19. int Filter_Value;20.  21. void setup() 22.   

17、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. &#

18、160;32. / 用于随机产生一个300左右的当前值33. int Get_AD() 34.   return random(295, 305);35. 36.  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.

19、  for(i = 0; i < FILTER_N; i+) 45.     filter_bufi = filter_bufi + 1; / 所有数据左移,低位仍掉46.     filter_sum += filter_bufi;47.   48.   return (int)(filter_sum / FILTER_N);49. 5、中位值平均滤波法(又称防脉冲干扰平均滤波法)ARDUINO 代码1. /*2. A、名称:中位值平均滤波法(又称防脉冲干扰平均滤波法)3. B、方法:4

20、.     采一组队列去掉最大值和最小值后取平均值,5.     相当于“中位值滤波法”+“算术平均滤波法”。6.     连续采样N个数据,去掉一个最大值和一个最小值,7.     然后计算N-2个数据的算术平均值。8.     N值的选取:3-14。9. C、优点:10.     融合了“中位值滤波法”+“算术平均滤波法”两种滤波法的优点。11.     对于偶然出现的脉冲性干扰,可

21、消除由其所引起的采样值偏差。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);&#

22、160;      / 初始化串口通信24.   randomSeed(analogRead(0); / 产生随机种子25. 26.  27. void loop() 28.   Filter_Value = Filter();       / 获得滤波器输出值29.   Serial.println(Filter_Value); / 串口输出30.   delay(50);31. 32.  33. / 用于随机产生一个300

23、左右的当前值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_sum = 0;43.   int filter_bufFILTER_N;44.   for(i = 0; i < FIL

24、TER_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_N - 1 - j; i+) 51.       if(filter_bufi > filter_bufi +

25、 1) 52.         filter_temp = filter_bufi;53.         filter_bufi = filter_bufi + 1;54.         filter_bufi + 1 = filter_temp;55.       56.     57.   58.   / 去除

26、最大最小极值后求平均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 = 0

27、;70.   int filter_max, filter_min;71.   int filter_bufFILTER_N;72.   for(i = 0; i < FILTER_N; i+) 73.     filter_bufi = Get_AD();74.     delay(1);75.   76.   filter_max = filter_buf0;77.   filter_min = filter_buf0;78.   filter_sum =

28、 filter_buf0;79.   for(i = FILTER_N - 1; i > 0; i-) 80.     if(filter_bufi > filter_max)81.       filter_max=filter_bufi;82.     else if(filter_bufi < filter_min)83.       filter_min=filter_bufi;84.  &

29、#160;  filter_sum = filter_sum + filter_bufi;85.     filter_bufi = filter_bufi - 1;86.   87.   i = FILTER_N - 2;88.   filter_sum = filter_sum - filter_max - filter_min + i / 2; / +i/2 的目的是为了四舍五入89.   filter_sum = filter_sum / i;90.   return filter_sum;91.

30、 */6、限幅平均滤波法ARDUINO 代码1. /*2. A、名称:限幅平均滤波法3. B、方法:4.     相当于“限幅滤波法”+“递推平均滤波法”;5.     每次采样到的新数据先进行限幅处理,6.     再送入队列进行递推平均滤波处理。7. C、优点:8.     融合了两种滤波法的优点;9.     对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。10. D、缺点:11.     比较

31、浪费RAM。12. E、整理:shenhaiyu 2013-11-0113. */14.  15. #define FILTER_N 1216. int Filter_Value;17. int filter_bufFILTER_N;18.  19. void setup() 20.   Serial.begin(9600);       / 初始化串口通信21.   randomSeed(analogRead(0); / 产生随机种子22.   filter_bufFILT

32、ER_N - 2 = 300;23. 24.  25. void loop() 26.   Filter_Value = Filter();       / 获得滤波器输出值27.   Serial.println(Filter_Value); / 串口输出28.   delay(50);29. 30.  31. / 用于随机产生一个300左右的当前值32. int Get_AD() 33.   return random(295, 305);34. 35

33、.  36. / 限幅平均滤波法37. #define FILTER_A 138. int Filter() 39.   int i;40.   int filter_sum = 0;41.   filter_bufFILTER_N - 1 = Get_AD();42.   if(filter_bufFILTER_N - 1 - filter_bufFILTER_N - 2) > FILTER_A) | (filter_bufFILTER_N - 2 - filter_bufFILTER_N - 1

34、) > FILTER_A)43.     filter_bufFILTER_N - 1 = filter_bufFILTER_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

35、. 7、一阶滞后滤波法ARDUINO 代码1. /*2. A、名称:一阶滞后滤波法3. B、方法:4.     取a=0-1,本次滤波结果=(1-a)*本次采样值+a*上次滤波结果。5. C、优点:6.     对周期性干扰具有良好的抑制作用;7.     适用于波动频率较高的场合。8. D、缺点:9.     相位滞后,灵敏度低;10.     滞后程度取决于a值大小;11.     不能消除滤波频率高于采样频率1

36、/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. &#

37、160; 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. i

38、nt Filter() 38.   int NewValue;39.   NewValue = Get_AD();40.   Value = (int)(float)NewValue * FILTER_A + (1.0 - FILTER_A) * (float)Value);41.   return Value;42. 8、加权递推平均滤波法ARDUINO 代码1. /*2. A、名称:加权递推平均滤波法3. B、方法:4.     是对递推平均滤波法的改进,即不同时刻的数据加以不同的

39、权;5.     通常是,越接近现时刻的数据,权取得越大。6.     给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。7. C、优点:8.     适用于有较大纯滞后时间常数的对象,和采样周期较短的系统。9. D、缺点:10.     对于纯滞后时间常数较小、采样周期较长、变化缓慢的信号;11.     不能迅速反应系统当前所受干扰的严重程度,滤波效果差。12. E、整理:shenhaiyu 2013-11-0113. */14. &

40、#160;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.   Ser

41、ial.println(Filter_Value); / 串口输出25.   delay(50);26. 27.  28. / 用于随机产生一个300左右的当前值29. int Get_AD() 30.   return random(295, 305);31. 32.  33. / 加权递推平均滤波法34. #define FILTER_N 1235. int coeFILTER_N = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;    / 加权系数表36. int sum_co

42、e = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12; / 加权系数和37. int filter_bufFILTER_N + 1;38. int Filter() 39.   int i;40.   int filter_sum = 0;41.   filter_bufFILTER_N = Get_AD();42.   for(i = 0; i < FILTER_N; i+) 43.     filter_bufi = filter_b

43、ufi + 1; / 所有数据左移,低位仍掉44.     filter_sum += filter_bufi * coei;45.   46.   filter_sum /= sum_coe;47.   return filter_sum;48. 9、消抖滤波法ARDUINO 代码1. /*2. A、名称:消抖滤波法3. B、方法:4.     设置一个滤波计数器,将每次采样值与当前有效值比较:5.     如果采样值=当前有效值,则计数器清零;6. &

44、#160;   如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出);7.     如果计数器溢出,则将本次值替换当前有效值,并清计数器。8. C、优点:9.     对于变化缓慢的被测参数有较好的滤波效果;10.     可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。11. D、缺点:12.     对于快速变化的参数不宜;13.     如果在计数器溢出的那一次采样到的

45、值恰好是干扰值,则会将干扰值当作有效值导入系统。14. E、整理:shenhaiyu 2013-11-0115. */16.  17. int Filter_Value;18. int Value;19.  20. void setup() 21.   Serial.begin(9600);       / 初始化串口通信22.   randomSeed(analogRead(0); / 产生随机种子23.   Value = 300;24. 25.  26. vo

46、id 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.  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.  

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论