/*
* Copyright 2004 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
* GNU Radio is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* GNU Radio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Radio; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef INCLUDED_PN_CORRELATOR_CC_H
#define INCLUDED_PN_CORRELATOR_CC_H
#include <gr_block.h>
#include <gri_glfsr.h>
class pn_correlator_cc;
/*
* We use boost::shared_ptr's instead of raw pointers for all access
* to gr_blocks (and many other data structures). The shared_ptr gets
* us transparent reference counting, which greatly simplifies storage
* management issues. This is especially helpful in our hybrid
* C++ / Python system.
*
* See http://www.boost.org/libs/smart_ptr/smart_ptr.htm
*
* As a convention, the _sptr suffix indicates a boost::shared_ptr
*/
typedef boost::shared_ptr<pn_correlator_cc> pn_correlator_cc_sptr;
/*!
* \brief Return a shared_ptr to a new instance of pn_correlator_cc.
*
* To avoid accidental use of raw pointers, pn_correlator_cc's
* constructor is private. pn_make_correlator_cc is the public
* interface for creating new instances.
*/
pn_correlator_cc_sptr pn_make_correlator_cc (int degree, int mask=0, int seed=1);
/*!
* \brief square a stream of floats.
* \ingroup block
*
* \sa pn_square2_ff for a version that subclasses gr_sync_block.
*/
class pn_correlator_cc : public gr_block
{
private:
// The friend declaration allows pn_make_correlator_cc to
// access the private constructor.
friend pn_correlator_cc_sptr pn_make_correlator_cc (int degree, int mask, int seed);
int d_len;
float d_pn;
gri_glfsr *d_reference;
pn_correlator_cc (); // private constructor
protected:
pn_correlator_cc(int degree, int mask, int seed);
public:
void forecast (int noutput_items, gr_vector_int &ninput_items_required);
~pn_correlator_cc (); // public destructor
// Where all the action really happens
int general_work (int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
};
#endif /* INCLUDED_PN_CORRELATOR_CC_H */
/* -*- c++ -*- */
/*
* Copyright 2004 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
* GNU Radio is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* GNU Radio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Radio; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
/*
* config.h is generated by configure. It contains the results
* of probing for features, options etc. It should be the first
* file included in your .cc file.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <pn_correlator_cc.h>
#include <gr_io_signature.h>
/*
* Create a new instance of pn_correlator_cc and return
* a boost shared_ptr. This is effectively the public constructor.
*/
pn_correlator_cc_sptr
pn_make_correlator_cc (int degree, int mask, int seed)
{
return pn_correlator_cc_sptr (new pn_correlator_cc (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_cc::pn_correlator_cc (int degree, int mask, int seed)
: gr_block("correlator_cc",
gr_make_io_signature (MIN_IN, MAX_IN, sizeof (float)),
gr_make_io_signature (MIN_OUT, MAX_OUT, sizeof (float)))
//(unsigned int)((1ULL << degree)-1)) // PN code length
{
d_len = (unsigned int)((1ULL << degree)-1);
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_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required)
{
int input_required = noutput_items ;
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_cc::~pn_correlator_cc ()
{
delete d_reference;
}
int
pn_correlator_cc::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];
float sum;
int i=0;
while(abs(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++)-1) * d_pn;
}
sum = sum/d_len;
}
for(int i=0;i<noutput_items;i++)
{
d_pn = d_reference->next_bit();
if(d_pn == *in++)
*out++=0;
else
*out++=1;
}
consume_each (noutput_items);
return noutput_items;
}
Hi:
I recently add a new block to the GNURadio and GRC.The function of the block is to correlate the received spread signal and the local PN code.
I think my block can work well,but there is one thing I do not know how to fix.Sometimes the input of my block is 0 and then it will back to the normal.
But I saw the output data from the last block ,they are correct.Did anyone have situation before? and how did it happen? In the accessory are the code
of my block.
thank you in advance.
No comments:
Post a Comment