howto_decim_gdescrambler_cc.cc

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <howto_decim_gdescrambler_cc.h>
#include <gr_io_signature.h>
#include <math.h>

howto_decim_gdescrambler_cc_sptr
howto_make_decim_gdescrambler_cc(int degree, int mask, int seed)
{
  return howto_decim_gdescrambler_cc_sptr (new howto_decim_gdescrambler_cc(degree, mask, seed));
}

howto_decim_gdescrambler_cc::howto_decim_gdescrambler_cc(int degree, int mask, int seed)
  : gr_sync_decimator ("decim_gdescrambler_cc", 
		       gr_make_io_signature (1, 1, sizeof(gr_complex)),
		       gr_make_io_signature (1, 1, sizeof(gr_complex)),
		       (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;
}

howto_decim_gdescrambler_cc::~howto_decim_gdescrambler_cc()
{
  delete d_reference;
}

int howto_decim_gdescrambler_cc::work(int noutput_items,
			  gr_vector_const_void_star &input_items,
			  gr_vector_void_star &output_items)
{
  const gr_complex *in = (const gr_complex *) input_items[0];
  gr_complex *out = (gr_complex *) output_items[0];
  gr_complex sum;
  gr_complex max_sum;

  for (int i = 0; i < noutput_items; i++) {//loop for one output
  	max_sum = gr_complex(0.0, 0.0);
    for (int k = 0; k < d_len; k++){
    	sum = 0.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 += *in++ * d_pn;
	    } 
	    in = in - d_len;
	    if( fabs(real(max_sum)) < fabs(real(sum)) )
	    	max_sum = sum;
    }
    *out++ = max_sum*gr_complex(1.0/d_len, 0.0);
    in = in + d_len; //gp the next symbol    
  }

  return noutput_items;
}

最終更新:2011年06月18日 04:19