调用signal.butter实现带通滤波时出现Too many values to unpack报错
报错原因
该报错本质是signal.butter的返回值数量和接收变量数量不匹配:
scipy.signal.butter支持3种返回格式,通过output参数控制:output='ba'(旧版本默认值):返回b、a两个滤波系数,对应2个接收变量output='zpk':返回零点、极点、增益3个参数,对应3个接收变量output='sos'(新版本部分场景默认推荐值):返回二阶节系数数组,仅对应1个接收变量
你当前代码用2个变量接收返回值,如果函数实际返回了3个值或者1个非二元组的结果,就会触发Too many values to unpack报错,常见触发场景包括:
- 显式/隐式指定了非
ba的output参数 - 自定义变量覆盖了
signal.butter的官方函数实现 - scipy版本升级后默认output参数发生变化
修复方案
方案1:沿用原有ba模式
显式指定output参数强制返回二元组,修改对应代码行即可:
b, a = signal.butter(N=8, Wn=[wn1, wn2], btype='bandpass', output='ba')
注意该方案在滤波器阶数较高时(比如你用的N=8),可能出现数值不稳定的问题。
方案2:改用稳定性更高的sos模式(推荐)
调整完整函数实现,使用二阶节滤波逻辑,精度和稳定性更好:
from scipy import signal def bandPassFilter(data, samplerate): wn1 = 2 * 0.9 / samplerate # origin 0.667 wn2 = 2 * 2.5 / samplerate # 检查归一化频率合法性 if not (0 < wn1 < wn2 < 1): raise ValueError("采样率设置不合理,归一化频率需在0~1之间") sos = signal.butter(N=8, Wn=[wn1, wn2], btype='bandpass', output='sos') data = signal.sosfiltfilt(sos, data) return data
内容的提问来源于stack exchange,提问作者HR W
相关产品推荐
相关产品推荐

