I would like to ask for some guidance regarding 2 issues mainly QPSK and Gardner algorithm for timing recovery.

I am having as input a set of IQ samples (10 samples per symbol) to which I need to provide timing recovery.

Having red Gardner’s landmark paper on that concept (A BPSK/QPSK Timing-Error Detector for Sampled Receivers) I understand that in a simple BPSK case where transition exists (in a pulse always) the two first terms (x[nT]-x[(n-1)T]) of the formula e={x[nT]-x[(n-1)T] }x[nT+T/2] cancel out and the error approaches zero. In cases where no transition exists then we don’t get the desirable cancelation but statistically that is going to be resolved later due to negative symbols inserted. enter image description here All that above is quite straightforward the complications start with the obscurity behind the input samples I am having and the relation they have with the constellation diagram and the initial pulses.

Above you can see the constellation diagram (of my samples) plotted. The axes are scaled this way because the numbers are represented in 8 bit integers. Now if I choose a smaller chunk of my sample set let say 300 and scale them properly (divide by 256) I get that :(only for clarification purposes to show the samples) enter image description here

Is apparent by the concept of timing recovery itself that needs to be kept only,a number of samples that fall very close to the 4 constellation points and discard all the rest.

Here I am having two main doubts the first is fundamental related to QPSK. How do I connect the constellation diagram with the actual waveform?

Gardner was explaining his concept utilizing 2 samples only.In my case that 10 samples per symbol are utilised means that for each pulse am sampling 10 times (sorry for the oversimplification) and the I part is the magnitude and Q the angle of each sample?

Is it like splitting the initial wave or pulse in 10 samples (sorry again for that simplifications I know they sound trivial to many but are necessary to clear my doubts) instead of 2 that Gardner was explaining?

If yes then how do I employ the formula,I mean, how do I set the middle (x[n*T+T/2]) term and how the other two x[nT]-x[(n-1)T]?

However, In QPSK things are more complicated due to the fact that both I and Q samples exist.

That introduces a new term in the Gardner’s equation e={x[nT]-x[(n-1)T] }x[nT+T/2]+{y[nT]-y[(n-1)T] }y[nT+T/2] .Where, the second term refers to the Q samples,and introduces a greater difficulty on realizing where and how to used the formula.

Any ideas on how to employ that for QPSK as well?

Thanks a lot



1 Answer 1


Your timing error detector should be run once for each input symbol. As you noted, your signal is far more oversampled than you need to be, so you won't end up using most of them for the purposes of timing error detection. As the paper suggests, the detector uses three samples, each separated by half the symbol period $T$.

So, for the first timing error calculation, you would use $x[0], x[5], x[10]$, for the next you would use $x[10], x[15], x[20]$, and so on. Over time you will develop an estimate of the timing error, which you can use to select the correct sampling phase for the soft symbol decision. This will reduce your signal down to one sample per symbol, giving you a (hopefully) QPSK-looking constellation.

While you aren't using most of the samples in your signal for timing error detection, they could still be useful to you during the selection of the appropriate sampling phase. This will in general require sub-sample precision, so the increased sample rate can help you in interpolating to find the signal's value at the exact position that you want.

  • $\begingroup$ Thanks very much for your reply!!!Although it was very helpful I would like if possible to raise a few more doubts...you say "Over time you will develop an estimate of the timing error " could you please expound a bit on that?Isn't the mechanism that you shift back and forth until you find the strobe?The final estimate is related to the integrator next to the TED output.I am asking that cause manually (over a small sample set) doesn't seem to work for me.Shall I invest more time looping? $\endgroup$
    – Rizias
    Apr 17, 2015 at 8:54
  • $\begingroup$ Timing error detectors like this one are meant to be used in a closed-loop configuration. Generally, you take the timing errors, pass them through some kind of loop filter (in the simplest (first-order loop) case, the filter would just have a transfer function of unity), and then feed that back to a variable delay element that undoes the estimated timing error. The loop should then converge to timing lock, where the (average) timing error estimate is zero. $\endgroup$
    – Jason R
    Apr 17, 2015 at 12:51
  • $\begingroup$ @JasonR I'm working on a similar problem. Just so I am understanding, I use the timing error to adjust my sample time for each symbol then at the end I should get a single sample phase or a sample phase for each symbol? For randomly drifting timing offsets I think a single sample phase is not enough $\endgroup$
    – Engineer
    Jan 22, 2020 at 15:22
  • $\begingroup$ Timing error detectors like Gardner are intended for use in a control loop that tracks the correct sampling instant. You would normally update them once per symbol, so for each symbol you calculate a timing error and apply it to the loop filter. The output of the loop filter then feeds back to select the sampling instant for the next symbol. It is this negative feedback that allows the loop to lock after observing enough error measurements. $\endgroup$
    – Jason R
    Jan 22, 2020 at 18:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.