mirror of
https://github.com/aicodix/modem.git
synced 2026-04-27 14:30:34 +00:00
use base40 and one more bit to get three more characters
This commit is contained in:
parent
7e73a251a7
commit
811a3fbb42
4 changed files with 24 additions and 22 deletions
16
decode.cc
16
decode.cc
|
|
@ -80,10 +80,10 @@ struct Decoder : Common
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static void base37_decoder(char *str, int64_t val, int len)
|
static void base40_decoder(char *str, int64_t val, int len)
|
||||||
{
|
{
|
||||||
for (int i = len-1; i >= 0; --i, val /= 37)
|
for (int i = len-1; i >= 0; --i, val /= 40)
|
||||||
str[i] = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[val%37];
|
str[i] = " /0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[val%40];
|
||||||
}
|
}
|
||||||
const cmplx *mls0_seq()
|
const cmplx *mls0_seq()
|
||||||
{
|
{
|
||||||
|
|
@ -207,11 +207,11 @@ struct Decoder : Common
|
||||||
int64_t meta_data()
|
int64_t meta_data()
|
||||||
{
|
{
|
||||||
shuffle(code, perm, 8);
|
shuffle(code, perm, 8);
|
||||||
polar_decoder(nullptr, mesg, code, frozen_256_71, 8);
|
polar_decoder(nullptr, mesg, code, frozen_256_72, 8);
|
||||||
int best = -1;
|
int best = -1;
|
||||||
for (int k = 0; k < mesg_type::SIZE; ++k) {
|
for (int k = 0; k < mesg_type::SIZE; ++k) {
|
||||||
crc0.reset();
|
crc0.reset();
|
||||||
for (int i = 0; i < 71; ++i)
|
for (int i = 0; i < 72; ++i)
|
||||||
crc0(mesg[i].v[k] < 0);
|
crc0(mesg[i].v[k] < 0);
|
||||||
if (crc0() == 0) {
|
if (crc0() == 0) {
|
||||||
best = k;
|
best = k;
|
||||||
|
|
@ -221,7 +221,7 @@ struct Decoder : Common
|
||||||
if (best < 0)
|
if (best < 0)
|
||||||
return -1;
|
return -1;
|
||||||
uint64_t md = 0;
|
uint64_t md = 0;
|
||||||
for (int i = 0; i < 55; ++i)
|
for (int i = 0; i < 56; ++i)
|
||||||
md |= uint64_t(mesg[i].v[best] < 0) << i;
|
md |= uint64_t(mesg[i].v[best] < 0) << i;
|
||||||
return md;
|
return md;
|
||||||
}
|
}
|
||||||
|
|
@ -375,12 +375,12 @@ struct Decoder : Common
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
int64_t call = meta_info >> 8;
|
int64_t call = meta_info >> 8;
|
||||||
if (call == 0 || call >= 129961739795077L) {
|
if (call == 0 || call >= 262144000000000L) {
|
||||||
std::cerr << "call sign unsupported." << std::endl;
|
std::cerr << "call sign unsupported." << std::endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
char call_sign[10];
|
char call_sign[10];
|
||||||
base37_decoder(call_sign, call, 9);
|
base40_decoder(call_sign, call, 9);
|
||||||
call_sign[9] = 0;
|
call_sign[9] = 0;
|
||||||
std::cerr << "call sign: " << call_sign << std::endl;
|
std::cerr << "call sign: " << call_sign << std::endl;
|
||||||
int mode = meta_info & 255;
|
int mode = meta_info & 255;
|
||||||
|
|
|
||||||
26
encode.cc
26
encode.cc
|
|
@ -163,13 +163,13 @@ struct Encoder : public Common
|
||||||
}
|
}
|
||||||
void meta_data(uint64_t md)
|
void meta_data(uint64_t md)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 55; ++i)
|
for (int i = 0; i < 56; ++i)
|
||||||
mesg[i] = nrz((md >> i) & 1);
|
mesg[i] = nrz((md >> i) & 1);
|
||||||
crc0.reset();
|
crc0.reset();
|
||||||
crc0(md << 9);
|
crc0(md << 8);
|
||||||
for (int i = 0; i < 16; ++i)
|
for (int i = 0; i < 16; ++i)
|
||||||
mesg[i+55] = nrz((crc0() >> i) & 1);
|
mesg[i+56] = nrz((crc0() >> i) & 1);
|
||||||
polar_encoder(code, mesg, frozen_256_71, 8);
|
polar_encoder(code, mesg, frozen_256_72, 8);
|
||||||
shuffle(meta, code, 8);
|
shuffle(meta, code, 8);
|
||||||
}
|
}
|
||||||
cmplx map_bits(code_type *b, int bits)
|
cmplx map_bits(code_type *b, int bits)
|
||||||
|
|
@ -330,17 +330,19 @@ struct Encoder : public Common
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
int64_t base37_encoder(const char *str)
|
int64_t base40_encoder(const char *str)
|
||||||
{
|
{
|
||||||
int64_t acc = 0;
|
int64_t acc = 0;
|
||||||
for (char c = *str++; c; c = *str++) {
|
for (char c = *str++; c; c = *str++) {
|
||||||
acc *= 37;
|
acc *= 40;
|
||||||
if (c >= '0' && c <= '9')
|
if (c == '/')
|
||||||
acc += c - '0' + 1;
|
acc += 3;
|
||||||
|
else if (c >= '0' && c <= '9')
|
||||||
|
acc += c - '0' + 4;
|
||||||
else if (c >= 'a' && c <= 'z')
|
else if (c >= 'a' && c <= 'z')
|
||||||
acc += c - 'a' + 11;
|
acc += c - 'a' + 14;
|
||||||
else if (c >= 'A' && c <= 'Z')
|
else if (c >= 'A' && c <= 'Z')
|
||||||
acc += c - 'A' + 11;
|
acc += c - 'A' + 14;
|
||||||
else if (c != ' ')
|
else if (c != ' ')
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -366,8 +368,8 @@ int main(int argc, char **argv)
|
||||||
std::cerr << "Frequency offset must be divisible by 300." << std::endl;
|
std::cerr << "Frequency offset must be divisible by 300." << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
int64_t call_sign = base37_encoder(argv[6]);
|
int64_t call_sign = base40_encoder(argv[6]);
|
||||||
if (call_sign <= 0 || call_sign >= 129961739795077L) {
|
if (call_sign <= 0 || call_sign >= 262144000000000L) {
|
||||||
std::cerr << "Unsupported call sign." << std::endl;
|
std::cerr << "Unsupported call sign." << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ void code(int N, int K, double P)
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
// call sign and mode with 16 bit CRC
|
// call sign and mode with 16 bit CRC
|
||||||
code<8>(256, 47+8+16, 0.5);
|
code<8>(256, 48+8+16, 0.5);
|
||||||
// 1/2-rate payload with 32 bit CRC
|
// 1/2-rate payload with 32 bit CRC
|
||||||
code<11>(2048, 1024+32, 0.33);
|
code<11>(2048, 1024+32, 0.33);
|
||||||
code<12>(4096, 2048+32, 0.34);
|
code<12>(4096, 2048+32, 0.34);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
static const uint32_t frozen_256_71[8] = { 0xffffffff, 0xffffffff, 0x7fffffff, 0x17f7fff, 0x7fffffff, 0x1171fff, 0x17177f, 0x7, };
|
static const uint32_t frozen_256_72[8] = { 0xffffffff, 0xffffffff, 0x7fffffff, 0x17f7fff, 0x7fffffff, 0x1171fff, 0x17177f, 0x3, };
|
||||||
static const uint32_t frozen_2048_1056[64] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x3fffffff, 0xffffffff, 0x177fffff, 0x177f7fff, 0x1013f, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0x7fffffff, 0x11f7fff, 0x11717ff, 0x10117, 0x1fffffff, 0x117177f, 0x7177f, 0x1, 0x1037f, 0x1, 0x1, 0x0, 0xffffffff, 0x7fffffff, 0x7fffffff, 0x11717ff, 0x17ffffff, 0x17177f, 0x1037f, 0x1, 0x77f7fff, 0x1013f, 0x10117, 0x1, 0x10117, 0x1, 0x0, 0x0, 0x1173fff, 0x10117, 0x10117, 0x0, 0x17, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
|
static const uint32_t frozen_2048_1056[64] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x3fffffff, 0xffffffff, 0x177fffff, 0x177f7fff, 0x1013f, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0x7fffffff, 0x11f7fff, 0x11717ff, 0x10117, 0x1fffffff, 0x117177f, 0x7177f, 0x1, 0x1037f, 0x1, 0x1, 0x0, 0xffffffff, 0x7fffffff, 0x7fffffff, 0x11717ff, 0x17ffffff, 0x17177f, 0x1037f, 0x1, 0x77f7fff, 0x1013f, 0x10117, 0x1, 0x10117, 0x1, 0x0, 0x0, 0x1173fff, 0x10117, 0x10117, 0x0, 0x17, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
|
||||||
static const uint32_t frozen_4096_2080[128] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177fffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x37f7fff, 0x7fffffff, 0x1171fff, 0x117177f, 0x117, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x11f7fff, 0xffffffff, 0x7fffffff, 0x17ffffff, 0x117177f, 0x177f7fff, 0x1077f, 0x1013f, 0x1, 0xffffffff, 0x177fffff, 0x77f7fff, 0x1013f, 0x11f7fff, 0x10117, 0x10117, 0x1, 0x11717ff, 0x10117, 0x17, 0x0, 0x3, 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x17ffffff, 0x177f7fff, 0x1077f, 0xffffffff, 0x177f7fff, 0x11f7fff, 0x10117, 0x11717ff, 0x10117, 0x117, 0x0, 0x7fffffff, 0x1171fff, 0x117177f, 0x17, 0x7177f, 0x1, 0x1, 0x0, 0x1017f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x177fffff, 0x17177f, 0x1037f, 0x1, 0x1011f, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
|
static const uint32_t frozen_4096_2080[128] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177fffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x37f7fff, 0x7fffffff, 0x1171fff, 0x117177f, 0x117, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x11f7fff, 0xffffffff, 0x7fffffff, 0x17ffffff, 0x117177f, 0x177f7fff, 0x1077f, 0x1013f, 0x1, 0xffffffff, 0x177fffff, 0x77f7fff, 0x1013f, 0x11f7fff, 0x10117, 0x10117, 0x1, 0x11717ff, 0x10117, 0x17, 0x0, 0x3, 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x17ffffff, 0x177f7fff, 0x1077f, 0xffffffff, 0x177f7fff, 0x11f7fff, 0x10117, 0x11717ff, 0x10117, 0x117, 0x0, 0x7fffffff, 0x1171fff, 0x117177f, 0x17, 0x7177f, 0x1, 0x1, 0x0, 0x1017f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x177fffff, 0x17177f, 0x1037f, 0x1, 0x1011f, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
|
||||||
static const uint32_t frozen_8192_4128[256] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x17ffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x7fffffff, 0x11717ff, 0xffffffff, 0x1fffffff, 0x177fffff, 0x17177f, 0x177f7fff, 0x1013f, 0x10117, 0x1, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x7fffffff, 0x17ffffff, 0x117177f, 0xffffffff, 0xffffffff, 0xffffffff, 0x1fffffff, 0xffffffff, 0x177f7fff, 0x77f7fff, 0x1011f, 0x7fffffff, 0x13f7fff, 0x11717ff, 0x10117, 0x117177f, 0x117, 0x7, 0x0, 0xffffffff, 0xffffffff, 0x7fffffff, 0x37f7fff, 0x7fffffff, 0x1171fff, 0x117177f, 0x10117, 0x17ffffff, 0x117177f, 0x3177f, 0x1, 0x1013f, 0x1, 0x1, 0x0, 0x177f7fff, 0x1017f, 0x1011f, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x17ffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0x7fffffff, 0x11f7fff, 0x11717ff, 0x10117, 0xffffffff, 0x7fffffff, 0x7fffffff, 0x1171fff, 0x17ffffff, 0x117177f, 0x7177f, 0x1, 0x177f7fff, 0x1077f, 0x1011f, 0x1, 0x10117, 0x1, 0x1, 0x0, 0xffffffff, 0x17ffffff, 0x177f7fff, 0x7177f, 0x37f7fff, 0x1011f, 0x10117, 0x1, 0x1171fff, 0x10117, 0x10117, 0x1, 0x10117, 0x0, 0x0, 0x0, 0x117177f, 0x10117, 0x17, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7fffffff, 0x37f7fff, 0x1173fff, 0x10117, 0x11717ff, 0x10117, 0x117, 0x0, 0x117177f, 0x7, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1077f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1011f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
|
static const uint32_t frozen_8192_4128[256] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x17ffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x7fffffff, 0x11717ff, 0xffffffff, 0x1fffffff, 0x177fffff, 0x17177f, 0x177f7fff, 0x1013f, 0x10117, 0x1, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x7fffffff, 0x17ffffff, 0x117177f, 0xffffffff, 0xffffffff, 0xffffffff, 0x1fffffff, 0xffffffff, 0x177f7fff, 0x77f7fff, 0x1011f, 0x7fffffff, 0x13f7fff, 0x11717ff, 0x10117, 0x117177f, 0x117, 0x7, 0x0, 0xffffffff, 0xffffffff, 0x7fffffff, 0x37f7fff, 0x7fffffff, 0x1171fff, 0x117177f, 0x10117, 0x17ffffff, 0x117177f, 0x3177f, 0x1, 0x1013f, 0x1, 0x1, 0x0, 0x177f7fff, 0x1017f, 0x1011f, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x17ffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0x7fffffff, 0x11f7fff, 0x11717ff, 0x10117, 0xffffffff, 0x7fffffff, 0x7fffffff, 0x1171fff, 0x17ffffff, 0x117177f, 0x7177f, 0x1, 0x177f7fff, 0x1077f, 0x1011f, 0x1, 0x10117, 0x1, 0x1, 0x0, 0xffffffff, 0x17ffffff, 0x177f7fff, 0x7177f, 0x37f7fff, 0x1011f, 0x10117, 0x1, 0x1171fff, 0x10117, 0x10117, 0x1, 0x10117, 0x0, 0x0, 0x0, 0x117177f, 0x10117, 0x17, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7fffffff, 0x37f7fff, 0x1173fff, 0x10117, 0x11717ff, 0x10117, 0x117, 0x0, 0x117177f, 0x7, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1077f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1011f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue