Как построить график в реальном времени, используя python для сигналов, полученных от RTL SDR?
Используя приведенный ниже код 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()
1 ответ
Обычно вы можете обновить сгенерированный 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