scipy.signal.butter
正在生成不稳定的过滤器:
In [17]: z, p, k = signal.tf2zpk(b, a)
In [18]: np.max(np.abs(p))
Out[18]: 1.0005162676670694
对于稳定的过滤器,该最大值必须小于 1。不幸的是,代码不会对此发出警告。
我怀疑问题是b1
, not b2
。在标准化单位中,您尝试创建一个较低的截止值 2.1e-4,该值非常小。例如,如果下限截止是200.0/nyq
,滤波器稳定:
In [13]: b, a = signal.butter(5, [200.0 / nyq, 20000.0 / nyq], btype='band')
In [14]: z, p, k = signal.tf2zpk(b, a)
In [15]: np.max(np.abs(p))
Out[15]: 0.99601892668982284
而不是使用(b, a)
对于过滤器的格式,您可以使用更强大的sos
(二阶部分)格式,已添加到 scipy 0.16 版本中。要使用它,请更改这两行
b, a = signal.butter(5, [20.0 / nyq, 20000.0 / nyq], btype='band')
x = signal.lfilter(b, a, x)
to
sos = signal.butter(5, [20.0 / nyq, 20000.0 / nyq], btype='band', output='sos')
x = signal.sosfilt(sos, x)
该 SOS 过滤器不会遇到不稳定问题。