使用scipy.signal.firwin对WAV文件应用高通滤波器

4
我正在尝试使用scipy.signal.firwin对一个单声道16位44.1 Khz WAV文件应用高通滤波器(截止频率:1000 Hz):
from scipy.io import wavfile
from scipy import signal
import numpy as np

sr, x = wavfile.read('test.wav')      # 16-bit mono 44.1 khz

b = signal.firwin(5, cutoff=1000, fs=sr, pass_zero=False)

x = signal.lfilter(b, [1.0], x)

wavfile.write('test2.wav', sr, x.astype(np.int16))

结果与输入完全相似(但不完全相等),即未应用高通滤波。

我应该如何修改才能使使用 firwin 的高通滤波起作用?


x = lfilt_result = signal.lfilter(b, [1.0], x) 这段代码是否符合Pythonic的规范? - bipll
这是一次错误的复制/粘贴@bipll,谢谢,我已经编辑了问题。但问题在此修复后仍然存在。 - Basj
1
@bipll 即使他没有使用它,我认为这是Pythonic的。不是吗? - Qback
啊,抱歉,我把它和增强赋值混淆了。在Python中,简单的赋值是可以链接的。 - bipll
即使在Python中可以将它们链接起来,我同意@bipll的观点,这样做不是一个好主意:当看到a = b = c时,我们永远不知道分配给什么...丑陋(个人品味)! - Basj
1个回答

3

看起来问题只是滤波器系数的数量:5太少了。

使用

b = signal.firwin(101, cutoff=1000, fs=sr, pass_zero=False)

它的工作效果更好。

注意:在前101个样本中,音频几乎为零,因此我们应该在开头和结尾处对WAV文件进行零填充,然后应用过滤器,然后剪裁文件以去除零填充部分。


顺便提一下,它说“如果通带包括奈奎斯特频率,则 numtaps 必须是偶数”,这似乎是你的情况。 - bipll
我尝试使用偶数个numtaps,但是出现了这个错误:ValueError: A filter with an even number of coefficients must have zero response at the Nyquist frequency. - Basj
2
是的,这份文档在这里似乎有些混乱或矛盾。 - bipll
FYI:firwin的文档字符串中的错误最近已经被修复:https://github.com/scipy/scipy/pull/8849 - Warren Weckesser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接