我正在使用一些 scipy.signal 模块在 python 中设计一个带通滤波器。
我正在绘制滤波器的频率响应,以验证我想要的频率是否在通带内。但是,当我增大采样频率时,我的滤波器的频率响应会完全混乱。
我目前有一个采样 >300KSPS 的信号,并试图为一些相当低的频率(1-100hz)创建一个带通滤波器。有人可以解释为什么会这样吗?
例如,以下代码产生此频率响应:
import numpy as np
import matplotlib.pyplot as plt
import scipy.signal
N = 3
fs = 10000.0
low = 100.0
high = 150.0
nyq = fs * 0.5
Wn = [low/nyq, high/nyq]
b, a = scipy.signal.butter(N, Wn, btype='bandpass')
w, h = scipy.signal.freqz(b, a, worN=round(fs/2))
ax = plt.subplot(121)
ax.set(title='filter frequency response',
xlabel='frequency [hz]',
ylabel='gain',
xlim=(low/2, high*2))
ax.plot((nyq / np.pi) * w, abs(h), label='filter freq response')
ax.axvline(x=125.0, linestyle='--', alpha=0.5, c='black', label='f=125.0')
ax.axhline(y=np.sqrt(0.5), linestyle='--', alpha=0.5, c='black', label='sqrt(0.5)')
ax.grid()
ax.legend()
然后,当我将采样频率更改为 100000.0 时,响应结果是这样的:
fs = 100000.0
编辑:将滤波器输出为二阶部分并使用scipy.signal.sosfreqz产生了正确的滤波器。请参阅下面的代码以获取修改后的行:
sos = scipy.signal.butter(N, Wn, btype='bandpass', output='sos')
w, h = scipy.signal.sosfreqz(sos, worN=round(fs/2))


