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

Python报错:matplotlib.pyplot无plot_filterz属性及signal无firwin属性

解决Python FIR滤波代码的两个报错:'plot_filterz'不存在与'firwin'属性错误

报错原因与修复方案

1. module 'matplotlib.pyplot' has no attribute 'plot_filterz'

  • 问题本质:matplotlib.pyplot没有plot_filterz内置函数,要绘制FIR滤波器的频率响应,需先用scipy.signal.freqz计算响应数据,再用matplotlib绘图。
  • 修复方式:替换原代码中的plt.plot_filterz(b)为以下代码:
    # 计算滤波器频率响应
    w, h = signal.freqz(b)
    # 绘制幅度响应
    plt.subplot(211)
    plt.plot(w, 20 * np.log10(abs(h)))
    plt.title('FIR Filter Amplitude Response')
    plt.ylabel('Magnitude (dB)')
    plt.xlabel('Frequency (rad/sample)')
    # 绘制相位响应(可选)
    plt.subplot(212)
    plt.plot(w, np.unwrap(np.angle(h)))
    plt.title('FIR Filter Phase Response')
    plt.ylabel('Phase (radians)')
    plt.xlabel('Frequency (rad/sample)')
    plt.tight_layout()
    

2. object has no attribute 'firwin'

  • 问题本质:代码中的signal对象不是scipy.signal模块,要么是导入错误(误导入其他同名模块),要么是未正确安装scipy库。
  • 修复方式:
    • 确保正确导入scipy的signal模块:在代码开头添加from scipy import signal(若用import scipy,则需写成scipy.signal.firwin)
    • 确认scipy已安装:终端执行pip install scipy完成安装或更新

修复后的完整代码

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

#----------------------------------------------------
#FIR filter
n=100 #Design filter
b=signal.firwin(n, cutoff=0.2, window="hamming")

# 绘制滤波器频率响应(替换原plt.plot_filterz(b))
w, h = signal.freqz(b)
plt.figure(figsize=(10, 6))
plt.subplot(211)
plt.plot(w, 20 * np.log10(abs(h)))
plt.title('FIR Filter Amplitude Response')
plt.ylabel('Magnitude (dB)')
plt.xlabel('Frequency (rad/sample)')
plt.grid(True)

plt.subplot(212)
plt.plot(w, np.unwrap(np.angle(h)))
plt.title('FIR Filter Phase Response')
plt.ylabel('Phase (radians)')
plt.xlabel('Frequency (rad/sample)')
plt.grid(True)
plt.tight_layout()
plt.show()

# 生成原始信号并滤波
x = np.sin(np.linspace(0,500,1024)) + 0.5*np.cos(np.linspace(0,750,1024)) + np.random.randn(1024)*0.2 + 0.2*np.cos(np.linspace(0, 10000, 1024))
xfiltered = signal.lfilter(b, 1, x) 

# 绘制原始信号与滤波后信号
plt.figure(figsize=(10, 4))
plt.plot(x[:200], label="Original signal")
plt.plot(xfiltered[:200], "--k", label="Filtered signal")
plt.legend()
plt.title('Original vs Filtered Signal')
plt.grid(True)
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:15:26