文章

滤波算法

滤波算法

filtfilt

filtfilt算法是一种双向滤波算法, 用于去除信号中的噪声. 相当于将数据 padding 之后使用lfilter两次, 第二次将数据反转.

对于给定的滤波器参数a, b, 长度为维度n的两倍. 滤波后的数据只与该点及前n-1个点有关. $a_i$ 和 $b_i$ 用 $a_0$ 归一化.

\[y_i=\sum_{k=0}^M{b_k x_{i-k}}-\sum_{k=1}^M{a_k y_{i-k}}=b_0 x_i+\sum_{k=1}^M{(b_k x_{i-k}-a_k y_{i-k})}\]

其中 $M$ 表示滤波器的阶数, ab的长度为M+1. 要求M<i.

scipy 的实现方法

具体实现为{{TNAME}}_filt 函数

\[z_{i,j}=z_{i-1,j+1}+x_ib_{j+1}-y_ia_{j+1},\quad j\in\{1,M-1\},i\in\{0,N\}\]

对于 $i+j+1<M$, 有

\[\begin{align*}z_{i,j}=&x_ib_{j+1}-y_ia_{j+1}+(x_{i-1}b_{j+2}-y_{i-1}a_{j+2})+z_{i-2,j+2}=\cdots\\ =&z_{-1,j+i+1}+\sum_{k=0}^i(x_kb_{i+j+1-k}-y_ka_{i+j+1-k})\\ =&\underset{0}{z_{-1,j+i+1}}+\sum_{k=j+1}^{i+j+1}(b_kx_{i+j+1-k}-a_ky_{i+j+1-k}) \end{align*}\]

否则

\[z_{i,j}=z_{i+j-M,M}+\sum_{k=j+1}^M(b_kx_{i+j+1-k}-a_ky_{i+j+1-k})\]

\[y_i = b_0x_i+z_{i-1,0}\]

这个算法的优点是, 保存a, b, 上个状态的zy, 给每个新的数据点都能计算出新的y值. 但是, 由于需要保存zy, 空间复杂度为$O(M)$.

本文由作者按照 CC BY 4.0 进行授权