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,那么 a 和 b 都会被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_filterSavitzky-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
引用