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完成安装或更新
- 确保正确导入scipy的signal模块:在代码开头添加
修复后的完整代码
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
相关产品推荐
相关产品推荐

