discuss-gnuradio
[Top][All Lists]
Advanced

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

Re: [Discuss-gnuradio] a question about using new block in GNURadio


From: Tom Rondeau
Subject: Re: [Discuss-gnuradio] a question about using new block in GNURadio
Date: Mon, 12 Sep 2011 22:42:39 -0400

2011/9/12 intermilan <address@hidden>
 
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
address@hidden
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio



reply via email to

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