Is gr.pll_carriertracking_cc a suitable replacement for atsc_fpll? The
atsc one appears to have a loop filter that the carriertracking one does
not:
atsc_fpll:
float input = agc.scale (in[k]);
nco.step (); // increment phase
nco.sincos (&a_sin, &a_cos); // compute cos and sin
float I = input * a_sin;
float Q = input * a_cos;
out[k] = I;
float filtered_I = afci.filter (I);
float filtered_Q = afcq.filter (Q);
// phase detector
float x = atan2 (filtered_Q, filtered_I);
nco.adjust_phase (alpha * x);
nco.adjust_freq (beta * x);
pll_carriertracking:
error = phase_detector(iptr[i],d_phase);
d_freq = d_freq + d_beta * error;
d_phase = mod_2pi(d_phase + d_freq + d_alpha * error);
gr_sincosf(d_phase,&t_imag,&t_real);
optr[i] = iptr[i] * gr_complex(t_real,-t_imag);
If we can use a complex pll it would eleminate one upconverter and lower
some sampling rates. It kinda works with lots of errors - comparison of
their output here: Comparing atsc_fpll and gr_pll_carriertracking
–Chuck