mirror of
https://github.com/aicodix/modem.git
synced 2026-04-27 14:30:34 +00:00
added mode table per Rory (VK4SUS)
This commit is contained in:
parent
3765da54ff
commit
636fcd4f97
3 changed files with 94 additions and 50 deletions
120
common.hh
120
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;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
21
decode.cc
21
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;
|
||||
|
|
|
|||
13
encode.cc
13
encode.cc
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue