GnuRadio python插值块

GnuRadio python插值块,python,gnuradio,Python,Gnuradio,为了了解积木是如何制作的,我一直在努力 我试图制作一个插值块(1输入:2输出),返回两个输出流中的输入值乘以常数。我将其实现为一个类,multiply_out_fff(),它继承自一个interp_块 import numpy from gnuradio import gr class multiply_out_fff(gr.interp_block): """ docstring for block multiply_out_fff """ def __in

为了了解积木是如何制作的,我一直在努力

我试图制作一个插值块(1输入:2输出),返回两个输出流中的输入值乘以常数。我将其实现为一个类,multiply_out_fff(),它继承自一个interp_块

import numpy
from gnuradio import gr

class multiply_out_fff(gr.interp_block):
    """ 
    docstring for block multiply_out_fff
    """
    def __init__(self, multiple):
        gr.interp_block.__init__(self,
            name="multiply_out_fff",
            in_sig=[numpy.float32],
            out_sig=[numpy.float32], interp = 2)
        self.multiple = multiple


    def work(self, input_items, output_items):
        in0 = input_items[0]
        out = output_items[0]

        print("the data coming in: ", in0)
        print("in shape ",in0.shape)

        for i in range(0,len(out)/2):
          out[i] = in0[i] * self.multiple
        for i in range(len(out)/2,len(out)):
          out[i] = in0[i-len(out)] * self.multiple

        print("the data going out: ", out)
        print("out shape ", out.shape)

        return len(output_items[0])
我已经为这个模块编写了一个测试,并设法让它通过,但不是以我最初认为可行的方式

from gnuradio import gr, gr_unittest
from gnuradio import blocks
from multiply_out_fff import multiply_out_fff

class qa_multiply_out_fff (gr_unittest.TestCase):

    def setUp (self):
        self.tb = gr.top_block ()

    def tearDown (self):
        self.tb = None

    def test_001_t (self):
        # set up fg
        self.data = (0,1,-2,5.5)
        self.expected_result = (0,2,-4,11,0,2,-4,11)

        print("---------testing----------")
        print("test data: ", self.data)

        #make blocks
        self.src = blocks.vector_source_f(self.data)
        self.mult = multiply_out_fff(2)
        self.snk1 = blocks.vector_sink_f()
        self.snk2 = blocks.vector_sink_f()

        #make connections
        self.tb.connect((self.src,0),(self.mult,0))
        self.tb.connect((self.mult,0),(self.snk1,0))
        #self.tb.connect((self.mult,1),(self.snk2,0))
        self.tb.run ()

        self.result_data1 = self.snk1.data()
        #self.result_data2 = self.snk2.data()

        print("The output data: ", self.result_data1)
        print("--------test complete-------------\n")

        # check data
        self.assertFloatTuplesAlmostEqual(self.expected_result, self.result_data1)
        #self.assertFloatTuplesAlmostEqual(self.expected_result, self.result_data2)


if __name__ == '__main__':
    gr_unittest.run(qa_multiply_out_fff, "qa_multiply_out_fff.xml")
运行测试脚本将提供:

 ~/gnuradio/gr-tutorial/python$ python qa_multiply_out_fff.py 
---------testing----------
('test data: ', (0, 1, -2, 5.5))
('the data coming in: ', array([ 0. ,  1. , -2. ,  5.5], dtype=float32))
('in shape ', (4,))
('the data going out: ', array([  0.,   2.,  -4.,  11.,   0.,   2.,  -4.,  11.], dtype=float32))
('out shape ', (8,))
('The output data: ', (0.0, 2.0, -4.0, 11.0, 0.0, 2.0, -4.0, 11.0))
--------test complete-------------

.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
我正在努力理解的概念是我的块如何返回数据。现在,它在一个数组中返回两个插值输出流,长度是输入的两倍。我认为它应该有两个独立的输出阵列,并允许我有一个单独的接收器连接到每个输出,如下所示(在测试中注释掉):

相反,我所有的数据都流入snk1。如果我取消注释第二个连接,我会收到一个错误,通知我self.mult块不能有更多的输出连接

ValueError: port number 1 exceeds max of 0

如何制作一个插值块我可以与之建立多个输出连接?

看起来我误解了“interp”参数,它指定了输入向量长度和输出向量长度之间的比率。为该块生成多个输出的正确方法是将“out\u sig”参数修改为输出类型的列表,如下面修改的multiply\u out\u fff类中所示

import numpy
from gnuradio import gr

class multiply_out_fff(gr.interp_block):
    """ 
    docstring for block multiply_out_fff
    """
    def __init__(self, multiple):
        gr.interp_block.__init__(self,
            name="multiply_out_fff",
            in_sig=[numpy.float32],
            out_sig=[numpy.float32,numpy.float32], interp = 1)
        self.multiple = multiple


    def work(self, input_items, output_items):
        in0 = input_items[0]
        out1 = output_items[0]
        out2 = output_items[1]    
#        print("the data coming in: ", in0)
#        print("in shape ",in0.shape)

        for i in range(len(in0)):
          out1[i] = in0[i] * self.multiple

        for i in range(len(in0)):
          out2[i] = in0[i] * self.multiple * 2 

#        print("the data going out: ", out)
#        print("out shape ", out.shape)

        return len(output_items[0])

Gnuradio—“如果我们想要向量,我们可以在_sig=[(numpy.float32,4),numpy.float32]中定义它们。这意味着有两个输入端口,一个用于4个浮点的向量,另一个用于标量。”

import numpy
from gnuradio import gr

class multiply_out_fff(gr.interp_block):
    """ 
    docstring for block multiply_out_fff
    """
    def __init__(self, multiple):
        gr.interp_block.__init__(self,
            name="multiply_out_fff",
            in_sig=[numpy.float32],
            out_sig=[numpy.float32,numpy.float32], interp = 1)
        self.multiple = multiple


    def work(self, input_items, output_items):
        in0 = input_items[0]
        out1 = output_items[0]
        out2 = output_items[1]    
#        print("the data coming in: ", in0)
#        print("in shape ",in0.shape)

        for i in range(len(in0)):
          out1[i] = in0[i] * self.multiple

        for i in range(len(in0)):
          out2[i] = in0[i] * self.multiple * 2 

#        print("the data going out: ", out)
#        print("out shape ", out.shape)

        return len(output_items[0])