From 8bcfd304260ddb87c2cbc9267d6edab18d7eb6bc Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Mon, 30 Jun 2025 13:30:08 +0200 Subject: [PATCH] added setup methods --- decode.cc | 132 +++++++++++++++++++++++++++--------------------------- encode.cc | 51 +++++++++++---------- 2 files changed, 95 insertions(+), 88 deletions(-) diff --git a/decode.cc b/decode.cc index d2d9b2c..26fab00 100644 --- a/decode.cc +++ b/decode.cc @@ -84,6 +84,9 @@ struct Decoder int symbol_pos; int oper_mode; int crc_bits; + int data_bits; + int data_bytes; + int cons_rows; static int bin(int carrier) { @@ -188,6 +191,69 @@ struct Decoder tmp = hilbert(blockdc(tmp.real())); return input_hist(tmp); } + void setup(int oper_mode) { + switch (oper_mode) { + case 1: + mod_bits = 2; + cons_rows = 8; + code_order = 12; + data_bits = 2048; + frozen_bits = frozen_4096_2080; + break; + case 2: + mod_bits = 2; + cons_rows = 16; + code_order = 13; + data_bits = 4096; + frozen_bits = frozen_8192_4128; + break; + case 3: + mod_bits = 2; + cons_rows = 32; + code_order = 14; + data_bits = 8192; + frozen_bits = frozen_16384_8224; + break; + case 4: + mod_bits = 4; + cons_rows = 4; + code_order = 12; + data_bits = 2048; + frozen_bits = frozen_4096_2080; + break; + case 5: + mod_bits = 4; + cons_rows = 8; + code_order = 13; + data_bits = 4096; + frozen_bits = frozen_8192_4128; + break; + case 6: + mod_bits = 4; + cons_rows = 16; + code_order = 14; + data_bits = 8192; + frozen_bits = frozen_16384_8224; + break; + case 7: + mod_bits = 6; + cons_rows = 6; + code_order = 13; + data_bits = 4096; + frozen_bits = frozen_8192_4128; + break; + case 8: + mod_bits = 6; + cons_rows = 11; + code_order = 14; + data_bits = 8192; + frozen_bits = frozen_16384_8224; + break; + default: + return; + } + data_bytes = data_bits / 8; + } Decoder(DSP::ReadPCM *pcm, const char *const *output_names, int output_count) : pcm(pcm), correlator(mls0_seq()), crc1(0x8F6E37A0) { @@ -241,71 +307,7 @@ struct Decoder std::cerr << "oper mode: " << oper_mode << std::endl; if (!oper_mode) continue; - - int data_bits = 0; - int cons_rows = 0; - switch (oper_mode) { - case 1: - mod_bits = 2; - cons_rows = 8; - code_order = 12; - data_bits = 2048; - frozen_bits = frozen_4096_2080; - break; - case 2: - mod_bits = 2; - cons_rows = 16; - code_order = 13; - data_bits = 4096; - frozen_bits = frozen_8192_4128; - break; - case 3: - mod_bits = 2; - cons_rows = 32; - code_order = 14; - data_bits = 8192; - frozen_bits = frozen_16384_8224; - break; - case 4: - mod_bits = 4; - cons_rows = 4; - code_order = 12; - data_bits = 2048; - frozen_bits = frozen_4096_2080; - break; - case 5: - mod_bits = 4; - cons_rows = 8; - code_order = 13; - data_bits = 4096; - frozen_bits = frozen_8192_4128; - break; - case 6: - mod_bits = 4; - cons_rows = 16; - code_order = 14; - data_bits = 8192; - frozen_bits = frozen_16384_8224; - break; - case 7: - mod_bits = 6; - cons_rows = 6; - code_order = 13; - data_bits = 4096; - frozen_bits = frozen_8192_4128; - break; - case 8: - mod_bits = 6; - cons_rows = 11; - code_order = 14; - data_bits = 8192; - frozen_bits = frozen_16384_8224; - break; - default: - return; - } - int data_bytes = data_bits / 8; - + setup(oper_mode); std::cerr << "demod "; for (int j = 0; j < cons_rows; ++j) { if (j) { diff --git a/encode.cc b/encode.cc index 508965e..2ee4926 100644 --- a/encode.cc +++ b/encode.cc @@ -37,6 +37,12 @@ struct Encoder static const int mls0_seed = 214; static const int mls1_poly = 0b100101011; static const int mls2_poly = 0b100101010001; + static const int code_cols = 256; + static const int comb_cols = 32; + static const int cons_cols = code_cols + comb_cols; + static const int comb_dist = 9; + static const int comb_off = 4; + static const int reserved_tones = 32; DSP::WritePCM *pcm; DSP::FastFourierTransform fwd; DSP::FastFourierTransform bwd; @@ -53,11 +59,13 @@ struct Encoder cmplx guard[guard_len]; value weight[guard_len]; value papr_min, papr_max; + const uint32_t *frozen_bits; int mod_bits; int oper_mode; + int data_bits; + int data_bytes; int code_order; int code_off; - int cons_cols; int cons_rows; int mls0_off; @@ -113,8 +121,8 @@ struct Encoder value scale = 2 / std::sqrt(value(symbol_len) / value(cons_cols)); for (int i = 0; i < symbol_len; ++i) tdom[i] /= scale * std::sqrt(value(symbol_len)); - clipping_and_filtering(scale, oper_mode > 0 && papr_reduction); - if (oper_mode > 0 && papr_reduction) + clipping_and_filtering(scale, papr_reduction); + if (papr_reduction) tone_reservation(); auto clamp = [](value v){ return v < value(-1) ? value(-1) : v > value(1) ? value(1) : v; }; for (int i = 0; i < symbol_len; ++i) @@ -216,20 +224,11 @@ struct Encoder dest[i] = src[seq()]; } } - Encoder(DSP::WritePCM *pcm, const char *const *input_names, int input_count, int freq_off, int oper_mode) : - pcm(pcm), crc1(0x8F6E37A0), oper_mode(oper_mode) + void setup(int oper_mode, int freq_off) { - const uint32_t *frozen_bits = nullptr; - int code_cols = 256; - int comb_cols = 32; - int comb_dist = 9; - int comb_off = 4; - int data_bits = 0; - int reserved_tones = 32; switch (oper_mode) { case 0: cons_rows = 1; - reserved_tones = 0; break; case 1: mod_bits = 2; @@ -290,20 +289,20 @@ struct Encoder default: return; } - int data_bytes = data_bits / 8; + data_bytes = data_bits / 8; int offset = (freq_off * symbol_len) / rate; mls0_off = offset - mls0_len / 2; - cons_cols = code_cols + comb_cols; code_off = offset - cons_cols / 2; - if (oper_mode > 0) { - value mag = 1 / value(10 * reserved_tones); - for (int i = 0, j = code_off - reserved_tones / 2; i < reserved_tones; ++i, ++j) { - if (j == code_off) - j += cons_cols; - fdom[bin(j)] = mag; - } - bwd(kern, fdom); + } + void tone_reservation_kernels() + { + value mag = 1 / value(10 * reserved_tones); + for (int i = 0, j = code_off - reserved_tones / 2; i < reserved_tones; ++i, ++j) { + if (j == code_off) + j += cons_cols; + fdom[bin(j)] = mag; } + bwd(kern, fdom); for (int i = 0; i < guard_len / 4; ++i) weight[i] = 0; for (int i = guard_len / 4; i < guard_len / 4 + guard_len / 2; ++i) { @@ -312,6 +311,12 @@ struct Encoder } for (int i = guard_len / 4 + guard_len / 2; i < guard_len; ++i) weight[i] = 1; + } + Encoder(DSP::WritePCM *pcm, const char *const *input_names, int input_count, int freq_off, int oper_mode) : + pcm(pcm), crc1(0x8F6E37A0) + { + setup(oper_mode, freq_off); + tone_reservation_kernels(); papr_min = 1000, papr_max = -1000; pilot_block(); hadamardenc(mode, oper_mode);