使用下面的python(ubuntu)代码和rtlsdr,我可以绘制图形。谁能告诉我如何修改此代码以实时连续绘制图形?
from pylab import *
from rtlsdr import *
sdr = RtlSdr()
sdr.sample_rate = 2.4e6
sdr.center_freq = 93.5e6
sdr.gain = 50
samples = sdr.read_samples(256*1024)
sdr.close()
psd(samples.real, NFFT=1024, Fs=sdr.sample_rate/1e6, Fc=sdr.center_freq/1e6)
xlabel('Frequency (MHz)')
ylabel('Relative power (dB)')
show()
答案 0 :(得分:0)
通常,您可以通过调用plot.set_xdata()
,plot.set_ydata()
和plot.draw()
(Dynamically updating plot in matplotlib)来更新pyplot生成的图,而不必重新创建整个图。但是,这仅适用于直接绘制数据序列的图。图实例无法自动重新计算由psd()
计算的光谱密度。
因此,当您想更新绘图时,需要再次调用psd()
-根据绘制所需的时间,您可以每隔一秒或更短的时间间隔进行一次绘制。
这可能有效:
from pylab import *
from rtlsdr import *
from time import sleep
sdr = RtlSdr()
sdr.sample_rate = 2.4e6
sdr.center_freq = 93.5e6
sdr.gain = 50
try:
while True: # run until interrupted
samples = sdr.read_samples(256*1024)
clf()
psd(samples.real, NFFT=1024, Fs=sdr.sample_rate/1e6, Fc=sdr.center_freq/1e6)
xlabel('Frequency (MHz)')
ylabel('Relative power (dB)')
show()
sleep(1) # sleep for 1s
except:
pass
sdr.close()
编辑:当然,我不确定read_samples
的运行方式;我在这里的示例假定它几乎立即返回。如果它在等待数据时长时间阻塞,那么您可能希望一次读取较少的数据,并在这样做时丢弃旧数据:
from collections import deque
max_size = 256*1024
chunk_size = 1024
samples = deque([], max_size)
while True:
samples.extend(sdr.read_samples(chunk_size))
# draw plot