如何使用python为RTL SDR接收的信号绘制实时图形?

时间:2019-03-28 06:43:00

标签: 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 个答案:

答案 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