#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