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

scipy.signal.firls报_ArrayMemoryError缺失dtype参数错误求助

解决Scipy firls函数报错TypeError: _ArrayMemoryError.init() missing 'dtype'参数

问题本质

你尝试设计的FIR滤波器阶数高达90001,导致内存分配失败,而Scipy内部异常处理出现问题,才抛出了这个看似类型错误的提示。

错误原因

90001阶FIR滤波器需要构造约45001×45001的大型矩阵,按64位浮点数计算,仅该矩阵就占用约16GB内存,远超普通系统的内存容量,触发内存分配失败。Scipy在捕获这个错误时,内部_ArrayMemoryError类初始化参数缺失,因此显示了TypeError而非明确的内存不足错误。

解决方案

  1. 降低滤波器阶数(若过渡带要求允许)
    若过渡带宽度可以放宽,可通过公式估算合理阶数:

    numtaps ≈ (4/3) * (采样率 / 过渡带宽度)
    

    例如过渡带放宽到1Hz,仅需约58800阶,内存占用会大幅降低。

  2. 改用更高效的滤波器设计算法
    使用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)
    
  3. 多速率滤波优化
    针对极窄过渡带的需求,可采用多速率方案:先对信号降采样,设计低阶滤波器完成滤波,再升采样恢复原速率。这种方法能将滤波器阶数降低几个数量级。

  4. 升级Scipy版本(修复错误提示)
    升级到Scipy最新版本,可将错误提示修正为明确的内存不足错误,便于排查问题,但无法解决核心的内存需求问题。

内容的提问来源于stack exchange,提问作者Marina D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:25:01