diff --git a/decode.cc b/decode.cc index 774fb7f..9fbaf86 100644 --- a/decode.cc +++ b/decode.cc @@ -214,6 +214,8 @@ struct Decoder : Common setup(oper_mode); std::cerr << "Es/N0 (dB):"; for (int j = 0, k = 0; j < symbol_count; ++j) { + pilot_off = (block_skew * j + first_pilot) % block_length; + reserved_off = (block_skew * j + first_reserved) % block_length; if (j) { for (int i = 0; i < extended_len; ++i) correlator(buf = next_sample()); @@ -222,18 +224,20 @@ struct Decoder : Common for (int i = 0; i < guard_len; ++i) osc(); fwd(fdom, tdom); + for (int i = 0; i < tone_count; ++i) + tone[i] = fdom[bin(i+tone_off)]; } else { for (int i = 0; i < symbol_pos+symbol_len+extended_len; ++i) correlator(buf = next_sample()); - seq1.reset(); hadamard_encoder(mode, oper_mode); + for (int i = 0; i < tone_count; ++i) + tone[i] = fdom[bin(i+tone_off)]; + for (int i = 0; i < pilot_tones; ++i) + tone[block_length*i+pilot_off] *= mode[i]; + seq1.reset(); } - for (int i = 0; i < tone_count; ++i) - tone[i] = fdom[bin(i+tone_off)]; - pilot_off = (block_skew * j + first_pilot) % block_length; - reserved_off = (block_skew * j + first_reserved) % block_length; for (int i = 0; i < pilot_tones; ++i) - tone[block_length*i+pilot_off] *= nrz(seq1()) * mode[i]; + tone[block_length*i+pilot_off] *= nrz(seq1()); for (int i = 0; i < tone_count; ++i) demod[i] = demod_or_erase(tone[i], chan[i]); for (int i = 0; i < pilot_tones; ++i) { diff --git a/encode.cc b/encode.cc index 17b8625..0007b12 100644 --- a/encode.cc +++ b/encode.cc @@ -275,12 +275,14 @@ struct Encoder : public Common polar_encoder(code, mesg, frozen_bits, code_order); shuffle(perm, code); CODE::MLS seq1(mls1_poly); - for (int j = 0, k = 0; j < symbol_count; ++j) { + for (int j = 0, k = 0, m = 0; j < symbol_count; ++j) { pilot_off = (block_skew * j + first_pilot) % block_length; reserved_off = (block_skew * j + first_reserved) % block_length; - for (int i = 0, m = 0; i < tone_count; ++i) { + for (int i = 0; i < tone_count; ++i) { if (i % block_length == pilot_off) { - tone[i] = nrz(seq1()) * mode[m++]; + tone[i] = nrz(seq1()); + if (j == 0) + tone[i] *= mode[m++]; } else if (i % block_length == reserved_off) { tone[i] = 0; } else {