2015-01-15 7 views
2

Это является продолжение к моему предыдущему вопросу: 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) не проявляет такого же поведения.

voltage spike with each run of the flowgraph

... производится с помощью этого кода:

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) 

ответ

1

Поведение выше вызвано auto_dc_offset особенностью USRP. Аппаратное обеспечение имеет встроенное смещение постоянного тока как для I, так и для Q. gr-uhd предоставляет функцию set_auto_dc_offset, которая включена по умолчанию и позволяет использовать некоторую функцию усреднения для приведения I и Q смещения в 0. Здесь вы можете видеть, Q построены с автоматической коррекцией DC от: enter image description here А: enter image description here

Обратите внимание, что она занимает почти 50 000 образцов для обнуления смещения постоянного тока.

Тот факт, что UHD «забывает» настройку коррекции постоянного тока каждый раз, когда выйдет поток, означает, что нам приходится иметь дело с этим импульсом и последовательной медленной коррекцией каждый раз, даже если частота не менялась между прогонами. Это создает довольно большой штраф за запуск flowgraph из внешнего цикла.

 Смежные вопросы

  • Нет связанных вопросов^_^