George,
That should be correct; I was more referring to keeping your coding clean so 
you don't accidentally make a mistake (I've been bit before :-). You could 
conceivably start consuming inputs at different rates but by then you are 
probably getting into some more complex signal processing. 

Tim

    On Wednesday, January 20, 2021, 1:29:46 PM EST, George Edwards 
<gedwards....@gmail.com> wrote:  
 
 Hi Tim,
Thanks for your help and for sending the links. 
One final question, I was under the impression that length of data in each 
input was the same because the data to each input is streamed in in lock-step 
sample by sample.  Therefore, len(input_items[0] = len(input_items[1] = 
len(input_items[2], is this not correct?
Thanks again for your help and patience. I appreciate it very much!
Regards,George  
 , , use the appropriate length for each input 
On Wed, Jan 20, 2021 at 10:51 AM Tim Huggins <huggins.timo...@yahoo.com> wrote:

 George,
I'm not completely certain exactly why that doesn't result in a 1 to 1 (you 
might be able to look at the code for the basic sync block to see if there is 
anything you could add: 
https://github.com/gnuradio/gnuradio/blob/master/gnuradio-runtime/lib/sync_block.cc
 (this would be an instance to use the sync block instead of a general block 
which forces the 1:1 relationship). That being said, take a look here: 
https://wiki.gnuradio.org/index.php/Types_of_Blocks
Mainly the implementation using a general block at the very bottom. You can see 
how the input is limited to be no bigger than the output buffer in the work 
implementation: 
in0 = input_items[0][:len(output_items[0])]

Also, be careful about your consumes - instead of using len(input_items[0]) for 
each, use the appropriate length for each input to get into good habits.
Tim

    On Tuesday, January 19, 2021, 9:07:00 PM EST, George Edwards 
<gedwards....@gmail.com> wrote:  
 
 Hi Tim,
I thought I had it working. However, it is dropping the last output sample. In 
the QA file, there are 5 complex samples going into each of the 3-inputs to the 
module. When the general_work() method runs with the for loop, it throws an 
exception error stating that index 4 (meaning out[4]) is out of bounds. If I 
comment out the for loop and run the program with the line commented out below: 
output_items[0][:]= v2it results in 4 out of  5 samples going to the output. I 
am using the documented default approach in coding for a 1:1 input/output 
sample relationship as you can see in the forecast() and general_work() methods 
below, please let me know if you see something that is wrong.
    def forecast(self, noutput_items, ninput_items_required):

        #setup size of input_items[i] for work call

        for i in range(len(ninput_items_required)):

            ninput_items_required[i] = noutput_items

 

    def general_work(self, input_items, output_items):

        global v1, v2

        if self.scale == True:

            v1 = self.v1

            v2 = self.v2

            self.scale = False

 

        in0 = input_items[0]

        in1 = input_items[1]

        in2 = input_items[2]

        out = output_items[0]

 

        v2 = 1.0+1.0*1j

        for ii in range(0,len(in0)):

            out[ii] = v2

        # output_items[0][:] = v2

        self.consume(0, len(input_items[0]))       

        self.consume(1, len(input_items[0]))

        self.consume(2, len(input_items[0]))        
        return len(output_items])  

Thank you very much!George
On Tue, Jan 19, 2021 at 3:50 PM George Edwards <gedwards....@gmail.com> wrote:

Hi Tim,
Thank you very much for your help! 
The problem was with the QA file. I tried to input the 3 source streams as:src 
= blocks.vector_source_c(np.array([src0, src1, src2])) where each srcX was 
defined as a complex array. Based on the link into the github QA files that you 
sent me, it showed that each srcX must be connected individually to the 
processing block. Also, I overlooked the fact that when I ran the QA, it 
pointed to that line in the code as a problem.
I will now try to see if I can get the output to provide a stream of 8 samples 
(maybe do 3 as a start) based on one sample from each of the 3-input streams.
Thanks again for the help!
Regards,George  
On Tue, Jan 19, 2021 at 2:05 PM Tim Huggins <huggins.timo...@yahoo.com> wrote:

 George,
Unfortunately I'll still not seeing anything wrong with what you have (and I 
realized that the QA code caused the issue so it is probably not in your yml 
file). I'd probably have too see your entire code to try to reproduce the error 
as all my tests to create the error didn't.
Regarding your other questions:1. There isn't really a correct/incorrect as the 
answer can depend on the work that you want the block to do but general will 
work. I mainly use general or sync.2. Yes, as you have a 1 to 1 stream.3. This 
doesn't look quite correct. Are you planning on working with vector inputs or 
steams to your block? if you are using streams then there is no need to change 
vlen in the yml file. Also it sounds like whatever computations are basically 
doing an interpolation (1 input to 8 outputs), you may want to look at the 
interp_block type instead of the general block that you are using (it might 
make your life a little easier, take a small glance here: 
https://github.com/gnuradio/gnuradio/blob/master/gr-blocks/python/blocks/qa_block_gateway.py).
 Alternatively I think you could look at the set_output_multiple() call.  

Tim

| 
 |
|


| 
 |
|


| 
 |
|


| 
 |
|


| 
 |
|



    On Monday, January 18, 2021, 8:27:28 PM EST, George Edwards 
<gedwards....@gmail.com> wrote:  
 
 Hi Tim,Thanks for the offer to help! I appreciate it very much.Here is the 
rest of yml file. I also have some further questions:1. In the gr-modtool 
design, I picked the "general" block, is this correct?2. The current model has 
3 streaming inputs. Each output sample computation takes one sample from each 
input. So I leave the forecast() method as the default which is:    
ninput_items_required[i] = noutput_items, is this correct?     And, in the 
general_work() method, I also leave the default:    return 
len(output_items[0]), is this correct?3. The final model will have the same 3 
input streams, but each computation will produce a stream of 8 output samples. 
So, do I now change the forecast() method to:    ninput_items_required[i] = 
noutput_items - 7    Then, in the general_work() method do:     return 
len(8*input_items[0])     Then, for the yml file set, vlen = 8              
"The setting of these parameters in Item 3 are all confusing to me"

parameters:

- id: scale

  label: Scale_Value

  dtype: bool

  default: True

 

#  Make one 'inputs' list entry per input and one 'outputs' list entry per 
output.

#  Keys include:

#      * label (an identifier for the GUI)

#      * domain (optional - stream or message. Default is stream)

#      * dtype (e.g. int, float, complex, byte, short, xxx_vector, ...)

#      * vlen (optional - data stream vector length. Default is 1)

#      * optional (optional - set to 1 for optional inputs. Default is 0)

inputs:

- domain: stream

  dtype: complex

  multiplicity: '3'

 

# - label: in0

#   dtype: complex

# - label: in1

#   dtype: complex

# - label: in2

#   dtype: complex

 

outputs:

- label: out

  dtype: complex

 

#  'file_format' specifies the version of the GRC yml format used in the file

#  and should usually not be changed.

file_format: 1

 


On Mon, Jan 18, 2021 at 7:50 AM Tim Huggins <huggins.timo...@yahoo.com> wrote:

 George,
I have made several OOT Python blocks with variable numbers of inputs and 
outputs and while I could very easily be overlooking something the error does 
not, at first glance, appear to be in the code that you have sent out. Can you 
send the rest of your yml file (and potentially the rest of the python)? I am 
curious if there is something missing in either the templates or parameters 
sections of your yml file.
Tim

    On Friday, January 15, 2021, 2:56:48 PM EST, George Edwards 
<gedwards....@gmail.com> wrote:  
 
 Hello,

I am trying to make a Python OOT block which accepts a stream of 3 inputs 
complex valued data and for each single input sample (one on each input line) 
the block will output 8 complex samples. For my first cut, I am simply trying 
to get the module to work outputting one complex sample (rather than 8). Below 
are the essential parts of my program.
1. In the def __init__ (self.), I set the inner method 
gr.basic_block.__init__(self,       name="my_block_name_py_cc",       in_sig = 
[numpy.complex64,numpy.complex64, numpy.complex64  ],       out_sig = 
[numpy.complex64])       # with 3 inputs and one output
2. In the general_work() method for now I set the output to a constant complex 
value as follows      out_items[0][:] = 1.0+1.0*1j
3. In the *.yml file, the input is set as:        inputs:        - domain: 
stream           dtype: complex           multiplicity: '3'
The module compiles. However, when I run the QA file, it gives an error stating 
something is wrong in File "..........blocks_swig1.py at line 8354.TypeError: 
in method 'vector_source_c_make', argument 2 of type 'bool'
I went to the file and the line stated, but I have not seen anything to help me 
make corrections. As far as a TypeError of 'bool', I do not see where I would 
have made such an error. I have an input parameter in the def __init__(self, 
start = True) method, 'start', which comes in as bool, but that is the only 
bool variable I am using. The documentation I read for the method states "This 
block produces a stream of samples based on an input vector" (which is my goal 
if I can get it to work).
I will appreciate any help to get me on the right track.
Regards,George
  
  

  
  

Reply via email to