#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;
}