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,则 a 和 b 都将由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
参考文献