我想过滤掉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?(无其他外部库)
scipy.signal.butter
正在生成不稳定的筛选器:对于稳定的过滤器,最大值必须小于1。不幸的是,代码并没有警告您这一点。在
我怀疑问题是}。在标准化单位中,您试图创建一个2.1e-4的下限,这个值非常小。例如,如果下限是
^{pr2}$b1
,而不是{200.0/nyq
,则滤波器是稳定的:与使用
(b, a)
格式不同,您可以使用更健壮的sos
(二阶节)格式,这是scipy版本0.16中添加的。要使用它,请更改这两行到
SOS滤波器不存在不稳定性问题。在
相关问题 更多 >
编程相关推荐