added mode table per Rory (VK4SUS)

This commit is contained in:
Ahmet Inan 2025-07-18 10:55:34 +02:00
commit 636fcd4f97
3 changed files with 94 additions and 50 deletions

120
common.hh
View file

@ -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;
}
};

View file

@ -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;

View file

@ -271,7 +271,8 @@ struct Encoder : public Common
}
Encoder(DSP::WritePCM<value> *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;
}