使用scipy.signal绘制300-3000Hz带通滤波器频响异常,求排查错误
问题分析与修正
你的截止频率定义出现了逻辑冲突,直接导致滤波器参数完全错误。
错误根源
在scipy.signal.cheby1函数中,不能同时传入归一化的Wn值和fs参数:
- 如果指定了
fs参数,Wn需要直接使用实际频率(单位Hz),不需要做归一化处理 - 如果不指定
fs参数,Wn才需要是归一化到Nyquist频率的比值(0到1之间的数值)
你现在的代码里,既把Wn计算成了归一化后的比值,又添加了fs=fs参数,这会让函数误以为[0.0125, 0.125]是实际的Hz值,自然生成了一个靠近直流的窄带滤波器。
修正后的代码(两种可选方案)
方案一:保留归一化Wn,移除fs参数
import scipy.signal as spy import matplotlib.pyplot as plt fs = 48e3 # 采样率 nyq = fs / 2 WnL = 300 / nyq # 归一化到Nyquist的截止频率 WnH = 3000 / nyq # 移除fs参数,使用归一化Wn sos = spy.cheby1(N=3, rp=0.5, Wn=[WnL, WnH], btype='bandpass', analog=False, output='sos') w, h = spy.sosfreqz(sos=sos, fs=fs) plt.plot(w, abs(h)) plt.xlabel('频率 (Hz)') plt.ylabel('幅度') plt.grid(True) plt.show()
方案二:保留fs参数,直接传入实际频率作为Wn
import scipy.signal as spy import matplotlib.pyplot as plt fs = 48e3 # 采样率 # 直接传入实际Hz值作为Wn,保留fs参数 sos = spy.cheby1(N=3, rp=0.5, Wn=[300, 3000], btype='bandpass', analog=False, output='sos', fs=fs) w, h = spy.sosfreqz(sos=sos, fs=fs) plt.plot(w, abs(h)) plt.xlabel('频率 (Hz)') plt.ylabel('幅度') plt.grid(True) plt.show()
两种方案都能生成你期望的300Hz-3000Hz通带的滤波器,任选其一即可。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

