11种滤波算法程序⼤全(含源代码分享)1、限幅滤波法(⼜称程序判断滤波法)
/*
A、名称:限幅滤波法(⼜称程序判断滤波法)
B、⽅法:
根据经验判断,确定两次采样允许的最⼤偏差值(设为A),
每次检测到新值时判断:
如果本次值与上次值之差<=A,则本次值有效,
如果本次值与上次值之差>A,则本次值⽆效,放弃本次值,⽤上次值代替本次值。
C、优点:
能有效克服因偶然因素引起的脉冲⼲扰。
D、缺点:
⽆法抑制那种周期性的⼲扰。
平滑度差。
E、整理:shenhaiyu 2013-11-01
*/
int Filter_Value;
int Value;
void setup(){
Serial.begin(9600);// 初始化串⼝通信
randomSeed(analogRead(0));// 产⽣随机种⼦
Value =300;
}
void loop(){
Filter_Value =Filter();// 获得滤波器输出值
Value = Filter_Value;// 最近⼀次有效采样的值,该变量为全局变量
Serial.println(Filter_Value);// 串⼝输出
delay(50);
}
// ⽤于随机产⽣⼀个300左右的当前值
int Get_AD(){
return random(295,305);
}
// 限幅滤波法(⼜称程序判断滤波法)
#define FILTER_A 1
int Filter(){
int NewValue;
NewValue =Get_AD();
if(((NewValue - Value)> FILTER_A)||((Value - NewValue)> FILTER_A))
return Value;
else
return NewValue;
}
2、中位值滤波法
/*
A、名称:中位值滤波法
B、⽅法:
连续采样N次(N取奇数),把N次采样值按⼤⼩排列,取中间值为本次有效值。
C、优点:
能有效克服因偶然因素引起的波动⼲扰;
对温度、液位的变化缓慢的被测参数有良好的滤波效果。
D、缺点:
对流量、速度等快速变化的参数不宜。
E、整理:shenhaiyu 2013-11-01
*/
int Filter_Value;
void setup(){
Serial.begin(9600);// 初始化串⼝通信randomSeed(analogRead(0));// 产⽣随机种⼦
}
void loop(){
Filter_Value =Filter();// 获得滤波器输出值
Serial.println(Filter_Value);// 串⼝输出
delay(50);
}
// ⽤于随机产⽣⼀个300左右的当前值
int Get_AD(){
return random(295,305);
}
// 中位值滤波法
#define FILTER_N 101
int Filter(){
int filter_buf[FILTER_N];
int i, j;
int filter_temp;
for(i =0; i < FILTER_N; i++){
filter_buf[i]=Get_AD();
delay(1);
}
/
/ 采样值从⼩到⼤排列(冒泡法)
for(j =0; j < FILTER_N -1; j++){
for(i =0; i < FILTER_N -1- j; i++){
if(filter_buf[i]> filter_buf[i +1]){
filter_temp = filter_buf[i];
filter_buf[i]= filter_buf[i +1];
filter_buf[i +1]= filter_temp;
}
}
}
return filter_buf[(FILTER_N -1)/2];
}
3、算术平均滤波法
/*
A、名称:算术平均滤波法
B、⽅法:
连续取N个采样值进⾏算术平均运算:
N值较⼤时:信号平滑度较⾼,但灵敏度较低;
N值较⼩时:信号平滑度较低,但灵敏度较⾼;
N值的选取:⼀般流量,N=12;压⼒:N=4。
C、优点:
适⽤于对⼀般具有随机⼲扰的信号进⾏滤波;
这种信号的特点是有⼀个平均值,信号在某⼀数值范围附近上下波动。
D、缺点:
对于测量速度较慢或要求数据计算速度较快的实时控制不适⽤;
⽐较浪费RAM。
E、整理:shenhaiyu 2013-11-01
*/
int Filter_Value;
void setup(){
Serial.begin(9600);// 初始化串⼝通信
randomSeed(analogRead(0));// 产⽣随机种⼦
}
void loop(){
Filter_Value =Filter();// 获得滤波器输出值
源代码大电影Serial.println(Filter_Value);// 串⼝输出
delay(50);
}
// ⽤于随机产⽣⼀个300左右的当前值
int Get_AD(){
return random(295,305);
}
// 算术平均滤波法
#define FILTER_N 12
int Filter(){
int i;
int filter_sum =0;
for(i =0; i < FILTER_N; i++){
filter_sum +=Get_AD();
delay(1);
}
return(int)(filter_sum / FILTER_N);
}
4、递推平均滤波法(⼜称滑动平均滤波法)
/*
A、名称:递推平均滤波法(⼜称滑动平均滤波法)
B、⽅法:
把连续取得的N个采样值看成⼀个队列,队列的长度固定为N,
每次采样到⼀个新数据放⼊队尾,并扔掉原来队⾸的⼀次数据(先进先出原则),把队列中的N个数据进⾏算术平均运算,获得新的滤波结果。
N值的选取:流量,N=12;压⼒,N=4;液⾯,N=4-12;温度,N=1-4。
C、优点:
对周期性⼲扰有良好的抑制作⽤,平滑度⾼;
适⽤于⾼频振荡的系统。
D、缺点:
灵敏度低,对偶然出现的脉冲性⼲扰的抑制作⽤较差;
不易消除由于脉冲⼲扰所引起的采样值偏差;
不适⽤于脉冲⼲扰⽐较严重的场合;
⽐较浪费RAM。
E、整理:shenhaiyu 2013-11-01
*/
int Filter_Value;
void setup(){
Serial.begin(9600);// 初始化串⼝通信
randomSeed(analogRead(0));// 产⽣随机种⼦
}
void loop(){
Filter_Value =Filter();// 获得滤波器输出值
Serial.println(Filter_Value);// 串⼝输出
delay(50);
}
// ⽤于随机产⽣⼀个300左右的当前值
int Get_AD(){
return random(295,305);
}
// 递推平均滤波法(⼜称滑动平均滤波法)
#define FILTER_N 12
int filter_buf[FILTER_N +1];
int Filter(){
int i;
int filter_sum =0;
filter_buf[FILTER_N]=Get_AD();
for(i =0; i < FILTER_N; i++){
filter_buf[i]= filter_buf[i +1];// 所有数据左移,低位仍掉
filter_sum += filter_buf[i];
}
return(int)(filter_sum / FILTER_N);
}
5、中位值平均滤波法(⼜称防脉冲⼲扰平均滤波法)
/*
A、名称:中位值平均滤波法(⼜称防脉冲⼲扰平均滤波法)
B、⽅法:
采⼀组队列去掉最⼤值和最⼩值后取平均值,
相当于“中位值滤波法”+“算术平均滤波法”。
连续采样N个数据,去掉⼀个最⼤值和⼀个最⼩值,
然后计算N-2个数据的算术平均值。
N值的选取:3-14。
C、优点:
融合了“中位值滤波法”+“算术平均滤波法”两种滤波法的优点。
对于偶然出现的脉冲性⼲扰,可消除由其所引起的采样值偏差。
对周期⼲扰有良好的抑制作⽤。
平滑度⾼,适于⾼频振荡的系统。
D、缺点:
计算速度较慢,和算术平均滤波法⼀样。
⽐较浪费RAM。
E、整理:shenhaiyu 2013-11-01
*/
int Filter_Value;
void setup(){
Serial.begin(9600);// 初始化串⼝通信
randomSeed(analogRead(0));// 产⽣随机种⼦
}
void loop(){
Filter_Value =Filter();// 获得滤波器输出值
Serial.println(Filter_Value);// 串⼝输出
delay(50);
}
// ⽤于随机产⽣⼀个300左右的当前值
int Get_AD(){
return random(295,305);
}
// 中位值平均滤波法(⼜称防脉冲⼲扰平均滤波法)(算法1)
#define FILTER_N 100
int Filter(){
int i, j;
int filter_temp, filter_sum =0;
int filter_buf[FILTER_N];
for(i =0; i < FILTER_N; i++){
filter_buf[i]=Get_AD();
delay(1);
}
// 采样值从⼩到⼤排列(冒泡法)
for(j =0; j < FILTER_N -1; j++){
for(i =0; i < FILTER_N -1- j; i++){
if(filter_buf[i]> filter_buf[i +1]){
filter_temp = filter_buf[i];
filter_buf[i]= filter_buf[i +1];
filter_buf[i +1]= filter_temp;
}
}
}
// 去除最⼤最⼩极值后求平均
for(i =1; i < FILTER_N -1; i++) filter_sum += filter_buf[i];
return filter_sum /(FILTER_N -2);
}
/
/ 中位值平均滤波法(⼜称防脉冲⼲扰平均滤波法)(算法2)
/*
#define FILTER_N 100
int Filter() {
int i;
int filter_sum = 0;
int filter_max, filter_min;
int filter_buf[FILTER_N];
for(i = 0; i < FILTER_N; i++) {
filter_buf[i] = Get_AD();
delay(1);
}
filter_max = filter_buf[0];
filter_min = filter_buf[0];
filter_sum = filter_buf[0];
for(i = FILTER_N - 1; i > 0; i--) {
if(filter_buf[i] > filter_max)
filter_max=filter_buf[i];
else if(filter_buf[i] < filter_min)
filter_min=filter_buf[i];
filter_sum = filter_sum + filter_buf[i];
filter_buf[i] = filter_buf[i - 1];
}
i = FILTER_N - 2;
filter_sum = filter_sum - filter_max - filter_min + i / 2; // +i/2 的⽬的是为了四舍五⼊ filter_sum = filter_sum / i;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论