Я строю блок 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
[...]