discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Discuss-gnuradio] GNURadio OOT vector input/output with different s


From: Marcus Müller
Subject: Re: [Discuss-gnuradio] GNURadio OOT vector input/output with different size
Date: Fri, 21 Jul 2017 12:54:01 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0

Ali,

Is that really your forecast? That won't work. You'll need to implement it.
Unless you actually meant to do consume_each(noutput_items) AND return(noutput_items), because then you shouldn't be using a general gr::block, but gr::sync_block, which saves you the hassle of implementing a forecast and of explicitly consuming items.

Best regards,
Marcus

On 07/21/2017 08:20 AM, Ali wrote:
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <gnuradio/io_signature.h>
#include "block_name_impl.h"
#include "function.h"

namespace gr {
 namespace module {
  
   block_name::sptr
   block_name::make(float parameter)
   {
     return gnuradio::get_initial_sptr
(new block_name_impl(parameter));
   }

   /*
    * The private constructor
    */

int myints[] = {4000,4000,4000,4000,4000,4000,4000,4000};
const std::vector<int> inputs (myints, myints+sizeof(myints)/sizeof(float));
int myints2[] = {4000,4000,4,4};
const std::vector<int> outputs (myints2, myints2+sizeof(myints2)/sizeof(float));

 block_name_impl::block_name_impl(float parameter)
  : gr::block("block_name",
gr::io_signature::makev(8,8,inputs),
gr::io_signature::makev(4,4,outputs)),
parameter2(parameter)
 {}

   /*
    * Our virtual constructor
    */
   block_name::~block_name_impl()
   {
   }

   void
   block_name_impl::forecast(int noutput_items, gr_vector_int &ninput_items_required)
   {
     /* <+forecast+> e.g. ninput_items_required[0] = noutput_items */
   }

   int
   block_name_impl::general_work (int noutput_items,
                            gr_vector_int &ninput_items,
                            gr_vector_const_void_star &input_items,
                            gr_vector_void_star &output_items)

   {
     const float *in1 = (const float *) input_items[0];
     const float *in2 = (const float *) input_items[1];
     const float *in3 = (const float *) input_items[2];
     const float *in4 = (const float *) input_items[3];
     const float *in5 = (const float *) input_items[4];
     const float *in6 = (const float *) input_items[5];
     const float *in7 = (const float *) input_items[6];
     const float *in8 = (const float *) input_items[7];
     float *out1 = (float *) output_items[0];
     float *out2 = (float *) output_items[1];
     float *out3 = (float *) output_items[2];
     float *out4 = (float *) output_items[3];

     // Do <+signal processing+>
     // Tell runtime system how many input items we consumed on
     // each input stream.

function(in1,in2,in3,in4,in5,in6,in7,in8,parameter2,out1,out2,out3,out4);

consume_each(noutput_items);
return noutput_items;
     } 
  }
}
  

The "function line" may be inside a for, I am not sure. I am not sure of the bold lines also. What is your overall comments?





2017-07-21 8:52 GMT+03:00 Ali <address@hidden>:
Hi,

Patrick's code does not work since I think I am using c++98. I dont know how to enable c++11. Anyway for c++98 I wrote the followings(I found on the internet):

-->
int myints[] = {4000,4000,4000,4000,4000,4000,4000,4000};
const std::vector<int> inputs (myints, myints+sizeof(myints)/sizeof(float));
int myints2[] = {4000,4000,4,4};
const std::vector<int> outputs (myints2, myints2+sizeof(myints2)/sizeof(float));
-->
makev(8,8,inputs) and makev(4,4,outputs)

It is compiled after "sudo make" command.
But when I wrote "gr_modtool makexml function", I got the following error(... means I skipped writing these lines).

...
Making GRC bindings for lib/function_impl.cc...
tbi
Error: Can't parse input signature.
tbi
Error: Can't parse output signature.
...
 if iosig[inout]['max_ports'] == '-1':
Key error: 'in'

I will post my whole code later.










2017-07-21 1:14 GMT+03:00 Patrick Sathyanathan <address@hidden>:

Try this instead:


const std::vector<int> inputs{4000,4000,4000,4000,4000,4000,4000,4000};

and make sure you compile with c++11 enabled.

--Patrick


From: Discuss-gnuradio <discuss-gnuradio-bounces+wpats=address@hidden> on behalf of Ali <address@hidden>
Sent: Thursday, July 20, 2017 12:13 AM
To: address@hidden
Subject: Re: [Discuss-gnuradio] GNURadio OOT vector input/output with different size
 
Hi,

I dont have any background about C++. So I could not generate the std::vector<int> with the desired content and could not fınd anything on the internet. 

const std::vector<int> inputs[] = {4000,4000,4000,4000,4000,4000,4000,4000};

does not work. I am getting the following error: 

"conversion from 'int' to non-scalar type 'std::vector<int>' requested"

Best,
Ali


 

2017-07-18 11:51 GMT+03:00 Marcus Müller <address@hidden>:

Hi Ali,

I think this should also work, shouldn't it?
no, that's why I explained what you need to do (use makev).

Does this part need to be changed since I am working with the vectors?
No, not really. The vectors are still only consecutive numbers in memory.

Best regards,

Marcus


On 18.07.2017 07:51, Ali wrote:
Hi,

1- Actually I am using the followings

make(8,8,1000*sizeof(float))
make3(4,4,1000*sizeof(float),1000*sizeof(float),4*sizeof(float))

I think this should also work, shouldn't it?

2- Under the general work function I am using the followings:

const float *in1 = (const float *) input_items[0]
...
float *out1 = (float *) output_items[0]

Does this part need to be changed since I am working with the vectors?

Thanks,
Ali




2017-07-17 16:42 GMT+03:00 Marcus Müller <address@hidden>:

Hi Ali,

So, you want one block with:

  • 8 inputs, itemsize0…7 = 1000*4B = 4000B
  • 4 outputs, itemsize0=itemsize1=4000B, itemsize2=itemsize3=16B

Correct?

You need to generate two std::vector<int> with content

{4000,4000,4000,4000,4000,4000,4000,4000}

and

{4000,4000,16,16}

respectively, and use gr::io_signature::makev(int min_streams, int max_streams, vector) to generate the io_signatures[1] that you use in your block's constructor. The question whether your block should be a general, or a sync block, is independent from the item sizes of the in and outputs, but depends on whether there's always a fixed ratio of produced output items to consumed input items, as explained in [2].

Best regards,

Marcus

[1] https://gnuradio.org/doc/doxygen/classgr_1_1io__signature.html#a99e0f9e8de8e7ce16ed92d9f2655e66c
[2] https://wiki.gnuradio.org/index.php/Guided_Tutorial_GNU_Radio_in_C%2B%2B#4.3.2_Specific_block_categories


On 07/17/2017 03:31 PM, Ali wrote:
Hi to all,

I want to design my own OOT module with the following I/O:

8 inputs (length of 1000 and each element is type of float)
2 outputs (length of 1000 and each element is type of float)
2 outputs (length of 4 and each element is type of float)

I used general type block but I could not get the desired outputs. Do you suggest other type of blocks? Is there any example similar to this work that I can study on? Can you suggest a module name or a link?

Best,
Ali



_______________________________________________
Discuss-gnuradio mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
_______________________________________________ Discuss-gnuradio mailing list address@hidden https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
_______________________________________________
Discuss-gnuradio mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
_______________________________________________ Discuss-gnuradio mailing list address@hidden https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
_______________________________________________
Discuss-gnuradio mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

reply via email to

[Prev in Thread] Current Thread [Next in Thread]