diff --git a/decode.cc b/decode.cc index 89dd397..95ab99e 100644 --- a/decode.cc +++ b/decode.cc @@ -9,8 +9,8 @@ Copyright 2021 Ahmet Inan #include #include namespace DSP { using std::abs; using std::min; using std::cos; using std::sin; } +#include "repeated_median.hh" #include "bip_buffer.hh" -#include "theil_sen.hh" #include "xorshift.hh" #include "trigger.hh" #include "complex.hh" @@ -193,7 +193,7 @@ struct Decoder DSP::BlockDC blockdc; DSP::Hilbert hilbert; DSP::BipBuffer input_hist; - DSP::TheilSenEstimator tse; + DSP::RepeatedMedianEstimator2 rme; SchmidlCox correlator; CODE::CRC crc0; CODE::CRC crc1; @@ -519,13 +519,13 @@ struct Decoder index[i] = i + code_off; phase[i] = arg(cons[cons_cols*j+i] * conj(mod_map(tmp))); } - tse.compute(index, phase, cons_cols); - //std::cerr << "Theil-Sen slope = " << tse.slope() << std::endl; - //std::cerr << "Theil-Sen yint = " << tse.yint() << std::endl; - sum_slope += tse.slope(); - sum_yint += tse.yint(); + rme.compute(index, phase, cons_cols); + //std::cerr << "rme slope = " << rme.slope() << std::endl; + //std::cerr << "rme yint = " << rme.yint() << std::endl; + sum_slope += rme.slope(); + sum_yint += rme.yint(); for (int i = 0; i < cons_cols; ++i) - cons[cons_cols*j+i] *= DSP::polar(1, -tse(i+code_off)); + cons[cons_cols*j+i] *= DSP::polar(1, -rme(i+code_off)); } value avg_slope = sum_slope / cons_rows; value avg_yint = sum_yint / cons_rows; @@ -557,20 +557,15 @@ struct Decoder for (int i = 0; i < cons_cnt; ++i) mod_soft(code+mod_bits*i, cons[i], precision); lengthen(); - CODE::PolarHelper::PATH metric[mesg_type::SIZE]; - polardec(metric, mesg, code, frozen_bits, code_order); + polardec(0, mesg, code, frozen_bits, code_order); systematic(); - int order[mesg_type::SIZE]; - for (int k = 0; k < mesg_type::SIZE; ++k) - order[k] = k; - std::sort(order, order+mesg_type::SIZE, [metric](int a, int b){ return metric[a] < metric[b]; }); int best = -1; for (int k = 0; k < mesg_type::SIZE; ++k) { crc1.reset(); for (int i = 0; i < crc_bits; ++i) - crc1(mesg[i].v[order[k]] < 0); + crc1(mesg[i].v[k] < 0); if (crc1() == 0) { - best = order[k]; + best = k; break; } }