discuss-gnuradio
[Top][All Lists]
Advanced

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

Re: [Discuss-gnuradio] How to check if more input is available on an inp


From: Mir Ali
Subject: Re: [Discuss-gnuradio] How to check if more input is available on an input stream
Date: Wed, 7 Jan 2009 14:38:34 -0600

Hi Eric,

I actually forgot to mention one more thing.

I use N items of first stream and one item on second stream to produce N items on output stream.
I am actually spreading data. If the spreading code is N-character bytes long, then each bit of data input byte (i.e. a total of 8 bits on input byte on second stream) will produce 8*N output items.

The input to the spreading stream is uninterrupted from a sequence generator block. But the input to the data stream i.e. the second input stream can be from a file which will exhaust when file is read completely. So i want to check if any data is available on the second stream(i.e. the data stream) in the work function each time i am done with the previous data byte.

I hope i make myself clear. Sorry for the confusion earlier.

Thanks
Ali

On Wed, Jan 7, 2009 at 12:37 PM, Eric Blossom <address@hidden> wrote:
On Wed, Jan 07, 2009 at 04:44:39AM -0600, Mir Ali wrote:
> Hi,
> I have a simple question. I have a block that has 2 input streams and the
> inputs are consumed at different rates. For each 1 input consumed on the
> first input stream N inputs are consumed in the second stream.
>
> The forecast function and set_multiple call of this block are as shown
> below,
>
> my_new_block::forecast(int noutput_items,gr_vector_int
> &ninput_items_required){
>     assert(noutput_items % N==0); # the
>
>
>     int items_on_first_input_stream = noutput_items;
>     int items_on_second_input_stream = noutput_items/(8*N);
>     ninput_items_required[0]=items_on_first_input_stream;
>     ninput_items_required[1]=items_on_data_input_stream;
>     }
>
>
>  {
>            set_output_multiple(8*N); # the output items are a multiple of 8*N.
> }

> For each (8*N) inputs consumed on second stream 1 input is consumed on first
> stream.
> If the first stream has uninterrupted supply but the second one doesn't then
> how should I check if input is available on the second stream. Will the
> input_vector contain NULL values when nothing is in it? If it is true should
> i just do
>
> if(second_stream[next_item]==null){
> .......
> }
>
> Please clarify.
>
> Thanks
> Ali

You should be deriving your class from gr_block (you may already be doing this).
There is no need to call set_output_multiple.

If I understand you correctly, to produce a single output item, you
need a single item on the first input stream, and N (== 8) items on the
second stream.

Assuming I'm understanding you correctly, then your forecast routine
should be:


static const int N = 8;

void
my_new_block::forecast(int noutput_items, gr_vector_int &ninput_items_required)
{
 ninput_items_required[0] = noutput_items;
 ninput_items_required[1] = noutput_items * N;
}

You then need to override general_work, not work:

(I'm assuming that your input and output types are float.  Change as required)


float f(const float *a, const float *b)
{
 // Produce a single float value by using a[0] and b[0] through b[N-1]...

 return XXX;
}

int
my_new_block::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 *in0 = (const float *)input_items[0];
 const float *in1 = (const float *)input_items[1];
 float *out = (float *)output_items[0];

 for (int i = 0; i < noutput_items; i++){

   out[i] = f(&in0[i], &in1[i * N]);

 }

 consume(0, noutput_items);
 consume(1, noutput_items * N);

 return noutput_items;
}


Eric



--
Mir Murtuza Ali
Graduate Student
Center for Wireless Communications
University of Mississippi
University, MS 38677


reply via email to

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