All - Do I understand correctly that gr.pll_carriertracking_cc() is

supposed to downconvert to DC? I don’t see it doing that, and can’t

see in the work functions where that magic would be accomplished.

Just want to make sure I’m building the most efficient graph possible.

I tried both in an existing AM detector with a 7.5KHz IF and both work

just the same with an external mixer.

refout:

int

gr_pll_refout_cc::work (int noutput_items,

gr_vector_const_void_star &input_items,

gr_vector_void_star &output_items)

{

const gr_complex *iptr = (gr_complex *) input_items[0];

gr_complex *optr = (gr_complex *) output_items[0];

float error;

float t_imag, t_real;

int size = noutput_items;

while (size-- > 0) {

error = phase_detector(*iptr++,d_phase);

```
d_freq = d_freq + d_beta * error;
d_phase = mod_2pi(d_phase + d_freq + d_alpha * error);
if (d_freq > d_max_freq)
d_freq = d_max_freq;
else if (d_freq < d_min_freq)
d_freq = d_min_freq;
gr_sincosf(d_phase,&t_imag,&t_real);
*optr++ = gr_complex(t_real,t_imag);
```

}

return noutput_items;

}

carriertracking:

int

gr_pll_carriertracking_cc::work (int noutput_items,

gr_vector_const_void_star &input_items,

gr_vector_void_star &output_items)

{

const gr_complex *iptr = (gr_complex *) input_items[0];

gr_complex *optr = (gr_complex *) output_items[0];

float error;

float t_imag, t_real;

for (int i = 0; i < noutput_items; i++){

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);
if (d_freq > d_max_freq)
d_freq = d_max_freq;
else if (d_freq < d_min_freq)
d_freq = d_min_freq;
gr_sincosf(d_phase,&t_imag,&t_real);
optr[i] = gr_complex(t_real,t_imag);
d_locksig = d_locksig * (1.0 - d_alpha) + d_alpha*(iptr[i].real() *
```

t_real + iptr[i].imag() * t_imag);

```
if ((d_squelch_enable) && !lock_detector())
optr[i] = 0;
```

}

return noutput_items;

}