From 636fcd4f97572a4c7aea32e8162affb77a101c65 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Fri, 18 Jul 2025 10:55:34 +0200 Subject: [PATCH] added mode table per Rory (VK4SUS) --- common.hh | 120 ++++++++++++++++++++++++++++++++++-------------------- decode.cc | 21 +++++++--- encode.cc | 13 ++++-- 3 files changed, 99 insertions(+), 55 deletions(-) diff --git a/common.hh b/common.hh index 8b0eaa7..cbba5ab 100644 --- a/common.hh +++ b/common.hh @@ -15,8 +15,8 @@ struct Common static const int mod_max = 8; static const int code_max = 16; static const int bits_max = 1 << code_max; - static const int data_max = 2048; - static const int symbols_max = 22 + 1; + static const int data_max = 4096; + static const int symbols_max = 26 + 1; static const int mls0_poly = 0x331; static const int mls0_seed = 214; static const int mls1_poly = 0x43; @@ -52,78 +52,108 @@ struct Common Common() : crc0(0xA8F4), crc1(0x8F6E37A0) {} - void setup(int mode) + bool setup(int mode) { - switch (mode) { + bool analog_mode = mode & 128; + if (analog_mode) { + std::cerr << "analog mode not supported yet" << std::endl; + return false; + } + int modulation = (mode >> 4) & 7; + switch (modulation) { case 0: mod_bits = 1; - symbol_count = 16; + symbol_count = 8; differential = true; - code_order = 12; - data_bits = 2048; - frozen_bits = frozen_4096_2080; + code_order = 11; break; case 1: mod_bits = 2; - symbol_count = 16; + symbol_count = 4; differential = true; - code_order = 13; - data_bits = 4096; - frozen_bits = frozen_8192_4128; + code_order = 11; break; case 2: mod_bits = 3; - symbol_count = 22; + symbol_count = 11; differential = true; - code_order = 14; - data_bits = 8192; - frozen_bits = frozen_16384_8224; + code_order = 13; break; case 3: - mod_bits = 1; - symbol_count = 16; - differential = false; - code_order = 12; - data_bits = 2048; - frozen_bits = frozen_4096_2080; - break; - case 4: - mod_bits = 2; - symbol_count = 16; - differential = false; - code_order = 13; - data_bits = 4096; - frozen_bits = frozen_8192_4128; - break; - case 5: mod_bits = 4; symbol_count = 4; differential = false; code_order = 12; - data_bits = 2048; - frozen_bits = frozen_4096_2080; break; - case 6: - mod_bits = 4; - symbol_count = 16; + case 4: + mod_bits = 6; + symbol_count = 11; differential = false; code_order = 14; - data_bits = 8192; - frozen_bits = frozen_16384_8224; break; - case 7: - mod_bits = 6; - symbol_count = 22; + case 5: + mod_bits = 8; + symbol_count = 8; + differential = false; + code_order = 14; + break; + case 6: + mod_bits = 10; + symbol_count = 13; + differential = false; + code_order = 15; + break; + case 7: + mod_bits = 12; + symbol_count = 11; differential = false; code_order = 15; - data_bits = 16384; - frozen_bits = frozen_32768_16416; break; default: - return; + return false; + } + bool frame_length = mode & 1; + if (frame_length) { + symbol_count *= 2; + ++code_order; + } + int code_rate = (mode >> 1) & 7; + if (code_rate == 0) { + switch (code_order) { + case 11: + data_bits = 1024; + frozen_bits = frozen_2048_1056; + break; + case 12: + data_bits = 2048; + frozen_bits = frozen_4096_2080; + break; + case 13: + data_bits = 4096; + frozen_bits = frozen_8192_4128; + break; + case 14: + data_bits = 8192; + frozen_bits = frozen_16384_8224; + break; + case 15: + data_bits = 16384; + frozen_bits = frozen_32768_16416; + break; + case 16: + data_bits = 32768; + frozen_bits = frozen_65536_32800; + break; + default: + return false; + } + } else { + std::cerr << "code rate " << code_rate << " not supported yet" << std::endl; + return false; } oper_mode = mode; data_bytes = data_bits / 8; + return true; } }; diff --git a/decode.cc b/decode.cc index fffb526..0d8b8ca 100644 --- a/decode.cc +++ b/decode.cc @@ -341,10 +341,14 @@ struct Decoder : Common cmplx hard(1, 0); if (i % block_length != head_off && i % block_length != tail_off) { int bits = mod_bits; - if (oper_mode == 2 && l % 32 == 30) + if (mod_bits == 3 && l % 32 == 30) bits = 2; - if (oper_mode == 7 && l % 64 == 60) + if (mod_bits == 6 && l % 64 == 60) bits = 4; + if (mod_bits == 10 && l % 128 == 120) + bits = 8; + if (mod_bits == 12 && l % 128 == 120) + bits = 8; demap_hard(perm+l, demod[i], bits); hard = map_bits(perm+l, bits); l += bits; @@ -359,10 +363,14 @@ struct Decoder : Common for (int i = 0; i < tone_count; ++i) { if (i % block_length != head_off && i % block_length != tail_off) { int bits = mod_bits; - if (oper_mode == 2 && k % 32 == 30) + if (mod_bits == 3 && k % 32 == 30) bits = 2; - if (oper_mode == 7 && k % 64 == 60) + if (mod_bits == 6 && k % 64 == 60) bits = 4; + if (mod_bits == 10 && k % 128 == 120) + bits = 8; + if (mod_bits == 12 && k % 128 == 120) + bits = 8; demap_soft(perm+k, demod[i], precision, bits); k += bits; } @@ -373,12 +381,13 @@ struct Decoder : Common std::cerr << "preamble decoding error." << std::endl; break; } - if (meta_info > 7) { + if (meta_info > 255) { std::cerr << "unsupported operation mode: " << meta_info << std::endl; break; } + if (!setup(meta_info)) + break; k = 0; - setup(meta_info); for (int i = 0; i < symbol_pos+symbol_len+extended_len; ++i) correlator(buf = next_sample()); std::cerr << "oper mode: " << oper_mode << std::endl; diff --git a/encode.cc b/encode.cc index b38cf32..e71b21b 100644 --- a/encode.cc +++ b/encode.cc @@ -271,7 +271,8 @@ struct Encoder : public Common } Encoder(DSP::WritePCM *pcm, const char *const *input_names, int input_count, int freq_off, int oper_mode) : pcm(pcm) { - setup(oper_mode); + if (!setup(oper_mode)) + return; int offset = (freq_off * symbol_len) / rate; tone_off = offset - tone_count / 2; guard_interval_weights(); @@ -310,10 +311,14 @@ struct Encoder : public Common tone[i] = nrz(seq1()); } else if (j) { int bits = mod_bits; - if (oper_mode == 2 && k % 32 == 30) + if (mod_bits == 3 && k % 32 == 30) bits = 2; - if (oper_mode == 7 && k % 64 == 60) + if (mod_bits == 6 && k % 64 == 60) bits = 4; + if (mod_bits == 10 && k % 128 == 120) + bits = 8; + if (mod_bits == 12 && k % 128 == 120) + bits = 8; tone[i] = map_bits(perm+k, bits); k += bits; } else { @@ -350,7 +355,7 @@ int main(int argc, char **argv) } int input_count = argc - 7; int oper_mode = std::atoi(argv[6]); - if (oper_mode < 0 || oper_mode > 7) { + if (oper_mode < 0 || oper_mode > 255) { std::cerr << "Unsupported operation mode." << std::endl; return 1; }