20hz20000hz巴特沃斯滤波爆炸

2024-09-27 09:32:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想过滤掉20赫兹-20000赫兹以外的一切。我用的是巴特沃斯过滤器:

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.1khz的文件,但是对于96khz的WAV文件不适用(demo file here)(这不是音频I/O问题):输出要么是空白的(静音),要么是爆炸(与其他一些输入WAV文件一起)。在

1)是否有什么原因使巴特沃斯滤波器不能与带通[b1,b2]一起工作,其中b2<;0.5?在

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


Tags: 文件fromioimportnumpy过滤器readsignal
1条回答
网友
1楼 · 发布于 2024-09-27 09:32:10

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,而不是{}。在标准化单位中,您试图创建一个2.1e-4的下限,这个值非常小。例如,如果下限是200.0/nyq,则滤波器是稳定的:

^{pr2}$

与使用(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)

sos = signal.butter(5, [20.0 / nyq, 20000.0 / nyq], btype='band', output='sos')
x = signal.sosfilt(sos, x)

SOS滤波器不存在不稳定性问题。在

相关问题 更多 >

    热门问题