diff --git a/encode.cc b/encode.cc index fc97f63..f16f0dc 100644 --- a/encode.cc +++ b/encode.cc @@ -38,7 +38,7 @@ struct Encoder : public Common code_type code[bits_max], perm[bits_max], mesg[bits_max], meta[data_tones]; cmplx fdom[symbol_len]; cmplx tdom[symbol_len]; - cmplx best[symbol_len]; + cmplx test[symbol_len]; cmplx kern[symbol_len]; cmplx guard[guard_len]; cmplx tone[tone_count]; @@ -79,11 +79,19 @@ struct Encoder : public Common void symbol(int symbol_number) { value scale = value(0.5) / std::sqrt(value(tone_count)); - value best_papr = 1000; - for (int seed_value = 0; seed_value < 128; ++seed_value) { + if (symbol_number < 0) { + for (int i = 0; i < symbol_len; ++i) + fdom[i] = 0; for (int i = 0; i < tone_count; ++i) - temp[i] = tone[i]; - if (symbol_number >= 0) { + fdom[bin(i+tone_off)] = tone[i]; + bwd(tdom, fdom); + for (int i = 0; i < symbol_len; ++i) + tdom[i] *= scale; + } else { + value best_papr = 1000; + for (int seed_value = 0; seed_value < 128; ++seed_value) { + for (int i = 0; i < tone_count; ++i) + temp[i] = tone[i]; hadamard_encoder(seed, seed_value); for (int i = 0; i < seed_tones; ++i) temp[i*block_length+seed_off] *= seed[i]; @@ -93,37 +101,31 @@ struct Encoder : public Common if (i % block_length != seed_off) temp[i] *= nrz(seq()); } - } - for (int i = 0; i < symbol_len; ++i) - fdom[i] = 0; - for (int i = 0; i < tone_count; ++i) - fdom[bin(i+tone_off)] = temp[i]; - bwd(tdom, fdom); - for (int i = 0; i < symbol_len; ++i) - tdom[i] *= scale; - if (symbol_number < 0) - break; - value peak = 0, mean = 0; - for (int i = 0; i < symbol_len; ++i) { - value power(norm(tdom[i])); - peak = std::max(peak, power); - mean += power; - } - mean /= symbol_len; - value cand_papr(peak / mean); - if (cand_papr < best_papr) { - best_papr = cand_papr; for (int i = 0; i < symbol_len; ++i) - best[i] = tdom[i]; - if (cand_papr < 5) - break; + fdom[i] = 0; + for (int i = 0; i < tone_count; ++i) + fdom[bin(i+tone_off)] = temp[i]; + bwd(test, fdom); + for (int i = 0; i < symbol_len; ++i) + test[i] *= scale; + value peak = 0, mean = 0; + for (int i = 0; i < symbol_len; ++i) { + value power(norm(test[i])); + peak = std::max(peak, power); + mean += power; + } + mean /= symbol_len; + value test_papr(peak / mean); + if (test_papr < best_papr) { + best_papr = test_papr; + papr[symbol_number] = test_papr; + for (int i = 0; i < symbol_len; ++i) + tdom[i] = test[i]; + if (test_papr < 5) + break; + } } } - if (symbol_number >= 0) { - for (int i = 0; i < symbol_len; ++i) - tdom[i] = best[i]; - papr[symbol_number] = best_papr; - } clipping_and_filtering(scale); if (symbol_number != -1) { for (int i = 0; i < guard_len; ++i)