使用来自 Python 的简单 GNU Radio 流程图时来自 USRP 的电压脉冲

voltage pulse from USRP when using simple GNU Radio flowgraph from Python

这是 follow-up 我之前的问题:FFT in non-flowgraph centered application different from flowgraph centered apps like uhd_fft

为了更好地阐明问题,我将代码简化为大约 30 LOC,并尽可能多地从流程图中删除了处理。

我遇到的问题是,虽然 USRP 只调到一个频率一次,流程图的每个 运行 都有大约 70 毫秒的垃圾数据。 我完全知道,当我在重新调整后第一次流式传输样本时,预计会有一定数量的 "junk" 样本,但这不是我们在这里看到的。我们发现现有的连接流图的每个 运行 都有大量垃圾样本 (~50,000)。

运行 流程图然后在 Python 中处理数据有些不常见,但是 在本教程中作为与 GNU 交互的有效方式介绍的收音机 here

我想了解每次我调用 运行() 时 GNU Radio 流程图逻辑的哪一部分会创建此 "hiccup" 电压,同时让它不断流式传输(调用 运行只有一次,像uhd_fft)不显示相同的行为。

...使用此代码生成:

import numpy as np
from gnuradio import gr, uhd, blocks
import matplotlib.pyplot as plt

class topblock(gr.top_block):
    def __init__(self, freq=700e6, rate=1e6, nsamps=100000):
        gr.top_block.__init__(self)
        self.u = uhd.usrp_source(device_addr="", stream_args=uhd.stream_args('fc32'))
        self.u.set_center_freq(freq)
        self.u.set_samp_rate(rate)
        self.head = blocks.head(gr.sizeof_gr_complex, int(nsamps))
        self.vsink = blocks.vector_sink_c()
        self.connect(self.u, self.head, self.vsink)

tb = topblock()
fig, (freqplot, timeplot) = plt.subplots(2, sharex=True)
freqplot.set_title("Frequency domain")
timeplot.set_title("Time domain")

def plot():
    tb.run()
    data = np.array(tb.vsink.data())
    shifted_fft = np.fft.fftshift(np.fft.fft(data))
    dBm = 20*np.log10(np.abs(shifted_fft)) - 30
    freqplot.plot(dBm)
    timeplot.plot(np.abs(data))
    tb.head.reset()
    tb.vsink.reset()

def run_tb(times=10):
    for _ in range(times):
        plot()
    plt.show(block=False)

上述行为是由 USRP 的 auto_dc_offset 功能引起的。硬件对 I 和 Q 都有固有的直流偏置。gr-uhd 提供函数 set_auto_dc_offset,默认情况下启用并启用某种平均函数以带来I 和 Q 偏移为 0。在这里您可以看到 I/Q 在自动 DC 校正关闭的情况下绘制: 然后:

请注意,将近 50,000 个样本将 DC 偏移归零。

UHD "forgets" 每次流程图退出时其直流校正设置的事实意味着我们每次都必须处理这个脉冲和随之而来的缓慢校正,即使频率在运行之间没有变化.这对来自外部循环的 运行 流程图造成了相当大的惩罚。