diff --git a/decode.cc b/decode.cc index 306c9b8..82f8f91 100644 --- a/decode.cc +++ b/decode.cc @@ -323,12 +323,16 @@ 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)); } - int poly_index = j ? meta_data : 0; + int poly_index = j ? meta_data >> 2 : 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); + int seed_value = j ? ((meta_data & 3) << 6) | seed_data : seed_data; + if (seed_value == 0) { + std::cerr << "reserved seed value detected" << std::endl; + } + CODE::MLS seq(slm_poly[poly_index], seed_value); for (int i = 0; i < tone_count; ++i) if (i % block_length != meta_off && i % block_length != seed_off) demod[i] *= nrz(seq()); diff --git a/encode.cc b/encode.cc index aa7510c..3e53a40 100644 --- a/encode.cc +++ b/encode.cc @@ -80,17 +80,20 @@ struct Encoder : public Common for (int i = 0; differential && symbol_number > 0 && i < tone_count; ++i) tone[i] *= prev[i]; value best_papr = 1000; - int trials = symbol_number ? 16 * 64 : 64; + int trials = symbol_number ? 16 * 256 : 64; for (int trial = 0; trial < trials; ++trial) { for (int i = 0; i < tone_count; ++i) temp[i] = tone[i]; if (symbol_number >= 0) { - int poly_index = trial >> 6; - int meta_data = symbol_number ? poly_index : oper_mode; + int seed_value = trial & 255; + if (seed_value == 0) + continue; + int poly_index = trial >> 8; + int meta_data = symbol_number ? (poly_index << 2 | ((trial >> 6) & 3)) : 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); + CODE::MLS seq(slm_poly[poly_index], seed_value); for (int i = 0, m = 0, s = 0; i < tone_count; ++i) if (i % block_length == meta_off) temp[i] *= meta[m++];