20hz-20000hz 巴特沃斯滤波爆炸

2024-02-21

我想过滤掉 20 Hz - 20000 Hz 之外的所有内容。我正在使用巴特沃斯滤波器:

from scipy.io import wavfile
from scipy import signal
import numpy

sr, x = wavfile.read('sweep.wav')
nyq = 0.5 * sr
b, a = signal.butter(5, [20.0 / nyq, 20000.0 / nyq], btype='band')

x = signal.lfilter(b, a, x)
x = numpy.float32(x)
x /= numpy.max(numpy.abs(x))
wavfile.write('b.wav', sr, x)

我注意到它适用于 44.1 khz 文件,但是不包含 96 khz WAV 文件 (演示文件在这里 http://gget.it/ooeln2hi/sweep.wav)(这不是音频 I/O 问题):输出要么是空白(无声),要么是爆炸(与其他一些输入 wav 文件一起)。

1) 是否有什么因素导致巴特沃斯滤波器无法与带通 [b1, b2] 一起工作,其中 b2

2) 更一般地说,如何使用 Python / scipy 进行过滤以仅保持 20 - 20000Hz?(没有其他外部库)


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 过滤器不会遇到不稳定问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

20hz-20000hz 巴特沃斯滤波爆炸 的相关文章

随机推荐