Tracking PLL phase error

Hello,

I’m using the gr::analog::pll_carriertracking_cc() block to track a very
stable signal of which I don’t know the exact frequency and of which I
want to detect (small!) phase oscillations.

In my tests I discovered that the tracked signal has a residual phase
modulation that I would not expect to find. I tried a simple test, very
similar to the qa test for the block, and indeed I found that even for a
constant frequency input signal the output has some residual phase
oscillations. The amplitude of the oscillations depends on the pll
bandwidth and on the frequency of the input signal, of the order of mrad
for this examples (qa_pll_carriertracking.py).

I need to get rid of those oscillations because they mask the phase
signal I want to measure. I’m going to investigate the issue further,
but does anyone have an idea about where those may come from? I suspect
the digital oscillator may introduce some numeric error that may explain
them, but they seem quite big…

Cheers,
Daniele

oscillations. The amplitude of the oscillations depends on the pll
bandwidth and on the frequency of the input signal, of the order of mrad
for this examples (qa_pll_carriertracking.py).

I need to get rid of those oscillations because they mask the phase
signal I want to measure. I’m going to investigate the issue further,
but does anyone have an idea about where those may come from?

Just a guess; try changing

pll_carriertracking_cc_impl::phase_detector()

to use atan2() or atan2f() instead of gr::fast_atan2f().
It should be better, but will probably be slower.

gr::fast_atan2f() is a lookup with linear interpolation:

" * [fast_atan2f] calculates the arc tangent with an

  • average error of +/- 0.045 degrees.
    */"

0.045 degrees is 0.785 milliradians, I think.

Regards,
Andy