十大滤波算法的实现.docx
《十大滤波算法的实现.docx》由会员分享,可在线阅读,更多相关《十大滤波算法的实现.docx(62页珍藏版)》请在冰豆网上搜索。
十大滤波算法的实现
1、限幅滤波法(又称程序判断滤波法)
2、中位值滤波法
3、算术平均滤波法
4、递推平均滤波法(又称滑动平均滤波法)
5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
6、限幅平均滤波法
7、一阶滞后滤波法
8、加权递推平均滤波法
9、消抖滤波法
10、限幅消抖滤波法
1、限幅滤波法(又称程序判断滤波法)
1./*
2.A、名称:
限幅滤波法(又称程序判断滤波法)
3.B、方法:
4.根据经验判断,确定两次采样允许的最大偏差值(设为A),
5.每次检测到新值时判断:
6.如果本次值与上次值之差<=A,则本次值有效,
7.如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。
8.C、优点:
9.能有效克服因偶然因素引起的脉冲干扰。
10.D、缺点:
11.无法抑制那种周期性的干扰。
12.平滑度差。
13.E、整理:
shenhaiyu2013-11-01
14.*/
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_A1
39.intFilter(){
40.intNewValue;
41.NewValue=Get_AD();
42.if(((NewValue-Value)>FILTER_A)||((Value-NewValue)>FILTER_A))
43.returnValue;
44.else
45.returnNewValue;
46.}
1./*
2.
3.A、名称:
限幅滤波法(又称程序判断滤波法)
4.
5.B、方法:
6.
7.根据经验判断,确定两次采样允许的最大偏差值(设为A),
8.
9.每次检测到新值时判断:
10.
11.如果本次值与上次值之差<=A,则本次值有效,
12.
13.如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。
14.
15.C、优点:
16.
17.能有效克服因偶然因素引起的脉冲干扰。
18.
19.D、缺点:
20.
21.无法抑制那种周期性的干扰。
22.
23.平滑度差。
24.
25.E、整理:
shenhaiyu2013-11-01
26.
27.*/
28.
29.
30.
31.intFilter_Value;
32.
33.intValue;
34.
35.
36.
37.voidsetup(){
38.
39.Serial.begin(9600);//初始化串口通信
40.
41.randomSeed(analogRead(0));//产生随机种子
42.
43.Value=300;
44.
45.}
46.
47.
48.
49.voidloop(){
50.
51.Filter_Value=Filter();//获得滤波器输出值
52.
53.Value=Filter_Value;//最近一次有效采样的值,该变量为全局变量
54.
55.Serial.println(Filter_Value);//串口输出
56.
57.delay(50);
58.
59.}
60.
61.
62.
63.//用于随机产生一个300左右的当前值
64.
65.intGet_AD(){
66.
67.returnrandom(295,305);
68.
69.}
70.
71.
72.
73.//限幅滤波法(又称程序判断滤波法)
74.
75.#defineFILTER_A1
76.
77.intFilter(){
78.
79.intNewValue;
80.
81.NewValue=Get_AD();
82.
83.if(((NewValue-Value)>FILTER_A)||((Value-NewValue)>FILTER_A))
84.
85.returnValue;
86.
87.else
88.
89.returnNewValue;
90.
91.}
92.
2、中位值滤波法
1./*
2.A、名称:
中位值滤波法
3.B、方法:
4.连续采样N次(N取奇数),把N次采样值按大小排列,
5.取中间值为本次有效值。
6.C、优点:
7.能有效克服因偶然因素引起的波动干扰;
8.对温度、液位的变化缓慢的被测参数有良好的滤波效果。
9.D、缺点:
10.对流量、速度等快速变化的参数不宜。
11.E、整理:
shenhaiyu2013-11-01
12.*/
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_N101
34.intFilter(){
35.intfilter_buf[FILTER_N];
36.inti,j;
37.intfilter_temp;
38.for(i=0;i39.filter_buf[i]=Get_AD();
40.delay
(1);
41.}
42.//采样值从小到大排列(冒泡法)
43.for(j=0;j44.for(i=0;i45.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.}
1./*
2.
3.A、名称:
中位值滤波法
4.
5.B、方法:
6.
7.连续采样N次(N取奇数),把N次采样值按大小排列,
8.
9.取中间值为本次有效值。
10.
11.C、优点:
12.
13.能有效克服因偶然因素引起的波动干扰;
14.
15.对温度、液位的变化缓慢的被测参数有良好的滤波效果。
16.
17.D、缺点:
18.
19.对流量、速度等快速变化的参数不宜。
20.
21.E、整理:
shenhaiyu2013-11-01
22.
23.*/
24.
25.
26.
27.intFilter_Value;
28.
29.
30.
31.voidsetup(){
32.
33.Serial.begin(9600);//初始化串口通信
34.
35.randomSeed(analogRead(0));//产生随机种子
36.
37.}
38.
39.
40.
41.voidloop(){
42.
43.Filter_Value=Filter();//获得滤波器输出值
44.
45.Serial.println(Filter_Value);//串口输出
46.
47.delay(50);
48.
49.}
50.
51.
52.
53.//用于随机产生一个300左右的当前值
54.
55.intGet_AD(){
56.
57.returnrandom(295,305);
58.
59.}
60.
61.
62.
63.//中位值滤波法
64.
65.#defineFILTER_N101
66.
67.intFilter(){
68.
69.intfilter_buf[FILTER_N];
70.
71.inti,j;
72.
73.intfilter_temp;
74.
75.for(i=0;i76.
77.filter_buf[i]=Get_AD();
78.
79.delay
(1);
80.
81.}
82.
83.//采样值从小到大排列(冒泡法)
84.
85.for(j=0;j86.
87.for(i=0;i88.
89.if(filter_buf[i]>filter_buf[i+1]){
90.
91.filter_temp=filter_buf[i];
92.
93.filter_buf[i]=filter_buf[i+1];
94.
95.filter_buf[i+1]=filter_temp;
96.
97.}
98.
99.}
100.
101.}
102.
103.returnfilter_buf[(FILTER_N-1)/2];
104.
105.}
106.
3、算术平均滤波法
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-01
15.*/
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_N12
37.intFilter(){
38.inti;
39.intfilter_sum=0;
40.for(i=0;i41.filter_sum+=Get_AD();
42.delay
(1);
43.}
44.return(int)(filter_sum/FILTER_N);
45.}
1./*
2.
3.A、名称:
算术平均滤波法
4.
5.B、方法:
6.
7.连续取N个采样值进行算术平均运算:
8.
9.N值较大时:
信号平滑度较高,但灵敏度较低;
10.
11.N值较小时:
信号平滑度较低,但灵敏度较高;
12.
13.N值的选取:
一般流量,N=12;压力:
N=4。
14.
15.C、优点:
16.
17.适用于对一般具有随机干扰的信号进行滤波;
18.
19.这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。
20.
21.D、缺点:
22.
23.对于测量速度较慢或要求数据计算速度较快的实时控制不适用;
24.
25.比较浪费RAM。
26.
27.E、整理:
shenhaiyu2013-11-01
28.
29.*/
30.
31.
32.
33.intFilter_Value;
34.
35.
36.
37.voidsetup(){
38.
39.Serial.begin(9600);//初始化串口通信
40.
41.randomSeed(analogRead(0));//产生随机种子
42.
43.}
44.
45.
46.
47.voidloop(){
48.
49.Filter_Value=Filter();//获得滤波器输出值
50.
51.Serial.println(Filter_Value);//串口输出
52.
53.delay(50);
54.
55.}
56.
57.
58.
59.//用于随机产生一个300左右的当前值
60.
61.intGet_AD(){
62.
63.returnrandom(295,305);
64.
65.}
66.
67.
68.
69.//算术平均滤波法
70.
71.#defineFILTER_N12
72.
73.intFilter(){
74.
75.inti;
76.
77.intfilter_sum=0;
78.
79.for(i=0;i80.
81.filter_sum+=Get_AD();
82.
83.delay
(1);
84.
85.}
86.
87.return(int)(filter_sum/FILTER_N);
88.
89.}
90.
4、递推平均滤波法(又称滑动平均滤波法)
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-01
17.*/
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_N12
39.intfilter_buf[FILTER_N+1];
40.intFilter(){
41.inti;
42.intfilter_sum=0;
43.filter_buf[FILTER_N]=Get_AD();
44.for(i=0;i45.filter_buf[i]=filter_buf[i+1];//所有数据左移,低位仍掉
46.filter_sum+=filter_buf[i];
47.}
48.return(int)(filter_sum/FILTER_N);
49.}
1./*
2.
3.A、名称:
递推平均滤波法(又称滑动平均滤波法)
4.
5.B、方法:
6.
7.把连续取得的N个采样值看成一个队列,队列的长度固定为N,
8.
9.每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),
10.
11.把队列中的N个数据进行算术平均运算,获得新的滤波结果。
12.
13.N值的选取:
流量,N=12;压力,N=4;液面,N=4-12;温度,N=1-4。
14.
15.C、优点:
16.
17.对周期性干扰有良好的抑制作用,平滑度高;
18.
19.适用于高频振荡的系统。
20.
21.D、缺点:
22.
23.灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差;
24.
25.不易消除由于脉冲干扰所引起的采样值偏差;
26.
27.不适用于脉冲干扰比较严重的场合;
28.
29.比较浪费RAM。
30.
31.E、整理:
shenhaiyu2013-11-01
32.
33.*/
34.
35.
36.
37.intFilter_Value;
38.
39.
40.
41.voidsetup(){
42.
43.Serial.begin(9600);//初始化串口通信
44.
45.randomSeed(analogRead(0));//产生随机种子
46.
47.}
48.
49.
50.
51.voidloop(){
52.
53.Filter_Value=Filter();//获得滤波器输出值
54.
55.Serial.println(Filter_Value);//串口输出
56.
57.delay(50);
58.
59.}
60.
61.
62.
63.//用于随机产生一个300左右的当前值
64.
65.intGet_AD(){
66.
67.returnrandom(295,305);
68.
69.}
70.
71.
72.
73.//递推平均滤波法(又称滑动平均滤波法)
74.
75.#defineFILTER_N12
76.
77.intfilter_buf[FILTER_N+1];
78.
79.intFilter(){
80.
81.inti;
82.