您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 十大滤波算法程序大全(Arduino精编无错版)
本帖最后由shenhaiyu于2013-11-1123:03编辑最近用Arduino做电子秤,为了解决数据的跳变研究了不少滤波算法。网上能找到大把的十大滤波算法帖子,每一篇都不太一样,都号称精编啊,除错啊什么的,可是放到板子里却没一个能正常跑起来的。于是决定自己整理一下这些程序,完美移植到Arduino中。所以大家看到这个帖子的时候,不要怀疑我重复发帖。我的代码都是经过反复试验,复制到Arduino中就能开跑的成品代码,移植到自己的程序中非常方便。而且都仔细研究了各个算法,把错误都修正了的(别的程序连冒泡算法都是溢出的,不信自己找来细看看),所以也算个小原创吧,在别人基础上的原创。转载请注明出处:极客工坊、限幅滤波法(又称程序判断滤波法)2、中位值滤波法3、算术平均滤波法4、递推平均滤波法(又称滑动平均滤波法)5、中位值平均滤波法(又称防脉冲干扰平均滤波法)6、限幅平均滤波法7、一阶滞后滤波法8、加权递推平均滤波法9、消抖滤波法10、限幅消抖滤波法11、新增加卡尔曼滤波(非扩展卡尔曼),代码在17楼(点击这里)感谢zhangzhe0617分享程序默认对int类型数据进行滤波,如需要对其他类型进行滤波,只需要把程序中所有int替换成long、float或者double即可。1、限幅滤波法(又称程序判断滤波法)ARDUINO代码复制打印1./*2.A、名称:限幅滤波法(又称程序判断滤波法)3.B、方法:4.根据经验判断,确定两次采样允许的最大偏差值(设为A),5.每次检测到新值时判断:6.如果本次值与上次值之差=A,则本次值有效,7.如果本次值与上次值之差A,则本次值无效,放弃本次值,用上次值代替本次值。8.C、优点:9.能有效克服因偶然因素引起的脉冲干扰。10.D、缺点:11.无法抑制那种周期性的干扰。12.平滑度差。13.E、整理:shenhaiyu2013-11-0114.*/15.16.intFilter_Value;17.intValue;18.19.voidsetup(){20.Serial.begin(9600);//初始化串口通信21.randomSeed(analogRead(0));//产生随机种子22.Value=300;23.}24.25.voidloop(){26.Filter_Value=Filter();//获得滤波器输出值27.Value=Filter_Value;//最近一次有效采样的值,该变量为全局变量28.Serial.println(Filter_Value);//串口输出29.delay(50);30.}31.32.//用于随机产生一个300左右的当前值33.intGet_AD(){34.returnrandom(295,305);35.}36.37.//限幅滤波法(又称程序判断滤波法)38.#defineFILTER_A139.intFilter(){40.intNewValue;41.NewValue=Get_AD();42.if(((NewValue-Value)FILTER_A)||((Value-NewValue)FILTER_A))43.returnValue;44.else45.returnNewValue;46.}2、中位值滤波法ARDUINO代码复制打印1./*2.A、名称:中位值滤波法3.B、方法:4.连续采样N次(N取奇数),把N次采样值按大小排列,5.取中间值为本次有效值。6.C、优点:7.能有效克服因偶然因素引起的波动干扰;8.对温度、液位的变化缓慢的被测参数有良好的滤波效果。9.D、缺点:10.对流量、速度等快速变化的参数不宜。11.E、整理:shenhaiyu2013-11-0112.*/13.14.intFilter_Value;15.16.voidsetup(){17.Serial.begin(9600);//初始化串口通信18.randomSeed(analogRead(0));//产生随机种子19.}20.21.voidloop(){22.Filter_Value=Filter();//获得滤波器输出值23.Serial.println(Filter_Value);//串口输出24.delay(50);25.}26.27.//用于随机产生一个300左右的当前值28.intGet_AD(){29.returnrandom(295,305);30.}31.32.//中位值滤波法33.#defineFILTER_N10134.intFilter(){35.intfilter_buf[FILTER_N];36.inti,j;37.intfilter_temp;38.for(i=0;iFILTER_N;i++){39.filter_buf[i]=Get_AD();40.delay(1);41.}42.//采样值从小到大排列(冒泡法)43.for(j=0;jFILTER_N-1;j++){44.for(i=0;iFILTER_N-1-j;i++){45.if(filter_buf[i]filter_buf[i+1]){46.filter_temp=filter_buf[i];47.filter_buf[i]=filter_buf[i+1];48.filter_buf[i+1]=filter_temp;49.}50.}51.}52.returnfilter_buf[(FILTER_N-1)/2];53.}3、算术平均滤波法ARDUINO代码复制打印1./*2.A、名称:算术平均滤波法3.B、方法:4.连续取N个采样值进行算术平均运算:5.N值较大时:信号平滑度较高,但灵敏度较低;6.N值较小时:信号平滑度较低,但灵敏度较高;7.N值的选取:一般流量,N=12;压力:N=4。8.C、优点:9.适用于对一般具有随机干扰的信号进行滤波;10.这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。11.D、缺点:12.对于测量速度较慢或要求数据计算速度较快的实时控制不适用;13.比较浪费RAM。14.E、整理:shenhaiyu2013-11-0115.*/16.17.intFilter_Value;18.19.voidsetup(){20.Serial.begin(9600);//初始化串口通信21.randomSeed(analogRead(0));//产生随机种子22.}23.24.voidloop(){25.Filter_Value=Filter();//获得滤波器输出值26.Serial.println(Filter_Value);//串口输出27.delay(50);28.}29.30.//用于随机产生一个300左右的当前值31.intGet_AD(){32.returnrandom(295,305);33.}34.35.//算术平均滤波法36.#defineFILTER_N1237.intFilter(){38.inti;39.intfilter_sum=0;40.for(i=0;iFILTER_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.把队列中的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、整理:shenhaiyu2013-11-0117.*/18.19.intFilter_Value;20.21.voidsetup(){22.Serial.begin(9600);//初始化串口通信23.randomSeed(analogRead(0));//产生随机种子24.}25.26.voidloop(){27.Filter_Value=Filter();//获得滤波器输出值28.Serial.println(Filter_Value);//串口输出29.delay(50);30.}31.32.//用于随机产生一个300左右的当前值33.intGet_AD(){34.returnrandom(295,305);35.}36.37.//递推平均滤波法(又称滑动平均滤波法)38.#defineFILTER_N1239.intfilter_buf[FILTER_N+1];40.intFilter(){41.inti;42.intfilter_sum=0;43.filter_buf[FILTER_N]=Get_AD();44.for(i=0;iFILTER_N;i++){45.filter_buf[i]=filter_buf[i+1];//所有数据左移,低位仍掉46.filter_sum+=filter_buf[i];47.}48.return(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.对于偶然出现的脉冲性干扰,可消除由其所引起的采样值偏差。12.对周期干扰有良好的抑制作用。13.平滑度高,适于高频振荡的系统。14.D、缺点:15.计算速度较慢,和算术平均滤波法一样。16.比较浪费RAM。17.E、整理:shenhaiyu2013-11-0118.*/19.20.intFilter_Value;21.22.voidsetup(){23.Serial.begin(9600);//初始化串口通信24.randomSeed(analogRead(0));//产生随机种子25.}26.27.voidloop(){28.Filter_Value=Filter();//获得滤波器输出值29.Serial.println(Filter_Value);//串口输出30.delay(50);31.}32.33.//用于随机产生一个300左右的当前值34.intGet_AD(){35.returnrandom(295,305);36.}37.38.//中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法1)39.#defineFILTER_N10040.intFilter(){41.inti,j;42.intfilter_temp,filter_sum=0;43.intfilter_buf[FILTER_N];44.for(i=0;iFILTER_N;i++){45.filter_buf[i]=Get_AD();46.delay(1);47.}48.//采样值从小到大排列(冒泡法)49.for(j=0;jFILTER_N-1;j++){50.for(i=0;iFILTER_N-1-j;i++){51.i
本文标题:十大滤波算法程序大全(Arduino精编无错版)
链接地址:https://www.777doc.com/doc-2588888 .html