我编写了一个小型 GNU Radio 程序来捕获和绘制来自 USRP N210 的 FFT 数据。
为了避免锁定我的 GUI(matplotlib 和 wxpython),我只在 GUI 报告它空闲后运行流程图。
为了进行这种计时,我使用了 GNU Radio 教程中介绍的非以流程图为中心的方法。
本质上,我有一个看起来像这样的主循环(伪代码):
topblock.set_usrp_freq()
while True:
topblock.run()
data = topblock.vector_sink.data()
thread-safe call to plot data
wait for gui.EVT_IDLE
topblock.skiphead.reset()
topblock.head.reset()
流程图看起来基本上像:
self.connect(usrp, skiphead, stream_to_vector, head, fft, c2mag_sq, stats, volts_to_dBm, vector_sink)
# skiphead is modified to be resettable like head
当我使用类似的参数时,我希望看到与运行时相同的内容uhd_fft -f 700M -s 10e6
:
起初,我的 matplotlib 图的输出非常相似,除了非常明显的 LO。我试图按照代码进行uhd_fft
操作,但我没有看到他们进行任何 LO 偏移,所以我的第一个问题是Q:uhd_fft 是否避免以某种方式绘制 LO,或者是我从主要运行流程图的方式循环导致 LO 发音?
编辑:我已经确认极端 LO 是每次流程图为“run()”时发生的电压尖峰的副产品。您需要降低到 LO 的样本数量可以在我的后续帖子中的时间数据中看到:使用 Python 中的简单 GNU Radio flowgraph 时来自 USRP 的电压脉冲
在第二次运行之后,我会定期绘制出在 uhd_fft 中绝对不会发生的奇怪数据。我可以通过在与块一起运行的每个流程图中转储数千个样本来消除这种情况skiphead
,但我的第二个问题是:问:为什么从单独的主循环运行流程图会导致绘制垃圾数据,即使 USRP 不是重调? uhd_fft
使用以流程图为中心的过程并且没有这个问题:
我的直觉是,运行一个非以流程图为中心的应用程序有一些注意事项,这些在教程中没有提到。