Как построить график в реальном времени, используя 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
Другие вопросы по тегам