From d1a2ec19f0f3e519f3d759a4c76b5f25e88322b7 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Fri, 15 Dec 2023 17:54:54 +0100 Subject: [PATCH] added three new, non-differential modes --- decode.cc | 28 ++++++++++++++-------------- encode.cc | 16 +++++++++------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/decode.cc b/decode.cc index 600ec1a..9a1b8a1 100644 --- a/decode.cc +++ b/decode.cc @@ -189,6 +189,7 @@ struct Decoder static const int mls1_len = 255; static const int mls1_off = - mls1_len / 2; static const int mls1_poly = 0b100101011; + static const int mls2_poly = 0b100101010001; static const int buffer_len = 4 * extended_len; static const int search_pos = extended_len; DSP::ReadPCM *pcm; @@ -206,7 +207,7 @@ struct Decoder int8_t genmat[255*71]; mesg_type mesg[max_bits], mess[code_len]; code_type code[code_len]; - cmplx cons[cons_total], prev[cons_cols]; + cmplx cons[cons_total], chan[cons_cols]; cmplx fdom[symbol_len], tdom[symbol_len]; value index[cons_cols], phase[cons_cols]; value cfo_rad, sfo_rad; @@ -219,15 +220,15 @@ struct Decoder { return (carrier + symbol_len) % symbol_len; } - static int nrz(bool bit) + static value nrz(bool bit) { return 1 - 2 * bit; } - static cmplx demod_or_erase(cmplx curr, cmplx prev) + static cmplx demod_or_erase(cmplx curr, cmplx chan) { - if (!(norm(prev) > 0)) + if (!(norm(chan) > 0)) return 0; - cmplx cons = curr / prev; + cmplx cons = curr / chan; if (!(norm(cons) <= 4)) return 0; return cons; @@ -328,7 +329,7 @@ struct Decoder continue; } oper_mode = md & 255; - if (oper_mode && (oper_mode < 14 || oper_mode > 16)) { + if (oper_mode && (oper_mode < 17 || oper_mode > 19)) { std::cerr << "operation mode " << oper_mode << " unsupported." << std::endl; continue; } @@ -348,15 +349,16 @@ struct Decoder if (!okay || !oper_mode) return; - for (int i = 0; i < symbol_pos+extended_len; ++i) + for (int i = 0; i < symbol_pos+2*extended_len; ++i) buf = next_sample(); for (int i = 0; i < symbol_len; ++i) tdom[i] = buf[i] * osc(); for (int i = 0; i < guard_len; ++i) osc(); fwd(fdom, tdom); + CODE::MLS seq2(mls2_poly); for (int i = 0; i < cons_cols; ++i) - prev[i] = fdom[bin(i+code_off)]; + chan[i] = nrz(seq2()) * fdom[bin(i+code_off)]; std::cerr << "demod "; for (int j = 0; j < cons_rows; ++j) { for (int i = 0; i < extended_len; ++i) @@ -367,9 +369,7 @@ struct Decoder osc(); fwd(fdom, tdom); for (int i = 0; i < cons_cols; ++i) - cons[cons_cols*j+i] = demod_or_erase(fdom[bin(i+code_off)], prev[i]); - for (int i = 0; i < cons_cols; ++i) - prev[i] = fdom[bin(i+code_off)]; + cons[cons_cols*j+i] = demod_or_erase(fdom[bin(i+code_off)], chan[i]); std::cerr << "."; } std::cerr << " done" << std::endl; @@ -425,15 +425,15 @@ struct Decoder } int data_bits = 0; switch (oper_mode) { - case 14: + case 17: data_bits = 1360; frozen_bits = frozen_2048_1392; break; - case 15: + case 18: data_bits = 1024; frozen_bits = frozen_2048_1056; break; - case 16: + case 19: data_bits = 680; frozen_bits = frozen_2048_712; break; diff --git a/encode.cc b/encode.cc index 4fbd728..6277b58 100644 --- a/encode.cc +++ b/encode.cc @@ -216,15 +216,15 @@ struct Encoder const uint32_t *frozen_bits = nullptr; int data_bits = 0; switch (oper_mode) { - case 14: + case 17: data_bits = 1360; frozen_bits = frozen_2048_1392; break; - case 15: + case 18: data_bits = 1024; frozen_bits = frozen_2048_1056; break; - case 16: + case 19: data_bits = 680; frozen_bits = frozen_2048_712; break; @@ -239,9 +239,11 @@ struct Encoder for (int i = 0; i < 32; ++i) mesg[i+data_bits] = nrz((crc1()>>i)&1); polarenc(code, mesg, frozen_bits, code_order); + pilot_block(); + value code_fac = std::sqrt(value(symbol_len) / value(cons_cols)); for (int j = 0; j < cons_rows; ++j) { for (int i = 0; i < cons_cols; ++i) - fdom[bin(i+code_off)] *= + fdom[bin(i+code_off)] = code_fac * mod_map(code+mod_bits*(cons_cols*j+i)); symbol(); } @@ -328,13 +330,13 @@ int main(int argc, char **argv) int oper_mode = 0; for (int i = 128; i < 170; ++i) if (!oper_mode && input_data[i]) - oper_mode = 14; + oper_mode = 17; for (int i = 85; i < 128; ++i) if (!oper_mode && input_data[i]) - oper_mode = 15; + oper_mode = 18; for (int i = 0; i < 85; ++i) if (!oper_mode && input_data[i]) - oper_mode = 16; + oper_mode = 19; CODE::Xorshift32 scrambler; for (int i = 0; i < data_len; ++i) input_data[i] ^= scrambler();