巴特沃斯带通滤波器

信息处理 过滤器 Python 数字滤波器 巴特沃思 scipy
2022-02-06 05:52:14

我正在尝试构建一个巴特沃斯带通滤波器。我的意图是在之间有一个通带250 Hz1000 Hz. 但是,该图看起来不正确,如下图所示:

在此处输入图像描述

下面是我的代码:

import scipy
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

#apply bandpass filter
fs = 8000
fso2 = fs/2.
N,Wn = scipy.signal.buttord(wp=[250./fso2,1000./fso2], ws=[200./fso2,1200./fso2],
   gpass=0.1, gstop=30.0)

b, a = signal.butter(N, Wn, 'band', True)
w, h = signal.freqs(b, a, np.logspace(0, 4, 500))
plt.semilogx(w, 20 * np.log10(abs(h)))
plt.title('Butterworth bandpass filter fit to constraints')
plt.xlabel('Frequency [radians / second]')
plt.ylabel('Amplitude [dB]')
plt.grid(which='both', axis='both')
plt.show()
1个回答

您需要为模拟或数字滤波器一致地指定滤波器设计规范参数。使用您发布的代码,计算截止频率接近 1 的数字butterord滤波器所需的阶数(这对于 Nyquist 归一化截止频率是有意义的,但不是以 Hz 为单位),然后直接使用这些阶数来获得模拟滤波器系数。

根据您的应用,您可以设计一个模拟滤波器

N,Wn = scipy.signal.buttord(wp=[250.,1000.], ws=[200.,1200.],
   gpass=0.1, gstop=30.0, analog=True)
b, a = signal.butter(N, Wn, 'band', True)
w, h = signal.freqs(b, a, np.logspace(0, 4, 500))

然后应该生成一个如下所示的图形:

在此处输入图像描述

或者,您可以设计一个数字滤波器

N,Wn = scipy.signal.buttord(wp=[250./fso2,1000./fso2], ws=[200./fso2,1200./fso2],
   gpass=0.1, gstop=10.0, analog=False)
b, a = signal.butter(N, Wn, 'band', False)
w, h = signal.freqz(b, a)

但是请注意,数字滤波器的原始规范会导致 18滤波器,由于数值精度,它可能会开始显示一些伪影。因此,我稍微减少了gstop参数以生成下图:

在此处输入图像描述