Symbol Tracker (symtrack)

This page is a work in progress.

The symtrack object is a multi-rate symbol timing synchronizer as well as a carrier frequency/phase recovery and equalizer, useful for tracking... It is effectively the same as the symsync object, but includes an internal control mechanism for also tracking carrier frequency and phase offsets simultaneously.

symtrack_cccf.diagram.png

Figure [fig-symtrack-diagram]. symtrack (symbol synchronizer) functional block diagram

Here is an example:

Figure [fig-symtrack]. symtrack (symbol synchronizer) demonstration for a QPSK signal with a square-root raised-cosine pulse with \(k=2\) samples/symbol, a delay of \(m=4\) symbols, and an excess bandwidth factor \(\beta=0.3\) TODO: UPDATE

symtrack_cccf.const.png

Figure [fig-symtrack-time]. symtrack output constellation

symtrack_cccf.freq.png

Figure [fig-symtrack-freq]. Power spectral density

[fig-symtrack] demonstrates the symtrack_cccf object recovering the sample timing phase for a QPSK signal.


#include <liquid/liquid.h>

int main() {
    // options
    int          ftype = LIQUID_FIRFILT_RRC; // filter type
    unsigned int k     = 2;                  // samples/symbol
    unsigned int m     = 3;                  // filter delay (symbols)
    float        beta  = 0.3f;               // filter excess bandwidth factor
    int          ms    = LIQUID_MODEM_QPSK;  // modulation scheme (can be unknown)

    // create symbol tracking synchronizer
    symtrack_cccf symtrack = symtrack_cccf_create(ftype,k,m,beta,ms);

    unsigned int  buf_len;          // number of input samples
    float complex buf_in [buf_len]; // complex input
    float complex buf_out[buf_len]; // output buffer
    unsigned int  num_written;      // number of values written to buffer

    // ... initialize input buffer with data ...

    // execute symbol tracker, storing result in output buffer
    symtrack_cccf_execute_block(symtrack,
                                buf_in,  buf_len,
                                buf_out, &num_written);

    // ... repeat as necessary ...

    // clean up allocated objects
    symtrack_cccf_destroy(q);
}

For a more detailed example, refer to examples/symtrack_cccf_example.c located under the main liquid project source directory.