mirror of
https://github.com/aicodix/modem.git
synced 2026-04-27 22:35:41 +00:00
use a simpler estimation for finer CFO
This commit is contained in:
parent
ef152cc53f
commit
357a90805c
1 changed files with 3 additions and 17 deletions
20
decode.cc
20
decode.cc
|
|
@ -195,7 +195,6 @@ struct Decoder
|
|||
uint16_t erasures[24];
|
||||
cmplx head[symbol_len], tail[symbol_len], cons[cons_max];
|
||||
cmplx fdom[symbol_len], tdom[buffer_len], resam[buffer_len];
|
||||
value phase[symbol_len/2];
|
||||
value cfo_rad, sfo_rad;
|
||||
int symbol_pos;
|
||||
int oper_mode;
|
||||
|
|
@ -236,23 +235,10 @@ struct Decoder
|
|||
}
|
||||
value frac_cfo(const cmplx *samples)
|
||||
{
|
||||
value avg = 0;
|
||||
cmplx sum;
|
||||
for (int i = 0; i < symbol_len/2; ++i)
|
||||
avg += phase[i] = arg(samples[i] * conj(samples[i+symbol_len/2]));
|
||||
avg /= value(symbol_len/2);
|
||||
value var = 0;
|
||||
for (int i = 0; i < symbol_len/2; ++i)
|
||||
var += (phase[i] - avg) * (phase[i] - avg);
|
||||
value std_dev = std::sqrt(var/(symbol_len/2-1));
|
||||
int count = 0;
|
||||
value sum = 0;
|
||||
for (int i = 0; i < symbol_len/2; ++i) {
|
||||
if (std::abs(phase[i] - avg) <= std_dev) {
|
||||
sum += phase[i];
|
||||
++count;
|
||||
}
|
||||
}
|
||||
return sum / (count * symbol_len/2);
|
||||
sum += samples[i] * conj(samples[i+symbol_len/2]);
|
||||
return arg(sum) / (symbol_len/2);
|
||||
}
|
||||
void deinterleave()
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue