You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:35:27