diff --git a/decode.cc b/decode.cc index 82f8f91..3a07862 100644 --- a/decode.cc +++ b/decode.cc @@ -323,15 +323,13 @@ 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 >> 2 : 0; - if (poly_index < 0 || poly_index > 15) { - std::cerr << "poly index damaged" << std::endl; - meta_data = 0; - } - 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::XorShiftMask combination; + int trial = j ? (meta_data << 6) | seed_data : seed_data; + int comb = 0; + for (int i = 0; i <= trial; ++i) + comb = combination(); + int poly_index = comb & 15; + int seed_value = comb >> 4; 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) diff --git a/encode.cc b/encode.cc index 3e53a40..9149f99 100644 --- a/encode.cc +++ b/encode.cc @@ -80,19 +80,19 @@ 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 * 256 : 64; + int trials = symbol_number ? 256 : 64; + CODE::XorShiftMask combination; for (int trial = 0; trial < trials; ++trial) { for (int i = 0; i < tone_count; ++i) temp[i] = tone[i]; if (symbol_number >= 0) { - 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; + int comb = combination(); + int meta_data = symbol_number ? trial >> 6 : oper_mode; hadamard_encoder(meta, meta_data); int seed_data = trial & 63; hadamard_encoder(seed, seed_data); + int poly_index = comb & 15; + int seed_value = comb >> 4; 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)