十大滤波算法精修订
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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./*
44.else
45.returnNewValue;
46.}
2、中位值滤波法
ARDUINO 代码
1./*
2.A、名称:中位值滤波法
3.B、方法:
4.连续采样N次(N取奇数),把N次采样值按大小排列,
5.取中间值为本次有效值。
6.C、优点:
7.能有效克服因偶然因素引起的波动干扰;
8.对温度、液位的变化缓慢的被测参数有良好的滤波效果。
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.}
2.A、名称:递推平均滤波法(又称滑动平均滤波法)
3.B、方法:
4.把连续取得的N个采样值看成一个队列,队列的长度固定为N,
5.每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),
6.把队列中的N个数据进行算术平均运算,获得新的滤波结果。
7.N值的选取:流量,N=12;压力,N=4;液面,N=4-12;温度,N=1-4。
19.}
20.?
21.voidloop(){
22.Filter_Value = Filter();// 获得滤波器输出值
23.Serial.println(Filter_Value);// 串口输出
24.delay(50);
25.}
26.?
27.// 用于随机产生一个300左右的当前值
28.intGet_AD(){
38.#define FILTER_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; i < FILTER_N; i++){
9.C、优点:
10.融合了“中位值滤波法”+“算术平均滤波法”两种滤波法的优点。
11.对于偶然出现的脉冲性干扰,可消除由其所引起的采样值偏差。
12.对周期干扰有良好的抑制作用。
13.平滑度高,适于高频振荡的系统。
14.D、缺点:
15.计算速度较慢,和算术平均滤波法一样。
16.比较浪费RAM。
17.E、整理:shenhaiyu 2013-11-01
70.int filter_max, filter_min;
71.int filter_buf[FILTER_N];
72.for(i = 0; i < FILTER_N; i++) {
21.randomSeed(analogRead(0));// 产生随机种子
22.Value =300;
23.}
24.?
25.voidloop(){
26.Filter_Value = Filter();// 获得滤波器输出值
27.Value = Filter_Value;// 最近一次有效采样的值,该变量为全局变量
3、算术平均滤波法
ARDUINO 代码
1./*
2.A、名称:算术平均滤波法
3.B、方法:
4.连续取N个采样值进行算术平均运算:
5.N值较大时:信号平滑度较高,但灵敏度较低;
6.N值较小时:信号平滑度较低,但灵敏度较高;
7.N值的选取:一般流量,N=12;压力:N=4。
8.C、优点:
9.适用于对一般具有随机干扰的信号进行滤波;
60.returnfilter_sum /(FILTER_N -2);
61.}
62.?
63.?
64.//中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法2)
65./*
66.#define FILTER_N 100
67.int Filter() {
68.int i;
69.int filter_sum = 0;
18.*/
19.?
20.intFilter_Value;
21.?
22.voidsetup(){
23.Serial.begin(9600);// 初始化串口通信
24.randomSeed(analogRead(0));// 产生随机种子
25.}
26.?
27.voidloop(){
28.Filter_Value = Filter();// 获得滤波器输出值
8.C、优点:
9.对周期性干扰有良好的抑制作用,平滑度高;
10.适用于高频振荡的系统。
11.D、缺点:
12.灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差;
13.不易消除由于脉冲干扰所引起的采样值偏差;
14.不适用于脉冲干扰比较严重的场合;
15.比较浪费RAM。
16.E、整理:shenhaiyu 2013-11-01
39.#define FILTER_N100
40.intFilter(){
41.inti, j;
42.intfilter_temp, filter_sum =0;
43.intfilter_buf[FILTER_N];
44.for(i =0; i < FILTER_N; i++){
45.filter_buf[i]= Get_AD();
9.D、缺点:
10.对流量、速度等快速变化的参数不宜。
11.E、整理:shenhaiyu 2013-11-01
12.*/
13.?
14.intFilter_Value;
15.?
16.voidsetup(){
17.Serial.begin(9600);// 初始化串口通信
18.randomSeed(analogRead(0));// 产生随机种子
20.Serial.begin(9600);// 初始化串口通信
21.randomSeed(analogRead(0));// 产生随机种子
22.}
23.?
24.voidloop(){
25.Filter_Value = Filter();// 获得滤波器输出值
26.Serial.println(Filter_Value);// 串口输出
28.Serial.println(Filter_Value);// 串口输出
29.delay(50);
30.}
31.?
32.// 用于随机产生一个300左右的当前值
33.intGet_AD(){
34.returnrandom(295,305);
35.}
36.?
37.// 递推平均滤波法(又称滑动平均滤波法)
53.filter_buf[i]= filter_buf[i +1];
54.filter_buf[i +1]= filter_temp;
55.}
56.}
57.}
58.// 去除最大最小极值后求平均
59.for(i =1; i < FILTER_N -1; i++)filter_sum += filter_buf[i];
10.这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。
11.D、缺点:
12.对于测量速度较慢或要求数据计算速度较快的实时控制不适用;
13.比较浪费RAM。
14.E、整理:shenhaiyu 2013-11-01
15.*/
16.?
17.intFilter_Value;
18.?
19.voidsetup(){
29.returnrandom(295,305);
30.}
31.?
32.// 中位值滤波法
33.#define FILTER_N101
34.intFilterபைடு நூலகம்){
35.intfilter_buf[FILTER_N];
36.inti, j;
37.intfilter_temp;
38.for(i =0; i < FILTER_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。
38.#define FILTER_A1
39.intFilter(){
40.intNewValue;
41.NewValue = Get_AD();
42.if(((NewValue - Value)> FILTER_A)||((Value - NewValue)> FILTER_A))
43.returnValue;
十大滤波算法
1、限幅滤波法(又称程序判断滤波法)
ARDUINO 代码
1./*
2.A、名称:限幅滤波法(又称程序判断滤波法)
3.B、方法:
4.根据经验判断,确定两次采样允许的最大偏差值(设为A),
5.每次检测到新值时判断:
6.如果本次值与上次值之差<=A,则本次值有效,
7.如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。
39.filter_buf[i]= Get_AD();
40.delay(1);
41.}
42.// 采样值从小到大排列(冒泡法)
43.for(j =0; j < FILTER_N -1; j++){
44.for(i =0; i < FILTER_N -1- j; i++){
45.if(filter_buf[i]> filter_buf[i +1]){
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_buf[i]> filter_buf[i +1]){
52.filter_temp = filter_buf[i];
28.Serial.println(Filter_Value);// 串口输出
29.delay(50);
30.}
31.?
32.// 用于随机产生一个300左右的当前值
33.intGet_AD(){
34.returnrandom(295,305);
35.}
36.?
37.// 限幅滤波法(又称程序判断滤波法)
29.Serial.println(Filter_Value);// 串口输出
30.delay(50);
31.}
32.?
33.// 用于随机产生一个300左右的当前值
34.intGet_AD(){
35.returnrandom(295,305);
36.}
37.?
38.// 中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法1)
17.*/
18.?
19.intFilter_Value;
20.?
21.voidsetup(){
22.Serial.begin(9600);// 初始化串口通信
23.randomSeed(analogRead(0));// 产生随机种子
24.}
25.?
26.voidloop(){
27.Filter_Value = Filter();// 获得滤波器输出值
8.C、优点:
9.能有效克服因偶然因素引起的脉冲干扰。
10.D、缺点:
11.无法抑制那种周期性的干扰。
12.平滑度差。
13.E、整理:shenhaiyu 2013-11-01
14.*/
15.?
16.intFilter_Value;
17.intValue;
18.?
19.voidsetup(){
20.Serial.begin(9600);// 初始化串口通信
27.delay(50);
28.}
29.?
30.// 用于随机产生一个300左右的当前值
31.intGet_AD(){
32.returnrandom(295,305);
33.}
34.?
35.// 算术平均滤波法
36.#define FILTER_N12
37.intFilter(){
38.inti;
39.intfilter_sum =0;
41.filter_sum += Get_AD();
42.delay(1);
43.}
44.return(int)(filter_sum / FILTER_N);
45.}
4、递推平均滤波法(又称滑动平均滤波法)
ARDUINO 代码
1./*
44.else
45.returnNewValue;
46.}
2、中位值滤波法
ARDUINO 代码
1./*
2.A、名称:中位值滤波法
3.B、方法:
4.连续采样N次(N取奇数),把N次采样值按大小排列,
5.取中间值为本次有效值。
6.C、优点:
7.能有效克服因偶然因素引起的波动干扰;
8.对温度、液位的变化缓慢的被测参数有良好的滤波效果。
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.}
2.A、名称:递推平均滤波法(又称滑动平均滤波法)
3.B、方法:
4.把连续取得的N个采样值看成一个队列,队列的长度固定为N,
5.每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),
6.把队列中的N个数据进行算术平均运算,获得新的滤波结果。
7.N值的选取:流量,N=12;压力,N=4;液面,N=4-12;温度,N=1-4。
19.}
20.?
21.voidloop(){
22.Filter_Value = Filter();// 获得滤波器输出值
23.Serial.println(Filter_Value);// 串口输出
24.delay(50);
25.}
26.?
27.// 用于随机产生一个300左右的当前值
28.intGet_AD(){
38.#define FILTER_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; i < FILTER_N; i++){
9.C、优点:
10.融合了“中位值滤波法”+“算术平均滤波法”两种滤波法的优点。
11.对于偶然出现的脉冲性干扰,可消除由其所引起的采样值偏差。
12.对周期干扰有良好的抑制作用。
13.平滑度高,适于高频振荡的系统。
14.D、缺点:
15.计算速度较慢,和算术平均滤波法一样。
16.比较浪费RAM。
17.E、整理:shenhaiyu 2013-11-01
70.int filter_max, filter_min;
71.int filter_buf[FILTER_N];
72.for(i = 0; i < FILTER_N; i++) {
21.randomSeed(analogRead(0));// 产生随机种子
22.Value =300;
23.}
24.?
25.voidloop(){
26.Filter_Value = Filter();// 获得滤波器输出值
27.Value = Filter_Value;// 最近一次有效采样的值,该变量为全局变量
3、算术平均滤波法
ARDUINO 代码
1./*
2.A、名称:算术平均滤波法
3.B、方法:
4.连续取N个采样值进行算术平均运算:
5.N值较大时:信号平滑度较高,但灵敏度较低;
6.N值较小时:信号平滑度较低,但灵敏度较高;
7.N值的选取:一般流量,N=12;压力:N=4。
8.C、优点:
9.适用于对一般具有随机干扰的信号进行滤波;
60.returnfilter_sum /(FILTER_N -2);
61.}
62.?
63.?
64.//中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法2)
65./*
66.#define FILTER_N 100
67.int Filter() {
68.int i;
69.int filter_sum = 0;
18.*/
19.?
20.intFilter_Value;
21.?
22.voidsetup(){
23.Serial.begin(9600);// 初始化串口通信
24.randomSeed(analogRead(0));// 产生随机种子
25.}
26.?
27.voidloop(){
28.Filter_Value = Filter();// 获得滤波器输出值
8.C、优点:
9.对周期性干扰有良好的抑制作用,平滑度高;
10.适用于高频振荡的系统。
11.D、缺点:
12.灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差;
13.不易消除由于脉冲干扰所引起的采样值偏差;
14.不适用于脉冲干扰比较严重的场合;
15.比较浪费RAM。
16.E、整理:shenhaiyu 2013-11-01
39.#define FILTER_N100
40.intFilter(){
41.inti, j;
42.intfilter_temp, filter_sum =0;
43.intfilter_buf[FILTER_N];
44.for(i =0; i < FILTER_N; i++){
45.filter_buf[i]= Get_AD();
9.D、缺点:
10.对流量、速度等快速变化的参数不宜。
11.E、整理:shenhaiyu 2013-11-01
12.*/
13.?
14.intFilter_Value;
15.?
16.voidsetup(){
17.Serial.begin(9600);// 初始化串口通信
18.randomSeed(analogRead(0));// 产生随机种子
20.Serial.begin(9600);// 初始化串口通信
21.randomSeed(analogRead(0));// 产生随机种子
22.}
23.?
24.voidloop(){
25.Filter_Value = Filter();// 获得滤波器输出值
26.Serial.println(Filter_Value);// 串口输出
28.Serial.println(Filter_Value);// 串口输出
29.delay(50);
30.}
31.?
32.// 用于随机产生一个300左右的当前值
33.intGet_AD(){
34.returnrandom(295,305);
35.}
36.?
37.// 递推平均滤波法(又称滑动平均滤波法)
53.filter_buf[i]= filter_buf[i +1];
54.filter_buf[i +1]= filter_temp;
55.}
56.}
57.}
58.// 去除最大最小极值后求平均
59.for(i =1; i < FILTER_N -1; i++)filter_sum += filter_buf[i];
10.这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。
11.D、缺点:
12.对于测量速度较慢或要求数据计算速度较快的实时控制不适用;
13.比较浪费RAM。
14.E、整理:shenhaiyu 2013-11-01
15.*/
16.?
17.intFilter_Value;
18.?
19.voidsetup(){
29.returnrandom(295,305);
30.}
31.?
32.// 中位值滤波法
33.#define FILTER_N101
34.intFilterபைடு நூலகம்){
35.intfilter_buf[FILTER_N];
36.inti, j;
37.intfilter_temp;
38.for(i =0; i < FILTER_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。
38.#define FILTER_A1
39.intFilter(){
40.intNewValue;
41.NewValue = Get_AD();
42.if(((NewValue - Value)> FILTER_A)||((Value - NewValue)> FILTER_A))
43.returnValue;
十大滤波算法
1、限幅滤波法(又称程序判断滤波法)
ARDUINO 代码
1./*
2.A、名称:限幅滤波法(又称程序判断滤波法)
3.B、方法:
4.根据经验判断,确定两次采样允许的最大偏差值(设为A),
5.每次检测到新值时判断:
6.如果本次值与上次值之差<=A,则本次值有效,
7.如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。
39.filter_buf[i]= Get_AD();
40.delay(1);
41.}
42.// 采样值从小到大排列(冒泡法)
43.for(j =0; j < FILTER_N -1; j++){
44.for(i =0; i < FILTER_N -1- j; i++){
45.if(filter_buf[i]> filter_buf[i +1]){
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_buf[i]> filter_buf[i +1]){
52.filter_temp = filter_buf[i];
28.Serial.println(Filter_Value);// 串口输出
29.delay(50);
30.}
31.?
32.// 用于随机产生一个300左右的当前值
33.intGet_AD(){
34.returnrandom(295,305);
35.}
36.?
37.// 限幅滤波法(又称程序判断滤波法)
29.Serial.println(Filter_Value);// 串口输出
30.delay(50);
31.}
32.?
33.// 用于随机产生一个300左右的当前值
34.intGet_AD(){
35.returnrandom(295,305);
36.}
37.?
38.// 中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法1)
17.*/
18.?
19.intFilter_Value;
20.?
21.voidsetup(){
22.Serial.begin(9600);// 初始化串口通信
23.randomSeed(analogRead(0));// 产生随机种子
24.}
25.?
26.voidloop(){
27.Filter_Value = Filter();// 获得滤波器输出值
8.C、优点:
9.能有效克服因偶然因素引起的脉冲干扰。
10.D、缺点:
11.无法抑制那种周期性的干扰。
12.平滑度差。
13.E、整理:shenhaiyu 2013-11-01
14.*/
15.?
16.intFilter_Value;
17.intValue;
18.?
19.voidsetup(){
20.Serial.begin(9600);// 初始化串口通信
27.delay(50);
28.}
29.?
30.// 用于随机产生一个300左右的当前值
31.intGet_AD(){
32.returnrandom(295,305);
33.}
34.?
35.// 算术平均滤波法
36.#define FILTER_N12
37.intFilter(){
38.inti;
39.intfilter_sum =0;