simplified SLM loop

This commit is contained in:
Ahmet Inan 2025-08-08 06:48:46 +02:00
commit 7e73a251a7

View file

@ -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));
if (symbol_number < 0) {
for (int i = 0; i < symbol_len; ++i)
fdom[i] = 0;
for (int i = 0; i < tone_count; ++i)
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];
if (symbol_number >= 0) {
hadamard_encoder(seed, seed_value);
for (int i = 0; i < seed_tones; ++i)
temp[i*block_length+seed_off] *= seed[i];
@ -93,36 +101,30 @@ 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);
bwd(test, fdom);
for (int i = 0; i < symbol_len; ++i)
tdom[i] *= scale;
if (symbol_number < 0)
break;
test[i] *= scale;
value peak = 0, mean = 0;
for (int i = 0; i < symbol_len; ++i) {
value power(norm(tdom[i]));
value power(norm(test[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;
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)
best[i] = tdom[i];
if (cand_papr < 5)
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) {