do unlimited clipping and filtering only once when done searching

This commit is contained in:
Ahmet Inan 2025-07-11 07:08:31 +02:00
commit fc120d1177

View file

@ -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]);