Обычно вы можете обновить сгенерированный pyplot график, вызывая plot.set_xdata()
, plot.set_ydata()
и plot.draw()
( Динамическое обновление графика в matplotlib ), без необходимости воссоздания всего графика. Однако это работает только для графиков, которые непосредственно рисуют ряд данных. Экземпляр графика не может автоматически пересчитать спектральную плотность, рассчитанную как 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