From 390a11e5dc0d7a8d90385404772aaacb5a927503 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Thu, 4 Jan 2024 11:48:08 +0100 Subject: [PATCH] revised modes to better amortize the preamble cost .. and to have a larger minimum size payload of 256 bytes --- README.md | 24 +++++++++- decode.cc | 94 ++++++++++++++++++++++---------------- encode.cc | 118 +++++++++++++++++++++++++++++------------------- freezer.cc | 6 +-- polar_tables.hh | 6 +-- 5 files changed, 152 insertions(+), 96 deletions(-) diff --git a/README.md b/README.md index adb4046..6c96a57 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ dd if=/dev/urandom of=uncoded.dat bs=1 count=256 Encode file ```uncoded.dat``` to ```encoded.wav``` [WAV](https://en.wikipedia.org/wiki/WAV) audio file with 8000 Hz sample rate, 16 bits and only 1 (real) channel: ``` -./encode encoded.wav 8000 16 1 uncoded.dat 25 +./encode encoded.wav 8000 16 1 uncoded.dat 23 ``` Start recording to ```recorded.wav``` audio file and stop after 5 seconds: @@ -39,6 +39,26 @@ Compare original ```uncoded.dat``` with ```decoded.dat```: diff -s uncoded.dat decoded.dat ``` +### Supported Modes + +Ping: +* Mode 0: DBPSK, 2/7-rate code, 1600 Hz bandwidth, 0.36 seconds and no payload + +Rattlegram: +* Mode 14: DQPSK, 2/3-rate code, 1600 Hz bandwidth, 1.08 seconds and 170 bytes +* Mode 15: DQPSK, 1/2-rate code, 1600 Hz bandwidth, 1.08 seconds and 128 bytes +* Mode 16: DQPSK, 1/3-rate code, 1600 Hz bandwidth, 1.08 seconds and 85 bytes + +Next: +* Mode 23: DQPSK, 1/2-rate code, 1600 Hz bandwidth, 1.80 seconds and 256 bytes +* Mode 24: DQPSK, 1/2-rate code, 1600 Hz bandwidth, 3.24 seconds and 512 bytes +* Mode 25: DQPSK, 1/2-rate code, 1600 Hz bandwidth, 6.12 seconds and 1024 bytes +* Mode 26: QAM16, 1/2-rate code, 1700 Hz bandwidth, 1.08 seconds and 256 bytes +* Mode 27: QAM16, 1/2-rate code, 1700 Hz bandwidth, 1.80 seconds and 512 bytes +* Mode 28: QAM16, 1/2-rate code, 1700 Hz bandwidth, 3.24 seconds and 1024 bytes +* Mode 29: QAM64, 1/2-rate code, 1900 Hz bandwidth, 1.26 seconds and 512 bytes +* Mode 30: QAM64, 1/2-rate code, 1900 Hz bandwidth, 2.16 seconds and 1024 bytes + ### Simulating Prerequisite: [disorders](https://github.com/aicodix/disorders) @@ -46,7 +66,7 @@ Prerequisite: [disorders](https://github.com/aicodix/disorders) Encode ```uncoded.dat``` to [analytic](https://en.wikipedia.org/wiki/Analytic_signal) audio signal, add [multipath](https://en.wikipedia.org/wiki/Multipath_propagation), [CFO, SFO](https://en.wikipedia.org/wiki/Carrier_frequency_offset), [AWGN](https://en.wikipedia.org/wiki/Additive_white_Gaussian_noise), decode and compare: ``` -./encode - 8000 16 2 uncoded.dat 25 | ../disorders/multipath - - ../disorders/multipath.txt 10 | ../disorders/cfo - - 234.567 | ../disorders/sfo - - 147 | ../disorders/awgn - - -30 | ./decode - - | diff -q -s uncoded.dat - +./encode - 8000 16 2 uncoded.dat 23 | ../disorders/multipath - - ../disorders/multipath.txt 10 | ../disorders/cfo - - 234.567 | ../disorders/sfo - - 147 | ../disorders/awgn - - -30 | ./decode - - | diff -q -s uncoded.dat - ``` ### Reading diff --git a/decode.cc b/decode.cc index 572b91d..d8cc545 100644 --- a/decode.cc +++ b/decode.cc @@ -177,10 +177,10 @@ struct Decoder static const int filter_len = (((21 * rate) / 8000) & ~3) | 1; static const int guard_len = symbol_len / 8; static const int extended_len = symbol_len + guard_len; - static const int code_max = 13; + static const int code_max = 14; static const int bits_max = 1 << code_max; static const int cols_max = 273 + 16; - static const int rows_max = 5; + static const int rows_max = 32; static const int cons_max = cols_max * rows_max; static const int mls0_len = 127; static const int mls0_off = - mls0_len + 1; @@ -202,9 +202,9 @@ struct Decoder CODE::OrderedStatisticsDecoder<255, 71, 4> osddec; CODE::PolarEncoder polarenc; CODE::PolarListDecoder polardec; - CODE::ReverseFisherYatesShuffle<2048> shuffle_2048; CODE::ReverseFisherYatesShuffle<4096> shuffle_4096; CODE::ReverseFisherYatesShuffle<8192> shuffle_8192; + CODE::ReverseFisherYatesShuffle<16384> shuffle_16384; int8_t genmat[255*71]; mesg_type mesg[bits_max], mess[bits_max]; code_type code[bits_max]; @@ -289,18 +289,16 @@ struct Decoder } void shuffle(code_type *c) { - if (oper_mode < 25) - return; switch (code_order) { - case 11: - shuffle_2048(c); - break; case 12: shuffle_4096(c); break; case 13: shuffle_8192(c); break; + case 14: + shuffle_16384(c); + break; } } const cmplx *next_sample() @@ -370,7 +368,7 @@ struct Decoder continue; } oper_mode = md & 255; - if (oper_mode && (oper_mode < 14 || (oper_mode > 16 && oper_mode < 23) || oper_mode > 28)) { + if (oper_mode && (oper_mode < 14 || (oper_mode > 16 && oper_mode < 23) || oper_mode > 30)) { std::cerr << "operation mode " << oper_mode << " unsupported." << std::endl; continue; } @@ -424,23 +422,32 @@ struct Decoder break; case 23: mod_bits = 2; - cons_rows = 4; + cons_rows = 8; comb_cols = 0; - code_order = 11; + code_order = 12; code_cols = 256; - data_bits = 1024; - frozen_bits = frozen_2048_1056; + data_bits = 2048; + frozen_bits = frozen_4096_2080; break; case 24: mod_bits = 2; - cons_rows = 4; + cons_rows = 16; comb_cols = 0; - code_order = 11; + code_order = 13; code_cols = 256; - data_bits = 1536; - frozen_bits = frozen_2048_1568; + data_bits = 4096; + frozen_bits = frozen_8192_4128; break; case 25: + mod_bits = 2; + cons_rows = 32; + comb_cols = 0; + code_order = 14; + code_cols = 256; + data_bits = 8192; + frozen_bits = frozen_16384_8224; + break; + case 26: mod_bits = 4; cons_rows = 4; comb_cols = 8; @@ -449,32 +456,41 @@ struct Decoder data_bits = 2048; frozen_bits = frozen_4096_2080; break; - case 26: - mod_bits = 4; - cons_rows = 4; - comb_cols = 8; - code_order = 12; - code_cols = 256; - data_bits = 3072; - frozen_bits = frozen_4096_3104; - break; case 27: - mod_bits = 6; - cons_rows = 5; - comb_cols = 16; + mod_bits = 4; + cons_rows = 8; + comb_cols = 8; code_order = 13; - code_cols = 273; - data_bits = 5440; - frozen_bits = frozen_8192_5472; + code_cols = 256; + data_bits = 4096; + frozen_bits = frozen_8192_4128; break; case 28: + mod_bits = 4; + cons_rows = 16; + comb_cols = 8; + code_order = 14; + code_cols = 256; + data_bits = 8192; + frozen_bits = frozen_16384_8224; + break; + case 29: mod_bits = 6; cons_rows = 5; comb_cols = 16; code_order = 13; code_cols = 273; - data_bits = 6144; - frozen_bits = frozen_8192_6176; + data_bits = 4096; + frozen_bits = frozen_8192_4128; + break; + case 30: + mod_bits = 6; + cons_rows = 10; + comb_cols = 16; + code_order = 14; + code_cols = 273; + data_bits = 8192; + frozen_bits = frozen_16384_8224; break; default: return; @@ -505,7 +521,7 @@ struct Decoder fwd(fdom, tdom); for (int i = 0; i < cons_cols; ++i) cons[cons_cols*j+i] = demod_or_erase(fdom[bin(i+code_off)], prev[i]); - if (oper_mode > 24) { + if (oper_mode > 25) { for (int i = 0; i < comb_cols; ++i) cons[cons_cols*j+comb_dist*i+comb_off] *= nrz(seq0()); for (int i = 0; i < comb_cols; ++i) { @@ -538,7 +554,7 @@ struct Decoder //std::cerr << "Theil-Sen yint = " << tse.yint() << std::endl; for (int i = 0; i < cons_cols; ++i) cons[cons_cols*j+i] *= DSP::polar(1, -tse(i+code_off)); - if (oper_mode > 24) { + if (oper_mode > 25) { for (int i = 0; i < cons_cols; ++i) if (i % comb_dist != comb_off) prev[i] *= DSP::polar(1, tse(i+code_off)); @@ -552,7 +568,7 @@ struct Decoder std::cerr << "Es/N0 (dB):"; value sp = 0, np = 0; for (int j = 0, k = 0; j < cons_rows; ++j) { - if (oper_mode > 24) { + if (oper_mode > 25) { for (int i = 0; i < comb_cols; ++i) { cmplx hard(1, 0); cmplx error = cons[cons_cols*j+comb_dist*i+comb_off] - hard; @@ -574,7 +590,7 @@ struct Decoder value snr = DSP::decibel(precision); std::cerr << " " << snr; for (int i = 0; i < cons_cols; ++i) { - if (oper_mode > 24 && i % comb_dist == comb_off) + if (oper_mode > 25 && i % comb_dist == comb_off) continue; mod_soft(code+k, cons[cons_cols*j+i], precision); k += mod_bits; @@ -649,7 +665,7 @@ int main(int argc, char **argv) if (argc > 3) skip_count = std::atoi(argv[3]); - const int data_max = 768; + const int data_max = 1024; uint8_t *output_data = new uint8_t[data_max]; int data_len = 0; diff --git a/encode.cc b/encode.cc index d8ec619..60e4aa1 100644 --- a/encode.cc +++ b/encode.cc @@ -31,7 +31,7 @@ struct Encoder typedef int8_t code_type; static const int symbol_len = (1280 * rate) / 8000; static const int guard_len = symbol_len / 8; - static const int bits_max = 8192; + static const int bits_max = 16384; static const int cols_max = 273 + 16; static const int mls0_len = 127; static const int mls0_poly = 0b10001001; @@ -45,9 +45,9 @@ struct Encoder CODE::CRC crc1; CODE::BoseChaudhuriHocquenghemEncoder<255, 71> bchenc; CODE::PolarSysEnc polarenc; - CODE::FisherYatesShuffle<2048> shuffle_2048; CODE::FisherYatesShuffle<4096> shuffle_4096; CODE::FisherYatesShuffle<8192> shuffle_8192; + CODE::FisherYatesShuffle<16384> shuffle_16384; code_type code[bits_max], mesg[bits_max]; cmplx fdom[symbol_len]; cmplx tdom[symbol_len]; @@ -116,8 +116,8 @@ struct Encoder bwd(tdom, fdom); for (int i = 0; i < symbol_len; ++i) tdom[i] /= std::sqrt(value(symbol_len*4)); - clipping_and_filtering(oper_mode > 24 && papr_reduction); - if (oper_mode > 24 && papr_reduction) + clipping_and_filtering(oper_mode > 25 && papr_reduction); + if (oper_mode > 25 && papr_reduction) tone_reservation(); for (int i = 0; i < symbol_len; ++i) tdom[i] = cmplx(std::min(value(1), tdom[i].real()), std::min(value(1), tdom[i].imag())); @@ -191,7 +191,7 @@ struct Encoder fdom[bin(i+mls1_off)] *= fdom[bin(i-1+mls1_off)]; for (int i = 0; i < mls1_len; ++i) fdom[bin(i+mls1_off)] *= nrz(seq1()); - if (oper_mode > 24) { + if (oper_mode > 25) { for (int i = code_off; i < code_off + cons_cols; ++i) { if (i == mls1_off-1) i += mls1_len + 1; @@ -226,18 +226,16 @@ struct Encoder } void shuffle(code_type *c) { - if (oper_mode < 25) - return; switch (code_order) { - case 11: - shuffle_2048(c); - break; case 12: shuffle_4096(c); break; case 13: shuffle_8192(c); break; + case 14: + shuffle_16384(c); + break; } } Encoder(DSP::WritePCM *pcm, const uint8_t *inp, int freq_off, uint64_t call_sign, int oper_mode) : @@ -293,25 +291,35 @@ struct Encoder break; case 23: mod_bits = 2; - cons_rows = 4; + cons_rows = 8; comb_cols = 0; - code_order = 11; + code_order = 12; code_cols = 256; - data_bits = 1024; + data_bits = 2048; reserved_tones = 0; - frozen_bits = frozen_2048_1056; + frozen_bits = frozen_4096_2080; break; case 24: mod_bits = 2; - cons_rows = 4; + cons_rows = 16; comb_cols = 0; - code_order = 11; + code_order = 13; code_cols = 256; - data_bits = 1536; + data_bits = 4096; reserved_tones = 0; - frozen_bits = frozen_2048_1568; + frozen_bits = frozen_8192_4128; break; case 25: + mod_bits = 2; + cons_rows = 32; + comb_cols = 0; + code_order = 14; + code_cols = 256; + data_bits = 8192; + reserved_tones = 0; + frozen_bits = frozen_16384_8224; + break; + case 26: mod_bits = 4; cons_rows = 4; comb_cols = 8; @@ -321,35 +329,45 @@ struct Encoder reserved_tones = 8; frozen_bits = frozen_4096_2080; break; - case 26: - mod_bits = 4; - cons_rows = 4; - comb_cols = 8; - code_order = 12; - code_cols = 256; - data_bits = 3072; - reserved_tones = 8; - frozen_bits = frozen_4096_3104; - break; case 27: - mod_bits = 6; - cons_rows = 5; - comb_cols = 16; + mod_bits = 4; + cons_rows = 8; + comb_cols = 8; code_order = 13; - code_cols = 273; - data_bits = 5440; - reserved_tones = 15; - frozen_bits = frozen_8192_5472; + code_cols = 256; + data_bits = 4096; + reserved_tones = 8; + frozen_bits = frozen_8192_4128; break; case 28: + mod_bits = 4; + cons_rows = 16; + comb_cols = 8; + code_order = 14; + code_cols = 256; + data_bits = 8192; + reserved_tones = 8; + frozen_bits = frozen_16384_8224; + break; + case 29: mod_bits = 6; cons_rows = 5; comb_cols = 16; code_order = 13; code_cols = 273; - data_bits = 6144; + data_bits = 4096; reserved_tones = 15; - frozen_bits = frozen_8192_6176; + frozen_bits = frozen_8192_4128; + break; + case 30: + mod_bits = 6; + cons_rows = 10; + comb_cols = 16; + code_order = 14; + code_cols = 273; + data_bits = 8192; + reserved_tones = 15; + frozen_bits = frozen_16384_8224; break; default: return; @@ -391,7 +409,7 @@ struct Encoder CODE::MLS seq0(mls0_poly); for (int j = 0, k = 0; j < cons_rows; ++j) { for (int i = 0; i < cons_cols; ++i) { - if (oper_mode < 25) { + if (oper_mode < 26) { prev[i] *= mod_map(code+k); fdom[bin(i+code_off)] = prev[i]; k += mod_bits; @@ -481,22 +499,28 @@ int main(int argc, char **argv) data_bits = 680; break; case 23: - data_bits = 1024; - break; - case 24: - data_bits = 1536; - break; - case 25: data_bits = 2048; break; + case 24: + data_bits = 4096; + break; + case 25: + data_bits = 8192; + break; case 26: - data_bits = 3072; + data_bits = 2048; break; case 27: - data_bits = 5440; + data_bits = 4096; break; case 28: - data_bits = 6144; + data_bits = 8192; + break; + case 29: + data_bits = 4096; + break; + case 30: + data_bits = 8192; break; default: std::cerr << "Unsupported operation mode." << std::endl; diff --git a/freezer.cc b/freezer.cc index a26eac3..0631c97 100644 --- a/freezer.cc +++ b/freezer.cc @@ -33,11 +33,9 @@ void code(int N, int K) int main() { - code<13>(8192, 6144+32); - code<13>(8192, 5440+32); - code<12>(4096, 3072+32); + code<14>(16384, 8192+32); + code<13>(8192, 4096+32); code<12>(4096, 2048+32); - code<11>(2048, 1536+32); code<11>(2048, 1360+32); code<11>(2048, 1024+32); code<11>(2048, 680+32); diff --git a/polar_tables.hh b/polar_tables.hh index 5180ca9..dedc3e7 100644 --- a/polar_tables.hh +++ b/polar_tables.hh @@ -1,8 +1,6 @@ -static const uint32_t frozen_8192_6176[256] = { 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, 0x117177f, 0x177f7fff, 0x1017f, 0x10117, 0x1, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x177fffff, 0x177f7fff, 0x1077f, 0x7fffffff, 0x177f7fff, 0x11f7fff, 0x10117, 0x11717ff, 0x10117, 0x10117, 0x0, 0x7fffffff, 0x11717ff, 0x117177f, 0x10117, 0x17177f, 0x3, 0x1, 0x0, 0x1077f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0x7fffffff, 0x177f7fff, 0x7fffffff, 0x1173fff, 0x11717ff, 0x10117, 0x17ffffff, 0x117177f, 0x17177f, 0x3, 0x1077f, 0x1, 0x1, 0x0, 0x177f7fff, 0x3077f, 0x1013f, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x13f7fff, 0x10117, 0x10117, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x117, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0x7fffffff, 0x17ffffff, 0x117177f, 0x177f7fff, 0x7177f, 0x1017f, 0x1, 0x37f7fff, 0x1011f, 0x10117, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x1171fff, 0x10117, 0x10117, 0x1, 0x10117, 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x117177f, 0x10117, 0x117, 0x0, 0x7, 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, 0x117177f, 0x7, 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, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; -static const uint32_t frozen_8192_5472[256] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177fffff, 0xffffffff, 0x177f7fff, 0x11f7fff, 0x10117, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x11f7fff, 0x1fffffff, 0x117177f, 0x117177f, 0x17, 0xffffffff, 0x7fffffff, 0x17ffffff, 0x117177f, 0x177f7fff, 0x1077f, 0x1011f, 0x1, 0x13f7fff, 0x10117, 0x10117, 0x1, 0x10117, 0x1, 0x1, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x7fffffff, 0x1fffffff, 0x117177f, 0xffffffff, 0x17ffffff, 0x177f7fff, 0x3177f, 0x37f7fff, 0x1011f, 0x10117, 0x1, 0x7fffffff, 0x77f7fff, 0x11f7fff, 0x10117, 0x11717ff, 0x10117, 0x10117, 0x0, 0x117177f, 0x17, 0x3, 0x0, 0x1, 0x0, 0x0, 0x0, 0x7fffffff, 0x11717ff, 0x117177f, 0x117, 0x17177f, 0x3, 0x1, 0x0, 0x1037f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1011f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0x177fffff, 0xffffffff, 0x177f7fff, 0x11f7fff, 0x10117, 0x7fffffff, 0x1171fff, 0x117177f, 0x10117, 0x117177f, 0x17, 0x3, 0x0, 0x17ffffff, 0x117177f, 0x7177f, 0x1, 0x1017f, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x177f7fff, 0x1037f, 0x1011f, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10117, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11f7fff, 0x10117, 0x10117, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x10117, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; -static const uint32_t frozen_4096_3104[128] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x17ffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0x7fffffff, 0x1173fff, 0x11717ff, 0x10117, 0xffffffff, 0x7fffffff, 0x7fffffff, 0x11717ff, 0x177fffff, 0x17177f, 0x1077f, 0x1, 0x177f7fff, 0x1017f, 0x10117, 0x1, 0x10117, 0x1, 0x1, 0x0, 0xffffffff, 0x17ffffff, 0x177f7fff, 0x1037f, 0x13f7fff, 0x10117, 0x10117, 0x1, 0x11717ff, 0x10117, 0x10117, 0x0, 0x17, 0x0, 0x0, 0x0, 0x117177f, 0x17, 0x3, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7fffffff, 0x13f7fff, 0x1171fff, 0x10117, 0x117177f, 0x117, 0x7, 0x0, 0x7177f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1017f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10117, 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_16384_8224[512] = { 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, 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, 0xffffffff, 0x177f7fff, 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, 0x7fffffff, 0x7fffffff, 0x11717ff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x177fffff, 0x177f7fff, 0x3177f, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0x7fffffff, 0x37f7fff, 0x1171fff, 0x10117, 0x7fffffff, 0x11717ff, 0x117177f, 0x10117, 0x117177f, 0x7, 0x1, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177fffff, 0xffffffff, 0x177f7fff, 0x13f7fff, 0x10117, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x11f7fff, 0x3fffffff, 0x117177f, 0x117177f, 0x117, 0xffffffff, 0x7fffffff, 0x17ffffff, 0x117177f, 0x177f7fff, 0x3177f, 0x1017f, 0x1, 0x17f7fff, 0x1011f, 0x10117, 0x1, 0x10117, 0x1, 0x1, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x7fffffff, 0x1fffffff, 0x117177f, 0xffffffff, 0x17ffffff, 0x177f7fff, 0x7177f, 0x77f7fff, 0x1011f, 0x10117, 0x1, 0x7fffffff, 0x177f7fff, 0x11f7fff, 0x10117, 0x11717ff, 0x10117, 0x10117, 0x1, 0x117177f, 0x10117, 0x17, 0x0, 0x3, 0x0, 0x0, 0x0, 0x7fffffff, 0x11717ff, 0x117177f, 0x10117, 0x117177f, 0x7, 0x1, 0x0, 0x3177f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1013f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x7fffffff, 0x1173fff, 0xffffffff, 0x7fffffff, 0x177fffff, 0x117177f, 0x177f7fff, 0x3177f, 0x1013f, 0x1, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x17ffffff, 0x177f7fff, 0x7177f, 0xffffffff, 0x177f7fff, 0x13f7fff, 0x10117, 0x1171fff, 0x10117, 0x10117, 0x1, 0x7fffffff, 0x1173fff, 0x117177f, 0x10117, 0x117177f, 0x117, 0x7, 0x0, 0x7177f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0x7fffffff, 0x11f7fff, 0x11717ff, 0x10117, 0x1fffffff, 0x117177f, 0x117177f, 0x117, 0x7177f, 0x1, 0x1, 0x0, 0x177f7fff, 0x17177f, 0x1037f, 0x1, 0x1011f, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x77f7fff, 0x1011f, 0x10117, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10117, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0x7fffffff, 0x1fffffff, 0x117177f, 0x177fffff, 0x117177f, 0x1077f, 0x1, 0x177f7fff, 0x1017f, 0x10117, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x1177fff, 0x10117, 0x10117, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x117177f, 0x10117, 0x10117, 0x1, 0x117, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x117177f, 0x117, 0x7, 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, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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, 0x1fffffff, 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, 0x1171fff, 0x10117, 0x117177f, 0x117, 0x7, 0x0, 0xffffffff, 0xffffffff, 0x7fffffff, 0x77f7fff, 0x7fffffff, 0x1171fff, 0x117177f, 0x10117, 0x17ffffff, 0x117177f, 0x3177f, 0x1, 0x1013f, 0x1, 0x1, 0x0, 0x177f7fff, 0x1017f, 0x10117, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x1fffffff, 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, 0x177fffff, 0x3177f, 0x37f7fff, 0x1011f, 0x10117, 0x1, 0x1171fff, 0x10117, 0x10117, 0x1, 0x117, 0x0, 0x0, 0x0, 0x117177f, 0x117, 0x17, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7fffffff, 0x37f7fff, 0x1173fff, 0x10117, 0x11717ff, 0x10117, 0x17, 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_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, 0x17ffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x77f7fff, 0x7fffffff, 0x1173fff, 0x11717ff, 0x117, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x11f7fff, 0xffffffff, 0x7fffffff, 0x1fffffff, 0x117177f, 0x177fffff, 0x1077f, 0x1013f, 0x1, 0xffffffff, 0x177fffff, 0x177f7fff, 0x1013f, 0x11f7fff, 0x10117, 0x10117, 0x1, 0x11717ff, 0x117, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x17ffffff, 0x177fffff, 0x1077f, 0xffffffff, 0x177f7fff, 0x11f7fff, 0x10117, 0x11717ff, 0x10117, 0x17, 0x0, 0x7fffffff, 0x1171fff, 0x117177f, 0x17, 0x3177f, 0x1, 0x1, 0x0, 0x1017f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x177fffff, 0x7177f, 0x1037f, 0x1, 0x1011f, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10117, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; -static const uint32_t frozen_2048_1568[64] = { 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x177fffff, 0x177f7fff, 0x1017f, 0x7fffffff, 0x37f7fff, 0x1173fff, 0x10117, 0x11717ff, 0x17, 0x3, 0x0, 0x7fffffff, 0x11717ff, 0x17177f, 0x3, 0x1077f, 0x1, 0x1, 0x0, 0x1011f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x177fffff, 0x3077f, 0x1013f, 0x1, 0x10117, 0x1, 0x1, 0x0, 0x10117, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x117, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static const uint32_t frozen_2048_1392[64] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x11f7fff, 0xffffffff, 0x7fffffff, 0x17ffffff, 0x117177f, 0x177f7fff, 0x1037f, 0x1011f, 0x1, 0xffffffff, 0x177fffff, 0x77f7fff, 0x1011f, 0x1173fff, 0x10117, 0x10117, 0x0, 0x117177f, 0x17, 0x3, 0x0, 0x1, 0x0, 0x0, 0x0, 0x7fffffff, 0x11f7fff, 0x11717ff, 0x117, 0x17177f, 0x3, 0x1, 0x0, 0x1037f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1011f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 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, 0x7fffffff, 0xffffffff, 0x177fffff, 0x177f7fff, 0x1017f, 0xffffffff, 0xffffffff, 0xffffffff, 0x177f7fff, 0x7fffffff, 0x13f7fff, 0x1171fff, 0x117, 0x3fffffff, 0x11717ff, 0x7177f, 0x1, 0x1017f, 0x1, 0x1, 0x0, 0xffffffff, 0x7fffffff, 0x7fffffff, 0x1171fff, 0x17ffffff, 0x7177f, 0x1037f, 0x1, 0x77f7fff, 0x1013f, 0x10117, 0x1, 0x10117, 0x0, 0x0, 0x0, 0x1173fff, 0x10117, 0x117, 0x0, 0x7, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static const uint32_t frozen_2048_712[64] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x177fffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0x11f7fff, 0xffffffff, 0x7fffffff, 0x1fffffff, 0x17177f, 0x177fffff, 0x1037f, 0x1011f, 0x1, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff, 0xffffffff, 0x1fffffff, 0x177fffff, 0x1077f, 0xffffffff, 0x177f7fff, 0x13f7fff, 0x10117, 0x1171fff, 0x117, 0x7, 0x0, 0x7fffffff, 0x1173fff, 0x11717ff, 0x7, 0x3077f, 0x1, 0x1, 0x0, 0x1013f, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, };