【路径平滑的方法】n阶低通、高通、带通滤波器原理--用于数据滤波平滑

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理


前言

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!

本文先对**3阶低通滤波器(3阶线性路径平滑)**做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章


提示:以下是本篇文章正文内容

一、如何区分一阶、二阶及高阶滤波器

从电路的角度

简单说就是有几个基本滤波网络。
例如,一个RC网络,就是一阶。信号过了一个RC,然后又过了一个RC,那就是二阶。
滤波网络可以级联,如果信号过了一个二阶网络,再接一个二阶网络,那就可以看作过了个四阶网络

https://www.zhihu.com/zvideo/1399026098550759424
.
.

从数学角度

几个极点,就是几阶
按照传输系数表达式中,关于频率 ω 代数式的最高次数确定
.
.

二、如何区分低通、带通、高通滤波器

低通滤波器(LPF)

从频谱的角度看,频率较低的信号输入可以通过
.

带通滤波器(BPF)

从频谱的角度看,频率再一定范围内的信号输入可以通过
.

高通滤波器

从频谱的角度看,频率较高的信号输入可以通过
.

三、一阶低通数字滤波器(1阶线性路径平滑)

1.一阶低通滤波器(1阶线性路径平滑)原理

一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。

一阶低通数字滤波的算法公式
在这里插入图片描述

式中:α=滤波系数;X(n)=本次采样值;Y(n-1)=上次滤波输出值;Y(n)=本次滤波输出值。 一阶低通滤波法采用本次采样值与上次滤波输出值进行加权,得到有效滤波值,使得输出对输入有反馈作用。

由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值
.
.

2.一阶低通滤波器(1阶线性路径平滑)源码

//lpf_factor:一阶滤波系数 
//oldData:ACC的上一次的数据 
//newData:ACC的最新数据
//算法基础:Yn = a * Xn + (1-a) * Yn-1 
//上式解释:a:滤波系数,其值通常远小于1 ;Xn:本次采样值: Yn-1;上次的滤波输出值;Yn:本次滤波的输出值。
Vector3f ANO_Filter::LPF_1st(Vector3f oldData, Vector3f newData, float lpf_factor)
{
    
    
return oldData * (1 - lpf_factor) + newData * lpf_factor;
}

3.一阶滤波算法的优缺点

一阶低通滤波算法的优缺点:系数越小,滤波结果越平稳,但是灵敏度越低;滤波系数越大,灵敏度越高,但是滤波结果越不稳定。
.
.

四、二阶低通数字滤波器

二阶低通滤波器输出公式

Y(n)= b0xn + b1xn-1 + b2xn-2 - (a1xn-1 + a2*xn-2)

怎么理解这个公式呢?先回顾一下一阶数字滤波器的表达式
在这里插入图片描述
二阶低通滤波器就是在一阶低通滤波器的基础上再级联一个一阶低通滤波器,公式上理解就是把一阶低通滤波器的输出Y(n)看成输入,套到第二个一阶低通滤波器中,两个滤波器不同的是,α的系数不同

用这样不断递归的思想,就可以把一阶滤波器推导到高阶滤波器~通过调整每个递归级联的滤波器系数α就会有不同的滤波效果
.
.

五、3阶低通数字滤波器(3阶线性路径平滑)

1.3阶低通滤波器(3阶线性路径平滑)理论

Y(n)=从下面的程序往上推

.
.

2.3阶低通滤波器(3阶线性路径平滑)源码

 /**
   * @brief 3阶线性路径平滑
   * @param in_path     输入的路径
   * @param out_path    输出的路径
   * @param onlie_state 之前的点
   */

void PathSmooth::PathSmooth3(Vector2dX in_path, Vector2dX &out_path,
                             Vector2dX &onlie_state)
{
    
    
  out_path.clear();//清空输出的路径
  Eigen::Matrix<double, 1, 2> point;
  for (int i = 0; i < in_path.size(); i++)
  {
    
    
    point = in_path[i];
    Filter3(onlie_state, point, 1.8, 0.6, 1, 0.4);  //进行3阶线性路径平滑
    out_path.push_back(point);                      //把平滑后的路径点放入队列

    //记录之前的三个点(仅仅用着三个点进行滤波--所谓三阶)
    onlie_state[0] = onlie_state[1];
    onlie_state[1] = onlie_state[2];
    onlie_state[2] = point;
  }
}

// 3阶低通滤波器
void PathSmooth::Filter3(Vector2dX onlie_state,
                         Eigen::Matrix<double, 1, 2> &point, double wn,
                         double xita, double T, double dt) 
{
    
    
  double a = T + 2 * xita * wn;
  double b = pow(wn, 2) + 2 * xita * wn * T;
  double c = pow(wn, 2) * T;
  double d = pow(dt, 2);
  double e = pow(dt, 3);

  Eigen::Matrix<double, 1, 2> p;
  p = point;
  point = (3 - a * dt) * onlie_state[2] +
          (2 * a * dt - b * d - 3) * onlie_state[1] +
          (1 - a * dt + b * d - c * e) * onlie_state[0] + 
          e * c * p;
}

总结

(1)阶数越高,整定的参数越多,一般我用到三阶就差不多了(三阶已经有四个参数了)
(2)如何选择高通、带通、低通滤波器主要看信号的特性

.
.

参考资料

https://zhuanlan.zhihu.com/p/115560016?ivk_sa=1024320u

https://blog.csdn.net/zhuhui4893/article/details/96476291

http://blog.sina.com.cn/s/blog_a7c0455c0102y9og.html

http://www.playuav.com/article/77

https://zhuanlan.zhihu.com/p/58117237
(常用的就够用了)

猜你喜欢

转载自blog.csdn.net/qq_35635374/article/details/121384032