数据滤波算法集合

本文汇总了多种数据滤波算法,包括限幅滤波、中位值滤波、算术平均滤波、中位值平均滤波、限幅平均滤波、递推平均滤波、加权递推平均滤波、消抖滤波、一阶滞后滤波、卡尔曼滤波,以及IIR和FIR数字滤波器,详述每种算法的实现步骤、优缺点及其适用场景。
摘要由CSDN通过智能技术生成

由于要进行数据处理,就利用网络资源总结各种滤波方法以便日后查阅。

一、限幅滤波法

实现步骤:

  1. 根据经验法选择最大偏差值E。
  2. |value_now - value_before| <= E,value_now有效,否则其无效且将其舍弃,最后令value_now = value_before。

实现程序:

#define E 10    //value取值范围为90~110
int value_init = 100;
int filter(int value_now)
{
       if ((value_now - value_before > E) || (value_before - value_now) > E)
       {
              return value_before;
       }
       return value_now;
}

滤波优缺点:
优:可克服偶然误差。
缺:无法抑制周期性干扰;平滑度差。

二、中位值滤波法

实现步骤:

  1. 连续采样N次(N为奇数)
  2. 将其排序(任选一种排序算法)
  3. 只取中间值

实现程序:

#define N 5     //根据传感器性能和主控芯片性能进行设置
int filter(void)
{
   
       int *buf = (int*)malloc(N * sizeof(int));
       char count, i, j, temp;
       for (count = 0; count < N; count++)
       {
   
              buf[count] = get_val(); //获取新的采样值
              delay();    //采样间隔
       }
       for (j = 0; j<N - 1; j++)        //采用冒泡排序
       {
   
              for (i = 0; i<N - j - 1; i++)
              {
   
                     if (buf[i]>buf[i + 1])
                     {
   
                           temp = buf[i];
                           buf[i] = buf[i + 1];
                           buf[i + 1] = temp;
                     }
              }
       }
       freebuf);       //释放内存块
       return buf[(N - 1) / 2];         //返回中间值
}

滤波优缺点:
优:可克服偶然误差;对缓慢变化的数据有很好的滤波效果。
缺:不适用于快速变化的数据。

三、算术平均滤波法

实现步骤:

  1. 取N个数据求均值
    N大 --> 平滑度高,灵敏度低
    N小 --> 平滑度低,灵敏度高
    通常,流量N=12,压力N=4,液面,N=412,温度N=14

实现程序:

#define N 10
int filter(void)
{
   
       int sum = 0, count;
       for (count = 0; count < N; count++)
       {
   
              sum += get_val();    //获取采样值并求和
              delay();
       }
       return (sum / N);
}

滤波优缺点:
优:适用于对一般具有随机干扰的信号进行滤波,信号会在此平均值附近上下波动。
缺:不适用于测量速度慢或要求数据计算快的实时控制;浪费运行内存。

四、中位值平均滤波法(二三结合)

实现步骤:

  1. 采样N个数据并排序
  2. 去掉数组头和尾(去除最大最小值)
  3. 计算(N-2)个数的平均数

实现程序:

#define N 12
int get_val();		//传感器采集数据函数
int filter()
{
   
       char count, i, j;
       int buf[N];
       int sum = 0, temp;
       for (count = 0; count < N; count++)
       {
   
              buf[count] = get_val(<
  • 4
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值