discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Discuss-gnuradio] Clock recovery for BPSK with intentional ISI


From: Andy Walls
Subject: Re: [Discuss-gnuradio] Clock recovery for BPSK with intentional ISI
Date: Thu, 15 Jun 2017 12:43:30 -0400

Hi Phil:

> Date: Thu, 15 Jun 2017 12:57:54 +0000
> From: Phil Frost:

> I am working on a receiver for the amateur radio mode PSK31[1]. It's BPSK
> where the pulses are a raised cosine (impulse, not frequency domain) twice
> the symbol duration[2], no error correction, at 31.25 baud. The transmitted
> signal has no ISI, but after matched filtering it does:
> 
> [image: 0SDEq.png]
> 
> I had hoped to do matched filtering and compensate ISI with a Viterbi
> equalizer, but I'm unsure how to do clock recovery.
> 
> I hoped to use the polyphase clock recovery block, but it seems this won't
> work since the derivative of the signal may not be zero at the ideal
> sampling points. Is that an accurate assessment?

Hmm not really.  As long as *some* of the symbols have a derivative of 0
at the optimal sampling point, and you have proper symbol clock
synchronization loop filer gains set, the (small) signal * slope ML
approximation Timing Error Detector should work.

> [image: 2017-06-15-083544_393x230_scrot.png]
> 
> Perhaps the clock recovery MM block?

Don't use the Complex M&M block in GNURadio. Its internal decision
slicer (M&M is decision directed) is horribly wrong.

>  The zero crossings aren't exactly in
> the middle of the ideal sampling points, but the error is probably
> negligible.

The M&M TED doesn't use zero crossings.  It uses values at symbol peaks.
ISI tends to throw it off a little bit.

>  I can't get it to work: I think it outputs the correct bits,
> but exactly 1 or -1, even though I should be getting +/- 0.5, 0.75, or 1
> depending on the adjacent bits. I'm using the default settings. Is that the
> intended behavior?

No.  Something is really wrong.  It should never output exactly +/-1.0
for every symbol, if you know you have ISI.

> 
> [image: 2017-06-15-084108_1038x201_scrot.png]
> [image: 2017-06-15-084340_475x253_scrot.png]
> 
> Finally, any other algorithms I should be considering?

I encourage you to try the Symbol Synchronizer block in this OOT module:

https://github.com/awalls-cx18/gr-nwr

or in this pull request:

https://github.com/gnuradio/gnuradio/pull/1294
https://github.com/awalls-cx18/gnuradio/tree/symbol_sync2

The Symbol Synchronizer block is a replacement for the Polyphase Clock
Sync blocks, M&M clock recovery blocks, and the MSK Timing Recovery
Block; adds additional Timing Error Detectors.  It adds synchronization
restart on time_est or clock_est tags. It performs tag propagation
correctly (unlike all the in tree blocks).

The block also has diagnostic sample stream outputs, so you can tune the
P-I filter for the desired symbol synch PLL behavior.
The diagnostic outputs are:
  error: timing error detector output signal
  T_inst: instantaneous symbol clock period estimate in samples/symbol
  T_avg: average symbol clock period estimate in samples/symbol

I encourage you to play with the clock recovery example flowgraph, to
get a feel for how tweaking damping factor and loop bandwidth affect how
the PLL tracks the symbol clock.
https://github.com/awalls-cx18/gr-nwr/blob/master/examples/clock_recovery_test_complex.grc
FWIW, the above flowgraph operates on symbols with some ISI in them.


The TEDs available with the Symbol Synchronizer blocks are:
  M&M (decision directed)
  Modified M&M (decision directed)
  Zero Crossing (decision directed)
  Gardner (a crude small signal * slope ML approximation)
  Early-Late
  D'Andrea and Mengali General MSK
  Mengali and D'Andrea GMSK
  small signal * slope ML approximation
  large signal signum * slope ML approximation

The decision directed TEDs require a slicer constellation object, and
that the input stream be normalized to the same levels to which the
constellation object normalizes the constellation points.
 
The interpolating-resampler used in the Symbol Synchronizer blocks is
selectable between:
   MMSE 8-tap (a 128 arm PFB that the M&M block uses)
   PFB, no MF (the MMSE 8-tap PFB with a reduced number of arms)
   PFB, MF (just like what the PFB clock sync blocks use)


For a quick overview of symbol recovery, see this MatLab documentation:
https://www.mathworks.com/help/comm/ref/comm.symbolsynchronizer-class.html#bumtxky-18

For the PFB clock sync block algorithms specifically, see figure 10 of:

Fredric J. Harris, Michael Rice, "Multirate Digital Filters for Symbol
Timing Synchronization in Software Defined Radios",
_IEEE_Journal_on_Selected_Areas_in_Communications_, Vol. 19, No. 12,
December 2001, pp. 2346 - 2357
https://pdfs.semanticscholar.org/3077/d85fc72d89c72c4c6d11f1014c5175e319c3.pdf

(The gist is to combine the receive pulse matched filter with the
resampling interpolator filter to save filtering operations.  The
resampling interpolator filter is implemented with a PFB and a
derivative PFB, since the (approximate) maximum likelyhood timing error
detector needs the derivative of the signal too.)

Also see this for an additional explanation written by Tom Rondeau:
https://wiki.gnuradio.org/index.php/Guided_Tutorial_PSK_Demodulation#7.6.1._Details_of_the_PFB_Clock_Recovery_Block


For the Symbol Synchronizer blocks, see this napkin diagram:
https://github.com/gnuradio/gnuradio/files/950045/Symbol_Synchronizer_block_diagram.pdf
and this comment:
https://github.com/gnuradio/gnuradio/pull/1294#issuecomment-296628308

For the symbol clock phase tracking loop transfer function and gain
computation, see this document:
https://github.com/awalls-cx18/gr-nwr/blob/master/docs/clock_loop.pdf

Regards,
Andy





reply via email to

[Prev in Thread] Current Thread [Next in Thread]