mirror of
https://github.com/aicodix/modem.git
synced 2026-04-27 14:30:34 +00:00
simplified SLM loop
This commit is contained in:
parent
f816ebbc43
commit
7e73a251a7
1 changed files with 35 additions and 33 deletions
36
encode.cc
36
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));
|
||||
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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue