Python 中 signal.filtfilt 中的 Padlen 错误

Error with Padlen in signal.filtfilt in Python

我正在 Python 中使用库 "scipy.signal",我有下一个代码:

from scipy import signal

b = [ 0.001016    0.00507999  0.01015998  0.01015998  0.00507999  0.001016  ]

a = [ 1.         -3.0820186   4.04351697 -2.76126457  0.97291013 -0.14063199]
data = [[ 1.]
[ 1.]
[ 1.]
...]
# length = 264
y = signal.filtfilt(b, a, data)

但是当我执行代码时,我收到下一条错误消息:

The length of the input vector x must be at least padlen, which is 18.

我能做什么?

看来data是一个二维数组,形状为(264, 1)。默认情况下, filtfilt 沿输入数组的最后一个轴进行过滤,因此在您的情况下,它试图沿数据长度为 1 的轴进行过滤,这对于默认填充方法来说不够长。

我假设您打算将 data 解释为一维数组。您可以添加参数 axis=0

y = signal.filtfilt(b, a, data, axis=0)

沿第一个维度(即向下列)进行过滤,在这种情况下,输出 y 也将具有形状 (264, 1)。或者,您可以将输入转换为一维数组,方法是使用 np.ravel(data) 将其展平或使用索引到 select 第一列(也是唯一的)列 data[:, 0]。 (后者仅在 data 实际上是一个 numpy 数组而不是列表列表时才有效。)例如

y = signal.filtfilt(b, a, np.ravel(data))

在这种情况下,输出 y 也将是一个一维数组,形状为 (264,)。

假设您有一个形状为 (264, 2) 的二维数组,您还可以使用 np.hsplit()data 拆分为两个单独的数组,如下所示:

import numpy as np

arr1, arr2 = np.hsplit(data,2)

您可以查看每个单独数组的形状,例如:

print(arr1.shape)

您的代码将如下所示:

y1 = signal.filtfilt(b, a, arr1)
y2 = signal.filtfilt(b, a, arr2)