diff --git a/decode.cc b/decode.cc index fd31b76..37b98a6 100644 --- a/decode.cc +++ b/decode.cc @@ -80,10 +80,10 @@ struct Decoder : Common } 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) - str[i] = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[val%37]; + for (int i = len-1; i >= 0; --i, val /= 40) + str[i] = " /0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[val%40]; } const cmplx *mls0_seq() { @@ -207,11 +207,11 @@ struct Decoder : Common int64_t meta_data() { 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; for (int k = 0; k < mesg_type::SIZE; ++k) { crc0.reset(); - for (int i = 0; i < 71; ++i) + for (int i = 0; i < 72; ++i) crc0(mesg[i].v[k] < 0); if (crc0() == 0) { best = k; @@ -221,7 +221,7 @@ struct Decoder : Common if (best < 0) return -1; 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; return md; } @@ -375,12 +375,12 @@ struct Decoder : Common break; } int64_t call = meta_info >> 8; - if (call == 0 || call >= 129961739795077L) { + if (call == 0 || call >= 262144000000000L) { std::cerr << "call sign unsupported." << std::endl; break; } char call_sign[10]; - base37_decoder(call_sign, call, 9); + base40_decoder(call_sign, call, 9); call_sign[9] = 0; std::cerr << "call sign: " << call_sign << std::endl; int mode = meta_info & 255; diff --git a/encode.cc b/encode.cc index f16f0dc..91823c6 100644 --- a/encode.cc +++ b/encode.cc @@ -163,13 +163,13 @@ struct Encoder : public Common } 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); crc0.reset(); - crc0(md << 9); + crc0(md << 8); for (int i = 0; i < 16; ++i) - mesg[i+55] = nrz((crc0() >> i) & 1); - polar_encoder(code, mesg, frozen_256_71, 8); + mesg[i+56] = nrz((crc0() >> i) & 1); + polar_encoder(code, mesg, frozen_256_72, 8); shuffle(meta, code, 8); } 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; for (char c = *str++; c; c = *str++) { - acc *= 37; - if (c >= '0' && c <= '9') - acc += c - '0' + 1; + acc *= 40; + if (c == '/') + acc += 3; + else if (c >= '0' && c <= '9') + acc += c - '0' + 4; else if (c >= 'a' && c <= 'z') - acc += c - 'a' + 11; + acc += c - 'a' + 14; else if (c >= 'A' && c <= 'Z') - acc += c - 'A' + 11; + acc += c - 'A' + 14; else if (c != ' ') return -1; } @@ -366,8 +368,8 @@ int main(int argc, char **argv) std::cerr << "Frequency offset must be divisible by 300." << std::endl; return 1; } - int64_t call_sign = base37_encoder(argv[6]); - if (call_sign <= 0 || call_sign >= 129961739795077L) { + int64_t call_sign = base40_encoder(argv[6]); + if (call_sign <= 0 || call_sign >= 262144000000000L) { std::cerr << "Unsupported call sign." << std::endl; return 1; } diff --git a/freezer.cc b/freezer.cc index b937ed7..68bac64 100644 --- a/freezer.cc +++ b/freezer.cc @@ -28,7 +28,7 @@ void code(int N, int K, double P) int main() { // 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 code<11>(2048, 1024+32, 0.33); code<12>(4096, 2048+32, 0.34); diff --git a/polar_tables.hh b/polar_tables.hh index c1a8a02..99f5a02 100644 --- a/polar_tables.hh +++ b/polar_tables.hh @@ -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_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, };