cupyx.scipy.signal.lfilter#

cupyx.scipy.signal.lfilter(b, a, x, axis=-1, zi=None)[source]#

使用 IIR 或 FIR 滤波器沿一维过滤数据。

使用数字滤波器对数据序列 x 进行滤波。这适用于许多基本数据类型(包括 Object 类型)。该滤波器是标准差分方程的直接形式 II 转置实现(参见注)。

对于大多数滤波任务,应优先使用函数 sosfilt(以及使用 output='sos' 进行的滤波器设计),因为二阶节具有较少的数值问题。

参数:
  • b (array_like) – 1维序列中的分子系数向量。

  • a (array_like) – 1维序列中的分母系数向量。如果 a[0] 不为 1,则 ab 都将由 a[0] 进行归一化。

  • x (array_like) – N维输入数组。

  • axis (int, optional) – 应用线性滤波器的输入数据数组的轴。滤波器将应用于沿此轴的每个子数组。默认为 -1。

  • zi (array_like, optional) –

    滤波器延迟的初始条件。它是一个长度为 len(b) + len(a) - 2 的向量(对于 N 维输入,是一个向量数组)。前 len(b) 个数对应于前一个输入的最后几个元素,后 len(a) 个数对应于前一个输出的最后几个元素。如果 zi 为 None 或未给出,则假定初始状态为静止。有关更多信息,请参阅 lfiltic

    注意: 此参数的维度与 SciPy 实现不同!但是,只要它们链接自同一库,输出结果将是相同的。请确保使用 CuPy 调用中的 zi,而不是 SciPy 中的。这是由于此实现是并行性质的,而 SciPy 中的是串行性质的。

返回值:

  • y (array) – 数字滤波器的输出。

  • zf (array, optional) – 如果 zi 为 None,则不返回此值;否则,zf 包含最终的滤波器延迟值。

另请参见

lfiltic

lfilter 构造初始条件。

lfilter_zi

计算 lfilter 的初始状态(阶跃响应的稳态)。

filtfilt

一种前向-后向滤波器,用于获得零相位滤波器。

savgol_filter

Savitzky-Golay 滤波器。

sosfilt

使用级联二阶节对数据进行滤波。

sosfiltfilt

一种使用二阶节的前向-后向滤波器。

滤波器函数实现为直接形式 II 转置结构。这意味着滤波器实现了

a[0]*y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[M]*x[n-M]
                      - a[1]*y[n-1] - ... - a[N]*y[n-N]

其中 M 是分子阶数,N 是分母阶数,n 是样本编号,L 表示输入的长度。其实现方式是先计算 FIR 部分,然后从中计算 IIR 部分

a[0] * y = r(f(x, b), a)
f(x, b)[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[M]*x[n-M]
r(y, a)[n] = - a[1]*y[n-1] - ... - a[N]*y[n-N]

IIR 结果通过先将输入信号分割成大小为 m 的块(g_i)来并行计算。对于每个块,将 IIR 递推方程应用于每个块(并行)。然后根据最后一个块的最后 N 个值合并这些块

nc = L/m
x = [g_0, g_1, ..., g_nc]

g_i = [x[i * m], ..., x[i * m + m - 1]]
p_i = r(g_i, a)

o_i = r(p_i, c(p_{i - 1}))   if i > 1,
      r(p_i, zi)             otherwise

y = [o_0, o_1, ..., o_nc]

其中 c 表示一个函数,它接收一个块,截取最后 N 个值,并使用通过 (1, 2, …, N) 斐波那契序列计算出的校正因子表对其进行调整。更多信息请参阅 [1]

在 z 变换域中描述该滤波器的有理传递函数为

                    -1              -M
        b[0] + b[1]z  + ... + b[M] z
Y(z) = -------------------------------- X(z)
                    -1              -N
        a[0] + a[1]z  + ... + a[N] z

参考文献