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 _______________________________________________ Discuss-gnuradio mailing list [email protected] https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
