mirror of
https://github.com/aicodix/modem.git
synced 2026-04-27 14:30:34 +00:00
unroll innermost two levels
This commit is contained in:
parent
49c20124a8
commit
f6977efb91
1 changed files with 24 additions and 14 deletions
38
encode.cc
38
encode.cc
|
|
@ -98,24 +98,34 @@ struct Encoder : public Common
|
|||
else
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
temp[symbol_len*level+i] = rot * part[symbol_len*level+i] + temp[symbol_len*(level+1)+i];
|
||||
if (level) {
|
||||
if (level > 2) {
|
||||
if (partial_transmit_sequence(level - 1))
|
||||
return true;
|
||||
} else {
|
||||
value peak = 0, mean = 0;
|
||||
for (int i = 0; i < symbol_len; ++i) {
|
||||
value power(norm(temp[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;
|
||||
for (int i = 0; i < phase_max; ++i) {
|
||||
cmplx rot = i&2 ? cmplx(0, nrz(i&1)) : cmplx(nrz(i&1));
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
tdom[i] = temp[i];
|
||||
if (test_papr < 5)
|
||||
return true;
|
||||
temp[symbol_len+i] = rot * part[symbol_len+i] + temp[symbol_len*2+i];
|
||||
for (int i = 0; i < phase_max; ++i) {
|
||||
cmplx rot = i&2 ? cmplx(0, nrz(i&1)) : cmplx(nrz(i&1));
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
temp[i] = rot * part[i] + temp[symbol_len+i];
|
||||
value peak = 0, mean = 0;
|
||||
for (int i = 0; i < symbol_len; ++i) {
|
||||
value power(norm(temp[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;
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
tdom[i] = temp[i];
|
||||
if (test_papr < 5)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue