Как построить график в реальном времени, используя python для сигналов, полученных от RTL SDR? - PullRequest
0 голосов
/ 28 марта 2019

Используя приведенный ниже код 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 Ответ

0 голосов
/ 28 марта 2019

Обычно вы можете обновить сгенерированный 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
...