diff --git a/decode.cc b/decode.cc index 339d878..2b4fb30 100644 --- a/decode.cc +++ b/decode.cc @@ -296,18 +296,31 @@ 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 pilot_sum = 0; - for (int i = 0; i < pilot_tones; ++i) - pilot_sum += demod[i*block_length+pilot_off].real(); - int pilot_phase = DSP::signum(pilot_sum); - if (std::abs(pilot_sum) < pilot_tones / 4) { + value ptsa_sum = 0; + for (int i = 0; i < pilot_tones; i += 2) + ptsa_sum += demod[i*block_length+pilot_off].real(); + int ptsa_phase = DSP::signum(ptsa_sum); + if (std::abs(ptsa_sum) < pilot_tones / 4) { std::cerr << "pilot phase damaged" << std::endl; oper_mode = -1; break; } - for (int i = 0; i < tone_count; ++i) { - tone[i] *= pilot_phase; - demod[i] *= pilot_phase; + for (int i = 0; i < tone_count; i += 2) { + tone[i] *= ptsa_phase; + demod[i] *= ptsa_phase; + } + value ptsb_sum = 0; + for (int i = 1; i < pilot_tones; i += 2) + ptsb_sum += demod[i*block_length+pilot_off].real(); + int ptsb_phase = DSP::signum(ptsb_sum); + if (std::abs(ptsb_sum) < pilot_tones / 4) { + std::cerr << "pilot phase damaged" << std::endl; + oper_mode = -1; + break; + } + for (int i = 1; i < tone_count; i += 2) { + tone[i] *= ptsb_phase; + demod[i] *= ptsb_phase; } for (int i = 0; i < pilot_tones; ++i) { index[i] = tone_off + block_length * i + pilot_off; diff --git a/encode.cc b/encode.cc index 4834563..3f7051b 100644 --- a/encode.cc +++ b/encode.cc @@ -39,6 +39,8 @@ struct Encoder : public Common cmplx fdom[symbol_len]; cmplx tdom[symbol_len]; cmplx temp[symbol_len]; + cmplx ptsa[symbol_len]; + cmplx ptsb[symbol_len]; cmplx best[symbol_len]; cmplx kern[symbol_len]; cmplx guard[guard_len]; @@ -90,29 +92,38 @@ struct Encoder : public Common } else { for (int i = 0; i < symbol_len; ++i) fdom[i] = 0; - for (int i = 0; i < tone_count; ++i) + for (int i = 0; i < tone_count; i += 2) fdom[bin(i+tone_off)] = tone[i]; - bwd(temp, fdom); + bwd(ptsa, fdom); for (int i = 0; i < symbol_len; ++i) - temp[i] *= scale; + ptsa[i] *= scale; + for (int i = 0; i < symbol_len; ++i) + fdom[i] = 0; + for (int i = 1; i < tone_count; i += 2) + fdom[bin(i+tone_off)] = tone[i]; + bwd(ptsb, fdom); + for (int i = 0; i < symbol_len; ++i) + ptsb[i] *= scale; value best_papr = 1000; - for (value pilot_phase = -1; pilot_phase < 2; pilot_phase += 2) { + for (value ptsa_phase = -1; ptsa_phase < 2; ptsa_phase += 2) { for (int i = 0; i < symbol_len; ++i) - tdom[i] = pilot_phase * temp[i]; - value peak = 0, mean = 0; - for (int i = 0; i < symbol_len; ++i) { - value power(norm(tdom[i])); - peak = std::max(peak, power); - mean += power; - } - mean /= symbol_len; - value cand_papr(peak / mean); - if (cand_papr < best_papr) { - best_papr = cand_papr; + temp[i] = ptsa_phase * ptsa[i]; + for (value ptsb_phase = -1; ptsb_phase < 2; ptsb_phase += 2) { for (int i = 0; i < symbol_len; ++i) - best[i] = tdom[i]; - if (cand_papr < 5) - break; + tdom[i] = ptsb_phase * ptsb[i] + temp[i]; + value peak = 0, mean = 0; + for (int i = 0; i < symbol_len; ++i) { + value power(norm(tdom[i])); + peak = std::max(peak, power); + mean += power; + } + mean /= symbol_len; + value cand_papr(peak / mean); + if (cand_papr < best_papr) { + best_papr = cand_papr; + for (int i = 0; i < symbol_len; ++i) + best[i] = tdom[i]; + } } } for (int i = 0; i < symbol_len; ++i)