如何使用Python绘制RTL-SDR接收信号的实时图且不关闭绘图窗口
解决RTL-SDR信号图连续绘图问题
你的代码核心问题是每次循环调用的show()会阻塞程序,必须关闭窗口才会继续执行下一次循环。要实现同一窗口连续更新绘图,只需调整matplotlib的显示逻辑,以下是修改后的可运行代码:
from pylab import * from rtlsdr import * # 开启matplotlib交互式模式,让窗口不阻塞程序 ion() sdr = RtlSdr() sdr.sample_rate = 2.4e6 p = sdr.start_freq = 95e6 sdr.gain = 50 try: while True: samples = sdr.read_samples(256*1024) # 清除当前画布的旧内容,避免图像叠加 clf() psd(samples.real, NFFT=1024, Fs=sdr.sample_rate/1e6, Fc=p/1e6) xlabel('Frequency (MHz)') ylabel('Relative power (dB)') # 强制刷新绘图窗口 draw() # 短暂暂停,让绘图完成刷新,同时处理UI事件 pause(0.01) except KeyboardInterrupt: # 捕获Ctrl+C中断,优雅退出循环 pass # 关闭交互式模式 ioff() sdr.close()
关键修改说明:
ion():启用matplotlib交互式模式,允许程序在显示窗口的同时继续执行后续代码clf():每次循环清除当前画布,防止新旧图像叠加draw():替代原代码的show(),只刷新窗口而不阻塞程序pause():替代sleep(),因为sleep()不会触发matplotlib的窗口刷新,pause()会同步处理绘图事件- 替换通用
except为KeyboardInterrupt:避免捕获未知错误,方便调试过程中用Ctrl+C正常终止程序
如果运行时遇到后端不支持交互式的问题,可以在导入pylab前添加以下代码指定兼容的后端:
import matplotlib matplotlib.use('TkAgg')
内容的提问来源于stack exchange,提问作者ismail
相关产品推荐
相关产品推荐

