cupyx.scipy.signal.lfilter#

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

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

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

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

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

  • a (array_like) – 一维序列中的分母系数向量。如果 a[0] 不是 1,那么 ab 都会被 a[0] 归一化。

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

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

  • zi (array_like, optional) – 滤波器延迟的初始条件。它是一个向量(或对于N维输入,是一个向量数组),长度为 len(b) + len(a) - 2。前 len(b) 个数字对应于前一个输入的最后元素,最后 len(a) 个数字对应于前一个输出的最后元素。如果 zi 为 None 或未给出,则假设初始状态为静止。更多信息请参见 lfiltic注意:此参数与 SciPy 实现的维度不同!但是,只要它们来自同一个库,输出结果将是相同的。请确保使用来自 CuPy 调用的 zi,而不是来自 SciPy 的。这是因为此实现的并行性质与 SciPy 中的串行性质不同。

返回:

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

  • zf (数组, 可选) – 如果 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

引用