Costas Loop

A Costas loop carrier recovery module, great for synchronizing to BPSK, QPSK, and 8PSK. The Costas loop locks to the center frequency of a signal and downconverts it to baseband.
 * When order=2: used for BPSK where the real part of the output signal is the baseband BPSK signal and the imaginary part is the error signal.
 * When order=4: can be used for QPSK where both I and Q (real and imaginary) are output.
 * When order=8: used for 8PSK.

The Costas loop can have two output streams:
 * 1) stream 1 (required) is the baseband I and Q;
 * 2) stream 2 (optional) is the normalized frequency of the loop

There is a single optional message input for a noise floor estimate used to calculate the SNR of a sample.

The block uses 'phase_est' tag generated by the Correlation Estimator. This helps to correct the phase offset which is crucial for synchronization process.

More details can be found online:

J. Feigin, "Practical Costas loop design: Designing a simple and inexpensive BPSK Costas loop carrier recovery circuit," RF signal processing, pp. 20-36, 2002.

Parameters
(R): Run-time adjustable


 * Loop Bandwidth (R)
 * Internal 2nd order loop bandwidth (~ 2pi/100)


 * Order
 * The loop order, either 2, 4, or 8, see above.


 * Use SNR
 * Use or ignore SNR estimates (from noise message port) in measurements; also uses tanh instead of slicing.

Example Flowgraph
See QPSK_Mod_and_Demod

Source Files

 * C++ files
 * costas_loop_cc_impl.cc


 * Header files
 * costas_loop_cc_impl.h


 * Public header files
 * costas_loop_cc.h


 * Block definition
 * digital_costas_loop_cc.block.yml