2016-10-21 7 views
0

ブロックの作り方を理解するために、私はGnuradio tutorialsを使っています。GnuRadio python補間ブロック

私は両方の出力ストリームで定数で乗算された入力値を返す補間ブロック(1入力:2出力)を作成しようとしています。私は

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]) 

が、私はこのブロックのテストを書いたinterp_blockから継承するクラス、multiply_out_fff()としてこれを実装しました、そして、それが通過するために得るために管理している、ではない方法で、Iもともとテストスクリプトを実行している

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 

私が理解するのに苦労していますコンセプトは私のブロックは、データを返す方法です。今は、入力の2倍の長さを持つ1つの配列に両方の補間出力ストリームを返します。

self.tb.connect((self.mult,0),(self.snk1,0)) 
    self.tb.connect((self.mult,1),(self.snk2,0)) 

代わりに、私のすべてのデータがsnk1に流れ込む:私は、2つの独立した出力配列を持っている、と私は、この(テストでコメントアウト)などの各出力に接続された別のシンクを、持ってできるようにする必要がありますと思いました。 2番目の接続のコメントを外すと、self.multブロックの出力接続が増えないというエラーが表示されます。

ValueError: port number 1 exceeds max of 0 

どのように補間ブロックを作ることができますか複数の出力接続を作成できますか?

答えて

0

入力ベクトルの長さと出力ベクトルの長さの比を指定する 'interp'パラメータが誤解されているように見えます。このブロックの複数の出力を作成する適切な方法は、出力タイプのリストになるように 'out_sig'パラメータを変更することです。変更されたmultiply_out_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 Reference

Gnuradio - 「我々はベクトルを望んでいた場合、我々は、これは、2つの入力ポート、1つがあることを意味[numpy.float32(numpy.float32,4)] in_sig =ようなものを定義することができます。 4つの浮動小数点数のベクトルとスカラーのためのものです。