Как обрабатывать ввод и вывод количества сэмплов в блоках Python с помощью GNURadio? - PullRequest
0 голосов
/ 09 июля 2019

Я строю блок GNURadio в Python для свертки входного сигнала с сигналом корня-поднятого косинуса. Я заметил, что входной сигнал, отправляемый функции general_work , имеет различное количество выборок, что довольно раздражает для моей цели. Действительно, для входного сигнала n_in отсчетов и фильтра с косинусным корнем из n отсчетов выходной сигнал будет иметь длину n_in + n-1 (свойство свернутых сигналов).

Я не могу использовать блок интерполяции, потому что я не знаю n_in, и поэтому я не знаю значения коэффициента интерполяции (n_in + n-1) / n_in. Итак, я использую общий блок этой формы благодаря gr_modtool при условии:

import numpy as np
from gnuradio import gr

class Convolve(gr.basic_block):
"""
docstring for block Convolve
"""
n=45 #Number of samples in the Root-raised cosine signal
def __init__(self):
    gr.basic_block.__init__(self,
        name="Convolve",
        in_sig=[np.complex64],
        out_sig=[np.complex64])

def forecast(self, noutput_items, ninput_items_required):
    #setup size of input_items[i] for work call
    print("---------- Forecast function --------------")
    n_in = noutput_items-self.n+1
    if n_in<=0:
        ninput_items_required[0]=1
    else:
        ninput_items_required[0]=n_in
    print("n_in : ", n_in)
    print("ninput_items_required[0] : ", ninput_items_required[0])
    print("noutput_items : ", noutput_items)

def general_work(self, input_items, output_items):
    print("---------- General work function ----------------")
    output_items[0][:] = 1 #Output is not important for the example
    print("input_items[0] : ", len(input_items[0]))
    print("output_items[0] : ", len(output_items[0]))
    self.consume(0, len(input_items[0]))
    #self.consume_each(len(input_items[0]))
    return len(output_items[0])

В этом примере я выбрал число отсчетов корня с приподнятым косинусом равным n = 45. Это печатает меня это в Терминале:

---------- Forecast function --------------
('n_in : ', 4052)
('ninput_items_required[0] : ', 4052)
('noutput_items : ', 4096)
---------- Forecast function --------------
('n_in : ', 2004)
('ninput_items_required[0] : ', 2004)
('noutput_items : ', 2048)
---------- Forecast function --------------
('n_in : ', 980)
('ninput_items_required[0] : ', 980)
('noutput_items : ', 1024)
---------- Forecast function --------------
('n_in : ', 468)
('ninput_items_required[0] : ', 468)
('noutput_items : ', 512)
---------- Forecast function --------------
('n_in : ', 212)
('ninput_items_required[0] : ', 212)
('noutput_items : ', 256)
---------- Forecast function --------------
('n_in : ', 84)
('ninput_items_required[0] : ', 84)
('noutput_items : ', 128)
---------- Forecast function --------------
('n_in : ', 20)
('ninput_items_required[0] : ', 20)
('noutput_items : ', 64)
---------- Forecast function --------------
('n_in : ', -12)
('ninput_items_required[0] : ', 1)
('noutput_items : ', 32)
---------- Forecast function --------------
('n_in : ', -28)
('ninput_items_required[0] : ', 1)
('noutput_items : ', 16)
---------- Forecast function --------------
('n_in : ', -36)
('ninput_items_required[0] : ', 1)
('noutput_items : ', 8)
---------- Forecast function --------------
('n_in : ', -40)
('ninput_items_required[0] : ', 1)
('noutput_items : ', 4)
---------- Forecast function --------------
('n_in : ', -42)
('ninput_items_required[0] : ', 1)
('noutput_items : ', 2)
---------- Forecast function --------------
('n_in : ', -43)
('ninput_items_required[0] : ', 1)
('noutput_items : ', 1)
---------- Forecast function --------------
('n_in : ', 4052)
('ninput_items_required[0] : ', 4052)
('noutput_items : ', 4096)

Похоже, что функция Forecast вызывается несколько раз для проверки различных значений длины ввода и вывода. Кажется, что он работает правильно, но после этого вызывается общая рабочая функция, и длины ввода и вывода в этом примере одинаковы ... Это не соответствует значениям, полученным с помощью функции Forecast.

---------- General work function ----------------
('input_items[0] : ', 4096)
('output_items[0] : ', 4096)

Может кто-нибудь объяснить мне, почему у меня есть сигналы одинаковой длины в общей рабочей функции? Как мне легче обрабатывать длины входных и выходных сигналов? Есть ли более подходящий способ обработки случая, когда n_in отрицателен вместо этого:

    [...]
    if n_in<=0:
        ninput_items_required[0]=1
    else:
        ninput_items_required[0]=n_in
    [...]
...