滤波算法
 滤波算法 
 filtfilt
filtfilt算法是一种双向滤波算法, 用于去除信号中的噪声. 相当于将数据 padding 之后使用lfilter两次, 第二次将数据反转.
对于给定的滤波器参数a, b, 长度为维度n的两倍. 滤波后的数据只与该点及前n-1个点有关. $a_i$ 和 $b_i$ 用 $a_0$ 归一化.
其中 $M$ 表示滤波器的阶数, a和b的长度为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, 上个状态的z和y, 给每个新的数据点都能计算出新的y值. 但是, 由于需要保存z和y, 空间复杂度为$O(M)$.
 本文由作者按照  CC BY 4.0  进行授权