mirror of
https://github.com/aicodix/modem.git
synced 2026-04-27 14:30:34 +00:00
added transform() helper
This commit is contained in:
parent
f9c29575b5
commit
15268aaf88
1 changed files with 19 additions and 63 deletions
82
encode.cc
82
encode.cc
|
|
@ -90,74 +90,30 @@ struct Encoder : public Common
|
|||
for (int i = 0; i < symbol_len; ++i)
|
||||
tdom[i] = cmplx(clamp(tdom[i].real()), clamp(tdom[i].imag()));
|
||||
}
|
||||
void transform(cmplx *output, value scale, int offset, int stride)
|
||||
{
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
fdom[i] = 0;
|
||||
for (int i = offset; i < tone_count; i += stride)
|
||||
fdom[bin(i+tone_off)] = tone[i];
|
||||
bwd(output, fdom);
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
output[i] *= scale;
|
||||
}
|
||||
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;
|
||||
transform(tdom, scale, 0, 1);
|
||||
} else {
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
fdom[i] = 0;
|
||||
for (int i = 0; i < tone_count; i += 8)
|
||||
fdom[bin(i+tone_off)] = tone[i];
|
||||
bwd(ptsa, fdom);
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
ptsa[i] *= scale;
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
fdom[i] = 0;
|
||||
for (int i = 1; i < tone_count; i += 8)
|
||||
fdom[bin(i+tone_off)] = tone[i];
|
||||
bwd(ptsb, fdom);
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
ptsb[i] *= scale;
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
fdom[i] = 0;
|
||||
for (int i = 2; i < tone_count; i += 8)
|
||||
fdom[bin(i+tone_off)] = tone[i];
|
||||
bwd(ptsc, fdom);
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
ptsc[i] *= scale;
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
fdom[i] = 0;
|
||||
for (int i = 3; i < tone_count; i += 8)
|
||||
fdom[bin(i+tone_off)] = tone[i];
|
||||
bwd(ptsd, fdom);
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
ptsd[i] *= scale;
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
fdom[i] = 0;
|
||||
for (int i = 4; i < tone_count; i += 8)
|
||||
fdom[bin(i+tone_off)] = tone[i];
|
||||
bwd(ptse, fdom);
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
ptse[i] *= scale;
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
fdom[i] = 0;
|
||||
for (int i = 5; i < tone_count; i += 8)
|
||||
fdom[bin(i+tone_off)] = tone[i];
|
||||
bwd(ptsf, fdom);
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
ptsf[i] *= scale;
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
fdom[i] = 0;
|
||||
for (int i = 6; i < tone_count; i += 8)
|
||||
fdom[bin(i+tone_off)] = tone[i];
|
||||
bwd(ptsg, fdom);
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
ptsg[i] *= scale;
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
fdom[i] = 0;
|
||||
for (int i = 7; i < tone_count; i += 8)
|
||||
fdom[bin(i+tone_off)] = tone[i];
|
||||
bwd(ptsh, fdom);
|
||||
for (int i = 0; i < symbol_len; ++i)
|
||||
ptsh[i] *= scale;
|
||||
transform(ptsa, scale, 0, 8);
|
||||
transform(ptsb, scale, 1, 8);
|
||||
transform(ptsc, scale, 2, 8);
|
||||
transform(ptsd, scale, 3, 8);
|
||||
transform(ptse, scale, 4, 8);
|
||||
transform(ptsf, scale, 5, 8);
|
||||
transform(ptsg, scale, 6, 8);
|
||||
transform(ptsh, scale, 7, 8);
|
||||
value best_papr = 1000;
|
||||
int phase_max = 4;
|
||||
auto rot = [](int i){ return i&2 ? cmplx(0, nrz(i&1)) : cmplx(nrz(i&1)); };
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue