mirror of
https://github.com/aicodix/modem.git
synced 2026-04-27 14:30:34 +00:00
do pts on even and odd subcarrier sets
This commit is contained in:
parent
2c05efe8cd
commit
64f01501cc
2 changed files with 50 additions and 26 deletions
29
decode.cc
29
decode.cc
|
|
@ -296,18 +296,31 @@ struct Decoder : Common
|
|||
tone[i] *= nrz(seq1());
|
||||
for (int i = 0; i < tone_count; ++i)
|
||||
demod[i] = demod_or_erase(tone[i], chan[i]);
|
||||
value pilot_sum = 0;
|
||||
for (int i = 0; i < pilot_tones; ++i)
|
||||
pilot_sum += demod[i*block_length+pilot_off].real();
|
||||
int pilot_phase = DSP::signum(pilot_sum);
|
||||
if (std::abs(pilot_sum) < pilot_tones / 4) {
|
||||
value ptsa_sum = 0;
|
||||
for (int i = 0; i < pilot_tones; i += 2)
|
||||
ptsa_sum += demod[i*block_length+pilot_off].real();
|
||||
int ptsa_phase = DSP::signum(ptsa_sum);
|
||||
if (std::abs(ptsa_sum) < pilot_tones / 4) {
|
||||
std::cerr << "pilot phase damaged" << std::endl;
|
||||
oper_mode = -1;
|
||||
break;
|
||||
}
|
||||
for (int i = 0; i < tone_count; ++i) {
|
||||
tone[i] *= pilot_phase;
|
||||
demod[i] *= pilot_phase;
|
||||
for (int i = 0; i < tone_count; i += 2) {
|
||||
tone[i] *= ptsa_phase;
|
||||
demod[i] *= ptsa_phase;
|
||||
}
|
||||
value ptsb_sum = 0;
|
||||
for (int i = 1; i < pilot_tones; i += 2)
|
||||
ptsb_sum += demod[i*block_length+pilot_off].real();
|
||||
int ptsb_phase = DSP::signum(ptsb_sum);
|
||||
if (std::abs(ptsb_sum) < pilot_tones / 4) {
|
||||
std::cerr << "pilot phase damaged" << std::endl;
|
||||
oper_mode = -1;
|
||||
break;
|
||||
}
|
||||
for (int i = 1; i < tone_count; i += 2) {
|
||||
tone[i] *= ptsb_phase;
|
||||
demod[i] *= ptsb_phase;
|
||||
}
|
||||
for (int i = 0; i < pilot_tones; ++i) {
|
||||
index[i] = tone_off + block_length * i + pilot_off;
|
||||
|
|
|
|||
47
encode.cc
47
encode.cc
|
|
@ -39,6 +39,8 @@ struct Encoder : public Common
|
|||
cmplx fdom[symbol_len];
|
||||
cmplx tdom[symbol_len];
|
||||
cmplx temp[symbol_len];
|
||||
cmplx ptsa[symbol_len];
|
||||
cmplx ptsb[symbol_len];
|
||||
cmplx best[symbol_len];
|
||||
cmplx kern[symbol_len];
|
||||
cmplx guard[guard_len];
|
||||
|
|
@ -90,29 +92,38 @@ struct Encoder : public Common
|
|||
} else {
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
fdom[i] = 0;
|
||||
for (int i = 0; i < tone_count; ++i)
|
||||
for (int i = 0; i < tone_count; i += 2)
|
||||
fdom[bin(i+tone_off)] = tone[i];
|
||||
bwd(temp, fdom);
|
||||
bwd(ptsa, fdom);
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
temp[i] *= scale;
|
||||
ptsa[i] *= scale;
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
fdom[i] = 0;
|
||||
for (int i = 1; i < tone_count; i += 2)
|
||||
fdom[bin(i+tone_off)] = tone[i];
|
||||
bwd(ptsb, fdom);
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
ptsb[i] *= scale;
|
||||
value best_papr = 1000;
|
||||
for (value pilot_phase = -1; pilot_phase < 2; pilot_phase += 2) {
|
||||
for (value ptsa_phase = -1; ptsa_phase < 2; ptsa_phase += 2) {
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
tdom[i] = pilot_phase * temp[i];
|
||||
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;
|
||||
temp[i] = ptsa_phase * ptsa[i];
|
||||
for (value ptsb_phase = -1; ptsb_phase < 2; ptsb_phase += 2) {
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
best[i] = tdom[i];
|
||||
if (cand_papr < 5)
|
||||
break;
|
||||
tdom[i] = ptsb_phase * ptsb[i] + temp[i];
|
||||
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];
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue