Skip to main content
3 of 3
added 1566 characters in body
Dan Boschen
  • 55k
  • 2
  • 59
  • 143

Since ultimately the recovered time must be symbol synchronous (in the end we need one sample per symbol and that sample should be at the correct sampling location to minimize error), it would make sense to operate the timing recovery with an integer number of samples per symbol. This implies the waveform sampled at 1.9729 samples per symbol could be resampled to 2 samples per symbol. Since such resampling/ interpolation is part of timing recovery anyway, this is being done regardless! (No matter what the OP seeks to get one sample per symbol from some form of an interpolator, so if we have 1 sample per symbol, we also have two samples per symbol etc). Please refer to this post for specific details on implementing polyphase retiming filters which can operate at a non-integer number of samples per symbol and provide a properly retimed output to any precision at an integer symbol sampling rate without actually changing actual sampling clock.

There is no requirement for general timing recovery that the sampling rate be an integer number of samples, but this is often the choice due to convenience that once recovered each subsequent $N$ samples will be at the correct timing location assuming no timing drift. Two samples per symbol is more than sufficient and often the choice in implementations using implementations such as the Gardner Loop which is my favored approach. (The OP is implementing a derivative matched filter timing recovery implementation that I have detailed in this post.) Another consideration is to use a Mueller and Mueller synchronizer which only requires one sample per symbol (but must have most of the carrier offset removed from a carrier recovery loop, while the Gardner in contrast can operate with relatively large carrier offsets).

So in summary my suggestion resample to an integer number of samples per symbol with a precision interpolator that can be used as part as t the timing recovery loop, and use whatever precision is required in the resampler for the allowing maximum timing error by symbol (based on modulation choice and minimum EVM required). Whatever favored approach for interpolation, it can be used as the timing adjustment mechanism for the actual timing loop itself. The timing error detector (Gardner or otherwise) can then operate on the retimed samples at $N$ samples per symbol with $N$ being an integer. (Again not necessary but convenient to do so given those samples are being established anyway).

I don't see a fundamental reason the Gardner cannot provide a timing error with fractional samples per symbol, but I do see potential complexities that can be avoided by resampling to integer samples per symbol. I have never implemented it other than integer samples per symbol, so these are suspicions not experience: the challenge may be the introduced underlying drift rate compared to the timing loop bandwidth. On its own at 1.9729 samples per symbol, without correction the error is 0.0271 symbols per symbol, so the timing loop bandwidth needs to be wide enough to keep up with that, or the delay slope must be added to the interpolator to be introduced on every update (which then is back to basically being equivalent to resampling to two samples per symbol). Without any correction the samples cycle completely past the symbols every 37 symbols! Note from the graphic below the relationship of Gardner TED self-noise and timing error. What we see in the plot on the left is measured results on a Garnder TED error signal versus timing offset with the long term average given by the negative sine wave in white (buried in the noise of the TED on a sample by sample basis!). The plots on the right show the spectrums of this noise for the case when there is no time offset and for a small offset. With no offset and a tight loop bandwidth (filtering) we achieve a noise shaping advantage. Ultimately we just need to be sure the self noise is low enough to not degrade our EVM targets.

TED Pattern Noise

Dan Boschen
  • 55k
  • 2
  • 59
  • 143