Это является продолжение к моему предыдущему вопросу: FFT in non-flowgraph centered application different from flowgraph centered apps like uhd_fftимпульса напряжения от USRP при использовании простого GNU Radio Flowgraph из Python
В попытке лучше прояснить этот вопрос, я вареный свой код примерно до ~ 30 LOC и удалили как можно большую обработку из графика потока.
Проблема, с которой я сталкиваюсь, заключается в том, что, хотя USRP настроен только на частоту, каждый прогон потока имеет около 70 мс данных мусора. Я полностью осознаю, что определенное количество «нежелательных» образцов следует ожидать, когда я сначала обрабатываю образцы после перенастройки, но это не то, что мы видим здесь. Мы видим значительное количество нежелательных образцов (~ 50 000) для каждого запуска существующего связанного потока.
Запуск Flowgraph и затем передавая данные в Python несколько необычно, но в введен в учебнике как действительный способ взаимодействия с GNU Radio here
Я хотел бы понять, какую часть GNU Логика радиопотока создает эту «икоту» напряжения каждый раз, когда я вызываю run() на нем, тогда как постоянный поток (вызов выполняется только один раз, например 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)