scipy.signal.firls报_ArrayMemoryError缺失dtype参数错误求助
解决Scipy firls函数报错TypeError: _ArrayMemoryError.init() missing 'dtype'参数
问题本质
你尝试设计的FIR滤波器阶数高达90001,导致内存分配失败,而Scipy内部异常处理出现问题,才抛出了这个看似类型错误的提示。
错误原因
90001阶FIR滤波器需要构造约45001×45001的大型矩阵,按64位浮点数计算,仅该矩阵就占用约16GB内存,远超普通系统的内存容量,触发内存分配失败。Scipy在捕获这个错误时,内部_ArrayMemoryError类初始化参数缺失,因此显示了TypeError而非明确的内存不足错误。
解决方案
降低滤波器阶数(若过渡带要求允许)
若过渡带宽度可以放宽,可通过公式估算合理阶数:numtaps ≈ (4/3) * (采样率 / 过渡带宽度)例如过渡带放宽到1Hz,仅需约58800阶,内存占用会大幅降低。
改用更高效的滤波器设计算法
使用scipy.signal.remez(Parks-McClellan算法),它设计窄过渡带滤波器时不需要构造大型矩阵,内存效率更高:from scipy.signal import remez fs = 44100 numtaps = int(9e4) + 1 b = remez(numtaps, bands=[0, 1.99, 2, fs/2], desired=[0, 1], weight=[0.5, 1], fs=fs)多速率滤波优化
针对极窄过渡带的需求,可采用多速率方案:先对信号降采样,设计低阶滤波器完成滤波,再升采样恢复原速率。这种方法能将滤波器阶数降低几个数量级。升级Scipy版本(修复错误提示)
升级到Scipy最新版本,可将错误提示修正为明确的内存不足错误,便于排查问题,但无法解决核心的内存需求问题。
内容的提问来源于stack exchange,提问作者Marina D
相关产品推荐
相关产品推荐

