mirror of
https://github.com/aicodix/modem.git
synced 2026-04-27 22:35:41 +00:00
do unlimited clipping and filtering only once when done searching
This commit is contained in:
parent
51f49f56e2
commit
fc120d1177
1 changed files with 7 additions and 17 deletions
24
encode.cc
24
encode.cc
|
|
@ -48,7 +48,7 @@ struct Encoder : public Common
|
||||||
{
|
{
|
||||||
return 1 - 2 * bit;
|
return 1 - 2 * bit;
|
||||||
}
|
}
|
||||||
void clipping_and_filtering(value scale, bool limit)
|
void clipping_and_filtering(value scale)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < symbol_len; ++i) {
|
for (int i = 0; i < symbol_len; ++i) {
|
||||||
value pwr = norm(tdom[i]);
|
value pwr = norm(tdom[i]);
|
||||||
|
|
@ -58,22 +58,17 @@ struct Encoder : public Common
|
||||||
fwd(fdom, tdom);
|
fwd(fdom, tdom);
|
||||||
for (int i = 0; i < symbol_len; ++i) {
|
for (int i = 0; i < symbol_len; ++i) {
|
||||||
int j = bin(i + tone_off);
|
int j = bin(i + tone_off);
|
||||||
if (i >= tone_count) {
|
if (i >= tone_count)
|
||||||
fdom[j] = 0;
|
fdom[j] = 0;
|
||||||
} else if (i % block_length == pilot_off) {
|
else
|
||||||
fdom[j] = temp[i];
|
|
||||||
} else {
|
|
||||||
fdom[j] *= 1 / (scale * symbol_len);
|
fdom[j] *= 1 / (scale * symbol_len);
|
||||||
cmplx err = fdom[j] - temp[i];
|
|
||||||
value mag = abs(err);
|
|
||||||
value lim = 0.5 * mod_distance();
|
|
||||||
if (limit && mag > lim)
|
|
||||||
fdom[j] -= ((mag - lim) / mag) * err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
bwd(tdom, fdom);
|
bwd(tdom, fdom);
|
||||||
for (int i = 0; i < symbol_len; ++i)
|
for (int i = 0; i < symbol_len; ++i)
|
||||||
tdom[i] *= scale;
|
tdom[i] *= scale;
|
||||||
|
auto clamp = [](value v){ return v < value(-1) ? value(-1) : v > value(1) ? value(1) : v; };
|
||||||
|
for (int i = 0; i < symbol_len; ++i)
|
||||||
|
tdom[i] = cmplx(clamp(tdom[i].real()), clamp(tdom[i].imag()));
|
||||||
}
|
}
|
||||||
void symbol(int symbol_number)
|
void symbol(int symbol_number)
|
||||||
{
|
{
|
||||||
|
|
@ -103,7 +98,6 @@ struct Encoder : public Common
|
||||||
tdom[i] *= scale;
|
tdom[i] *= scale;
|
||||||
if (symbol_number < 0)
|
if (symbol_number < 0)
|
||||||
break;
|
break;
|
||||||
clipping_and_filtering(scale, true);
|
|
||||||
value peak = 0, mean = 0;
|
value peak = 0, mean = 0;
|
||||||
for (int i = 0; i < symbol_len; ++i) {
|
for (int i = 0; i < symbol_len; ++i) {
|
||||||
value power(norm(tdom[i]));
|
value power(norm(tdom[i]));
|
||||||
|
|
@ -117,11 +111,7 @@ struct Encoder : public Common
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (symbol_number >= 0)
|
clipping_and_filtering(scale);
|
||||||
clipping_and_filtering(scale, false);
|
|
||||||
auto clamp = [](value v){ return v < value(-1) ? value(-1) : v > value(1) ? value(1) : v; };
|
|
||||||
for (int i = 0; i < symbol_len; ++i)
|
|
||||||
tdom[i] = cmplx(clamp(tdom[i].real()), clamp(tdom[i].imag()));
|
|
||||||
if (symbol_number != -1) {
|
if (symbol_number != -1) {
|
||||||
for (int i = 0; i < guard_len; ++i)
|
for (int i = 0; i < guard_len; ++i)
|
||||||
guard[i] = DSP::lerp(guard[i], tdom[i+symbol_len-guard_len], weight[i]);
|
guard[i] = DSP::lerp(guard[i], tdom[i+symbol_len-guard_len], weight[i]);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue