diff --git a/decode.cc b/decode.cc index de52b50..e51ba4e 100644 --- a/decode.cc +++ b/decode.cc @@ -296,12 +296,13 @@ struct Decoder : Common tone[i] *= nrz(seq1()); for (int i = 0; i < tone_count; ++i) demod[i] = demod_or_erase(tone[i], chan[i]); - value ptsa_sum = 0; + auto rot = [](cmplx p){ return std::abs(p.real()) < std::abs(p.imag()) ? cmplx(0, p.imag() < 0 ? 1 : -1) : cmplx(p.real() < 0 ? -1 : 1); }; + cmplx ptsa_sum; for (int i = 0; i < tone_count; i += 8) if (i % block_length == pilot_off) - ptsa_sum += demod[i].real(); - int ptsa_phase = DSP::signum(ptsa_sum); - if (std::abs(ptsa_sum) < pilot_tones / (8 * 2)) { + ptsa_sum += demod[i]; + cmplx ptsa_phase = rot(ptsa_sum); + if (abs(ptsa_sum) < pilot_tones / (8 * 2)) { std::cerr << "pilot phase damaged" << std::endl; oper_mode = -1; break; @@ -310,12 +311,12 @@ struct Decoder : Common tone[i] *= ptsa_phase; demod[i] *= ptsa_phase; } - value ptsb_sum = 0; + cmplx ptsb_sum; for (int i = 1; i < tone_count; i += 8) if (i % block_length == pilot_off) - ptsb_sum += demod[i].real(); - int ptsb_phase = DSP::signum(ptsb_sum); - if (std::abs(ptsb_sum) < pilot_tones / (8 * 2)) { + ptsb_sum += demod[i]; + cmplx ptsb_phase = rot(ptsb_sum); + if (abs(ptsb_sum) < pilot_tones / (8 * 2)) { std::cerr << "pilot phase damaged" << std::endl; oper_mode = -1; break; @@ -324,12 +325,12 @@ struct Decoder : Common tone[i] *= ptsb_phase; demod[i] *= ptsb_phase; } - value ptsc_sum = 0; + cmplx ptsc_sum; for (int i = 2; i < tone_count; i += 8) if (i % block_length == pilot_off) - ptsc_sum += demod[i].real(); - int ptsc_phase = DSP::signum(ptsc_sum); - if (std::abs(ptsc_sum) < pilot_tones / (8 * 2)) { + ptsc_sum += demod[i]; + cmplx ptsc_phase = rot(ptsc_sum); + if (abs(ptsc_sum) < pilot_tones / (8 * 2)) { std::cerr << "pilot phase damaged" << std::endl; oper_mode = -1; break; @@ -338,12 +339,12 @@ struct Decoder : Common tone[i] *= ptsc_phase; demod[i] *= ptsc_phase; } - value ptsd_sum = 0; + cmplx ptsd_sum; for (int i = 3; i < tone_count; i += 8) if (i % block_length == pilot_off) - ptsd_sum += demod[i].real(); - int ptsd_phase = DSP::signum(ptsd_sum); - if (std::abs(ptsd_sum) < pilot_tones / (8 * 2)) { + ptsd_sum += demod[i]; + cmplx ptsd_phase = rot(ptsd_sum); + if (abs(ptsd_sum) < pilot_tones / (8 * 2)) { std::cerr << "pilot phase damaged" << std::endl; oper_mode = -1; break; @@ -352,12 +353,12 @@ struct Decoder : Common tone[i] *= ptsd_phase; demod[i] *= ptsd_phase; } - value ptse_sum = 0; + cmplx ptse_sum; for (int i = 4; i < tone_count; i += 8) if (i % block_length == pilot_off) - ptse_sum += demod[i].real(); - int ptse_phase = DSP::signum(ptse_sum); - if (std::abs(ptse_sum) < pilot_tones / (8 * 2)) { + ptse_sum += demod[i]; + cmplx ptse_phase = rot(ptse_sum); + if (abs(ptse_sum) < pilot_tones / (8 * 2)) { std::cerr << "pilot phase damaged" << std::endl; oper_mode = -1; break; @@ -366,12 +367,12 @@ struct Decoder : Common tone[i] *= ptse_phase; demod[i] *= ptse_phase; } - value ptsf_sum = 0; + cmplx ptsf_sum; for (int i = 5; i < tone_count; i += 8) if (i % block_length == pilot_off) - ptsf_sum += demod[i].real(); - int ptsf_phase = DSP::signum(ptsf_sum); - if (std::abs(ptsf_sum) < pilot_tones / (8 * 2)) { + ptsf_sum += demod[i]; + cmplx ptsf_phase = rot(ptsf_sum); + if (abs(ptsf_sum) < pilot_tones / (8 * 2)) { std::cerr << "pilot phase damaged" << std::endl; oper_mode = -1; break; @@ -380,12 +381,12 @@ struct Decoder : Common tone[i] *= ptsf_phase; demod[i] *= ptsf_phase; } - value ptsg_sum = 0; + cmplx ptsg_sum; for (int i = 6; i < tone_count; i += 8) if (i % block_length == pilot_off) - ptsg_sum += demod[i].real(); - int ptsg_phase = DSP::signum(ptsg_sum); - if (std::abs(ptsg_sum) < pilot_tones / (8 * 2)) { + ptsg_sum += demod[i]; + cmplx ptsg_phase = rot(ptsg_sum); + if (abs(ptsg_sum) < pilot_tones / (8 * 2)) { std::cerr << "pilot phase damaged" << std::endl; oper_mode = -1; break; @@ -394,12 +395,12 @@ struct Decoder : Common tone[i] *= ptsg_phase; demod[i] *= ptsg_phase; } - value ptsh_sum = 0; + cmplx ptsh_sum; for (int i = 7; i < tone_count; i += 8) if (i % block_length == pilot_off) - ptsh_sum += demod[i].real(); - int ptsh_phase = DSP::signum(ptsh_sum); - if (std::abs(ptsh_sum) < pilot_tones / (8 * 2)) { + ptsh_sum += demod[i]; + cmplx ptsh_phase = rot(ptsh_sum); + if (abs(ptsh_sum) < pilot_tones / (8 * 2)) { std::cerr << "pilot phase damaged" << std::endl; oper_mode = -1; break; diff --git a/encode.cc b/encode.cc index 094814a..f42e2c2 100644 --- a/encode.cc +++ b/encode.cc @@ -159,30 +159,32 @@ struct Encoder : public Common for (int i = 0; i < symbol_len; ++i) ptsh[i] *= scale; value best_papr = 1000; - for (value ptsh_phase = -1; ptsh_phase < 2; ptsh_phase += 2) { + int phase_max = 4; + auto rot = [](int i){ return i&2 ? cmplx(0, nrz(i&1)) : cmplx(nrz(i&1)); }; + for (int ptsh_phase = 0; ptsh_phase < phase_max; ++ptsh_phase) { for (int i = 0; i < symbol_len; ++i) - tmph[i] = ptsh_phase * ptsh[i]; - for (value ptsg_phase = -1; ptsg_phase < 2; ptsg_phase += 2) { + tmph[i] = rot(ptsh_phase) * ptsh[i]; + for (int ptsg_phase = 0; ptsg_phase < phase_max; ++ptsg_phase) { for (int i = 0; i < symbol_len; ++i) - tmpg[i] = ptsg_phase * ptsg[i] + tmph[i]; - for (value ptsf_phase = -1; ptsf_phase < 2; ptsf_phase += 2) { + tmpg[i] = rot(ptsg_phase) * ptsg[i] + tmph[i]; + for (int ptsf_phase = 0; ptsf_phase < phase_max; ++ptsf_phase) { for (int i = 0; i < symbol_len; ++i) - tmpf[i] = ptsf_phase * ptsf[i] + tmpg[i]; - for (value ptse_phase = -1; ptse_phase < 2; ptse_phase += 2) { + tmpf[i] = rot(ptsf_phase) * ptsf[i] + tmpg[i]; + for (int ptse_phase = 0; ptse_phase < phase_max; ++ptse_phase) { for (int i = 0; i < symbol_len; ++i) - tmpe[i] = ptse_phase * ptse[i] + tmpf[i]; - for (value ptsd_phase = -1; ptsd_phase < 2; ptsd_phase += 2) { + tmpe[i] = rot(ptse_phase) * ptse[i] + tmpf[i]; + for (int ptsd_phase = 0; ptsd_phase < phase_max; ++ptsd_phase) { for (int i = 0; i < symbol_len; ++i) - tmpd[i] = ptsd_phase * ptsd[i] + tmpe[i]; - for (value ptsc_phase = -1; ptsc_phase < 2; ptsc_phase += 2) { + tmpd[i] = rot(ptsd_phase) * ptsd[i] + tmpe[i]; + for (int ptsc_phase = 0; ptsc_phase < phase_max; ++ptsc_phase) { for (int i = 0; i < symbol_len; ++i) - tmpc[i] = ptsc_phase * ptsc[i] + tmpd[i]; - for (value ptsb_phase = -1; ptsb_phase < 2; ptsb_phase += 2) { + tmpc[i] = rot(ptsc_phase) * ptsc[i] + tmpd[i]; + for (int ptsb_phase = 0; ptsb_phase < phase_max; ++ptsb_phase) { for (int i = 0; i < symbol_len; ++i) - tmpb[i] = ptsb_phase * ptsb[i] + tmpc[i]; - for (value ptsa_phase = -1; ptsa_phase < 2; ptsa_phase += 2) { + tmpb[i] = rot(ptsb_phase) * ptsb[i] + tmpc[i]; + for (int ptsa_phase = 0; ptsa_phase < phase_max; ++ptsa_phase) { for (int i = 0; i < symbol_len; ++i) - test[i] = ptsa_phase * ptsa[i] + tmpb[i]; + test[i] = rot(ptsa_phase) * ptsa[i] + tmpb[i]; value peak = 0, mean = 0; for (int i = 0; i < symbol_len; ++i) { value power(norm(test[i]));