discuss-gnuradio
[Top][All Lists]
Advanced

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

[Discuss-gnuradio] Blocks handling vectors


From: Galiero Casay Gabriele
Subject: [Discuss-gnuradio] Blocks handling vectors
Date: Mon, 3 Aug 2015 07:18:00 +0000

Hi, I have been struggling a bit trying to code a block that accept for example vectors of sync_len*sizeof(float) as input signature and outputs vectors of (sync_len+pkt_len)*sizeof(float) as output signature.

To understand how blocks handling vectors work, I tried to make the same block I did using single element items, which consists of a block that adds a preamble of sync_len at the beginning of the sequence. It worked using single element items, instead of vectors but in the receiving part, should be a block that basically removes that preamble. In this case, it was so difficult the coding and did not get it, that is why I decided to try with vectors.

Now some doubts came to my mind. In the tutorials there is a gap concerning vectors or I haven't found any processing block in the tutorial examples that explains a bit how vectors are processed.

- The io signatures would be defined like this:
        gr::io_signature::make(1,  1,  pkt_len*sizeof(float)),
        gr::io_signature::make(1, 1, sizeof(float) * (sync_word_len + pkt_len)))
 To clarify a bit what I want is to add a predefined preamble of length sync_word, which I define in the constructor and cannot be accessible.
 Now, one of my questions was, is the most suitable block that I have to use a general one? or is it possible to use a decimator?

- In my first implementation I used a general block:
 
 void
    add_sync_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
    {
        ninput_items_required[0] = noutput_items * d_pkt_len;
    } 

  int
    add_sync_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 *in = (const float *) input_items[0];
        float *out = (float *) output_items[0];

        // Do <+signal processing+>
        for (int i = 0; i < noutput_items; i++) {
            std::memcpy(&out[0], &d_sync_word[0], sizeof(float) * d_sync_word_len);
            std::memcpy(&out[d_sync_word_len], &in[0], sizeof(float) * d_pkt_len);
        }
        // Tell runtime system how many input items we consumed on
        // each input stream.
        consume_each (d_pkt_len);

        // Tell runtime system how many output items we produced.
        return noutput_items;
    }

 But when I try to connect the blocks to test them with python it gives me error:
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/gnuradio/gr/hier_block2.py", line 48, in wrapped
    raise ValueError("Unable to coerce endpoint")
ValueError: Unable to coerce endpoint

I am doing something wrong, like copying the info into output wrongly, or I coded forecast wrongly or I am indicating wrongly the consumed items. I would thanks any kind of help or explanation about how block handles vectors.

As example: d_sync_word_len = 3
                     d_sync_word = {0, 0, 0}
                     d_pkt_len = 5

Result(passed from vector to stream with a vector to stream block):
            input = (1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
           output = (0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1)

I know that there are some blocks that already do this, but I was mostly interested in knowing how blocks handle vectors. Or also I would be interested to know the inverse block of vector_insert (in python).
Thanks before hand.

Gabriele Galiero

reply via email to

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