十大滤波算法程序大全

程序默认对int类型数据进行滤波,如需要对其他类型进行滤波,只需要把程序中所有int替换成long、float或者double即可。

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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从入门到捕蛇者说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值