实现 scipy Butterworth 过滤器来对 numpy 数组序列中包含的数据进行操作

问题描述 投票:0回答:1

我已经看过如何使用 scipy Butterworth 过滤器来过滤存储在 numpy 数组中的数据的代码示例。

我需要做一些稍微不同的事情。我想分块处理数据。

举个例子,如果总信号有 4096 个样本长,我想处理前 1024 个样本并输出结果。然后是接下来的 1024 个样本,依此类推。

但是当我连接输出数组时,我希望结果与我在一次操作中处理了所有 4096 个样本一样。

我的猜测是,我需要将过滤器的状态从一个块传送到下一个块,但是任何有关如何执行此操作的指示都会非常有帮助。

我以1024为例。如果有帮助的话,我可以增大或减小缓冲区。但我不能将所有数据放入一个缓冲区中,因为这会限制我可以处理的可用内存的总数据,并且在某些情况下数据可能会大于该数据。

python numpy filter scipy butterworth
1个回答
0
投票

我的猜测是,我需要将过滤器的状态从一个块传送到下一个块,但是任何有关如何执行此操作的指示都会非常有帮助。

是的,这就是你需要做的。

以下是如何使用

scipy.signal.sosfilt()
执行此操作的示例。此示例基于 SciPy 文档中的示例

假设您有一个由 10 Hz 信号和 20 Hz 信号组成的信号。您想要移除 10 Hz 信号并保留 20 Hz 信号。

signal before vs after

通常,您可以在一次通话中完成此操作,如下所示:

filtered = signal.sosfilt(sos, sig)

(其中

sig
是要过滤的信号,
sos
是使用
scipy.signal.butter()
output='sos'
找到的二阶部分滤波器。有关完整代码,请参阅 SciPy 文档中的示例。)

但是您可能希望在内存中不存在整个数组的情况下执行此操作。这是一个分多个步骤执行此操作的示例,在调用之间保持过滤器状态。

sig_split = np.split(sig, 20)
zi = np.zeros((sos.shape[0], 2))
ret = []
for block in sig_split:
    filt, zi = signal.sosfilt(sos, block, zi=zi)
    ret.append(filt)
filtered = np.concatenate(ret)

您可以看到,您可以执行与之前调用相同的操作,并且如果删除传递给 sosfilt 的 zi 参数,则输出不再正确。 (如果你不传递 zi 参数,它看起来像这样。)

另请参阅

sosfilt() 文档。

SciPy 中评估信号滤波器的大多数其他函数也接受

zi

 参数,您可以对它们执行类似的操作。

© www.soinside.com 2019 - 2024. All rights reserved.