2011/9/13 intermilan <tianxia...@hotmail.com>

>  Hi Tom:
>       Thanks for your reply. Can you tell me how to fix it?  May be I
> looked at my code too much, I do not know where to change.
>
> inter
>

Sorry, this is something you're really going to have to work out yourself. I
find it sometimes helps to draw a picture of the buffers as the work
function iterates over it to see what's happening to the pointers.

Just remember, if i is the index to the input buffer "in", then in[i] is
only valid for 0 <= i <= ninput_items[0] (or noutput_items if you are using
a gr_sync_block). If you need to look beyond the current input buffer, use
set_history(nhist), and so the constraint becomes 0 <= i <= (ninput_items[0]
+ nhist).

Tom




>  ------------------------------
> From: trondeau1...@gmail.com
> Date: Mon, 12 Sep 2011 22:42:39 -0400
> Subject: Re: [Discuss-gnuradio] a question about using new block in
> GNURadio
> To: tianxia...@hotmail.com
> CC: discuss-gnuradio@gnu.org
>
>
> 2011/9/12 intermilan <tianxia...@hotmail.com>
>
>
>  Hi all:
>     I wrote a new block and add it into the GnuRadio. The function of this
> block is to synchronize the spread signal,
> which means this block used local PN sequence to correlate the input
> signal. And I set the threshold, if the correlation value is
> larger than the threshold, that means I finish the synchronous part. Then
> use the local PN sequence to XOR the synchronized
> signal,  so we will get the de-spread signal.
>     But there is a problem I can not figure out the reason. I test this
> block in GRC. This block can works well in short time. Then
> sometimes the value of the output of this block would become 0. And I do
> not know the reason of this situation. I put my code
> of the block in this e-mail.
>     I hope someone can help me to find out where is the problem of my code.
> Thank you in advance.
>
>
>
> Just a very quick read-through, but it looks like you are advancing i too
> much. You're going to walk it out of bounds of the input buffer.
>
> Tom
>
>
>
>  #ifdef HAVE_CONFIG_H
> #include "config.h"
> #endif
>
> #include <pn_correlator1_ff.h>
> #include <gr_io_signature.h>
> #include <vector>
> #include <iostream>
> #include <fstream>
>
> /*
>  * Create a new instance of pn_correlator_cc and return
>  * a boost shared_ptr.  This is effectively the public constructor.
>  */
> pn_correlator_ff_sptr
> pn_make_correlator_ff (int degree, int mask, int seed)
> {
>   return pn_correlator_ff_sptr (new pn_correlator1_ff (degree, mask,
> seed));
> }
>
> /*
>  * Specify constraints on number of input and output streams.
>  * This info is used to construct the input and output signatures
>  * (2nd & 3rd args to gr_block's constructor).  The input and
>  * output signatures are used by the runtime system to
>  * check that a valid number and type of inputs and outputs
>  * are connected to this block.  In this case, we accept
>  * only 1 input and 1 output.
>  */
> static const int MIN_IN = 1;    // mininum number of input streams
> static const int MAX_IN = 1;    // maximum number of input streams
> static const int MIN_OUT = 1;    // minimum number of output streams
> static const int MAX_OUT = 1;    // maximum number of output streams
>
> /*
>  * The private constructor
>  */
> pn_correlator_ff::pn_correlator_ff (int degree, int mask, int seed)
>   : gr_block("correlator_ff",
>                    gr_make_io_signature (MIN_IN, MAX_IN, sizeof (float)),
>                    gr_make_io_signature (MIN_OUT, MAX_OUT, sizeof (float)))
>
> {
>   d_len = (unsigned int)((1ULL << degree)-1);
>   d = degree;
>   if (mask == 0)
>     mask = gri_glfsr::glfsr_mask(degree);
>   d_reference = new gri_glfsr(mask, seed);
>   for (int i = 0; i < d_len; i++)    // initialize to last value in
> sequence
>     d_pn = 2.0*d_reference->next_bit()-1.0;
> }
>
>
> void
> pn_correlator_ff::forecast (int noutput_items, gr_vector_int
> &ninput_items_required)
> {
>   int input_required =   noutput_items + d*d_len ;
>   unsigned ninputs = ninput_items_required.size();
>   for (unsigned int i = 0; i < ninputs; i++) {
>     ninput_items_required[i] = input_required;
>   }
> }
>
>
> /*
>  * Our virtual destructor.
>  */
> pn_correlator_ff::~pn_correlator_ff()
> {
>   delete d_reference;
> }
>
>
>
> int
> pn_correlator_ff::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];
>   int a=0;
>   int i=0;
>   float sum =0;
>
>  while(a<noutput_items)
>  {
>       while(sum<0.8)
>      {
>             sum =0;
>             for (int j = 0; j < d_len; j++) {
>                   if (j != 0)                    // retard PN generator one
> sample per period
>                 d_pn = 2.0*d_reference->next_bit()-1.0; // no conditionals
>                   sum+= (2*(in[i])-1) * d_pn;
>             i++;
>              }
>         sum = abs(sum/d_len); //calculate the correlate value
>         }
>
>   d_pn = d_reference->next_bit();
>
>   if(d_pn == in[i]) //  use local PN sequence to XOR the synchronized
> signal
>      out[a]=0;
>   else
>      out[a]=1;
>
>  i++;
>  a++;
>
>  }
>   consume_each (noutput_items);
>   return noutput_items;
> }
>
> _______________________________________________
> Discuss-gnuradio mailing list
> Discuss-gnuradio@gnu.org
> https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
>
>
>
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to