diff --git a/common.hh b/common.hh index 0f90071..549bec8 100644 --- a/common.hh +++ b/common.hh @@ -29,6 +29,9 @@ struct Common static const int block_skew = 3; static const int first_meta = 4; static const int first_seed = 9; + static constexpr int slm_poly[16] = { + 0x11d, 0x12b, 0x12d, 0x14d, 0x15f, 0x163, 0x165, 0x169, + 0x171, 0x187, 0x18d, 0x1a9, 0x1c3, 0x1cf, 0x1e7, 0x1f5 }; CODE::CRC crc0; CODE::HadamardEncoder<6> hadamard_encoder; int8_t meta[32]; diff --git a/decode.cc b/decode.cc index 01ce723..306c9b8 100644 --- a/decode.cc +++ b/decode.cc @@ -278,6 +278,10 @@ struct Decoder : Common for (int i = 0; i < meta_tones; ++i) meta[i] = clamp(std::nearbyint(127 * demod[i*block_length+meta_off].real())); int meta_data = hadamard_decoder(meta); + if (meta_data < 0) { + std::cerr << "meta data damaged" << std::endl; + meta_data = 0; + } hadamard_encoder(meta, meta_data); for (int i = 0; i < meta_tones; ++i) { tone[block_length*i+meta_off] *= meta[i]; @@ -290,6 +294,10 @@ struct Decoder : Common for (int i = 0; i < seed_tones; ++i) seed[i] = clamp(std::nearbyint(127 * demod[i*block_length+seed_off].real())); int seed_data = hadamard_decoder(seed); + if (seed_data < 0) { + std::cerr << "seed data damaged" << std::endl; + seed_data = 0; + } hadamard_encoder(seed, seed_data); for (int i = 0; i < seed_tones; ++i) { tone[block_length*i+seed_off] *= seed[i]; @@ -315,10 +323,15 @@ struct Decoder : Common for (int i = seed_off; i < tone_count; i += block_length) chan[i] = DSP::lerp(chan[i], tone[i], value(0.5)); } - CODE::MLS seq2(mls2_poly, seed_data); + int poly_index = j ? meta_data : 0; + if (poly_index < 0 || poly_index > 15) { + std::cerr << "poly index damaged" << std::endl; + meta_data = 0; + } + CODE::MLS seq(slm_poly[poly_index], seed_data+1); for (int i = 0; i < tone_count; ++i) if (i % block_length != meta_off && i % block_length != seed_off) - demod[i] *= nrz(seq2()); + demod[i] *= nrz(seq()); value sp = 0, np = 0; for (int i = 0, l = k; i < tone_count; ++i) { cmplx hard(1, 0); diff --git a/encode.cc b/encode.cc index 442a6f9..aa7510c 100644 --- a/encode.cc +++ b/encode.cc @@ -79,23 +79,25 @@ struct Encoder : public Common value scale = value(0.5) / std::sqrt(value(tone_count)); for (int i = 0; differential && symbol_number > 0 && i < tone_count; ++i) tone[i] *= prev[i]; - if (symbol_number >= 0) { - hadamard_encoder(meta, symbol_number ? symbol_number : oper_mode); - for (int i = 0; i < meta_tones; ++i) - tone[block_length*i+meta_off] *= meta[i]; - } value best_papr = 1000; - for (int trial = 0; trial < 64; ++trial) { + int trials = symbol_number ? 16 * 64 : 64; + for (int trial = 0; trial < trials; ++trial) { for (int i = 0; i < tone_count; ++i) temp[i] = tone[i]; if (symbol_number >= 0) { - hadamard_encoder(seed, trial); - CODE::MLS seq2(mls2_poly, trial); - for (int i = 0, s = 0; i < tone_count; ++i) - if (i % block_length == seed_off) + int poly_index = trial >> 6; + int meta_data = symbol_number ? poly_index : oper_mode; + hadamard_encoder(meta, meta_data); + int seed_data = trial & 63; + hadamard_encoder(seed, seed_data); + CODE::MLS seq(slm_poly[poly_index], seed_data + 1); + for (int i = 0, m = 0, s = 0; i < tone_count; ++i) + if (i % block_length == meta_off) + temp[i] *= meta[m++]; + else if (i % block_length == seed_off) temp[i] *= seed[s++]; - else if (i % block_length != meta_off) - temp[i] *= nrz(seq2()); + else + temp[i] *= nrz(seq()); } for (int i = 0; i < symbol_len; ++i) fdom[i] = 0;