GNU Radio 3.3.0 C++ API
gr_mpsk_receiver_cc Class Reference

This block takes care of receiving M-PSK modulated signals through phase, frequency, and symbol synchronization.This block takes care of receiving M-PSK modulated signals through phase, frequency, and symbol synchronization. It performs carrier frequency and phase locking as well as symbol timing recovery. It works with (D)BPSK, (D)QPSK, and (D)8PSK as tested currently. It should also work for OQPSK and PI/4 DQPSK. More...

#include <gr_mpsk_receiver_cc.h>

Inheritance diagram for gr_mpsk_receiver_cc:

List of all members.

Public Member Functions

 ~gr_mpsk_receiver_cc ()
void forecast (int noutput_items, gr_vector_int &ninput_items_required)
 Estimate input requirements given output request.
int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
 compute output items from input items
float mu () const
 (M&M) Returns current value of mu
float omega () const
 (M&M) Returns current value of omega
float gain_mu () const
 (M&M) Returns mu gain factor
float gain_omega () const
 (M&M) Returns omega gain factor
void set_mu (float mu)
 (M&M) Sets value of mu
void set_omega (float omega)
 (M&M) Sets value of omega and its min and max values
void set_gain_mu (float gain_mu)
 (M&M) Sets value for mu gain factor
void set_gain_omega (float gain_omega)
 (M&M) Sets value for omega gain factor
float alpha () const
 (CL) Returns the value for alpha (the phase gain term)
float beta () const
 (CL) Returns the value of beta (the frequency gain term)
float freq () const
 (CL) Returns the current value of the frequency of the NCO in the Costas loop
float phase () const
 (CL) Returns the current value of the phase of the NCO in the Costal loop
void set_alpha (float alpha)
 (CL) Sets the value for alpha (the phase gain term)
void set_beta (float beta)
 (CL) Setss the value of beta (the frequency gain term)
void set_freq (float freq)
 (CL) Sets the current value of the frequency of the NCO in the Costas loop
void set_phase (float phase)
 (CL) Setss the current value of the phase of the NCO in the Costal loop

Protected Member Functions

 gr_mpsk_receiver_cc (unsigned int M, float theta, float alpha, float beta, float fmin, float fmax, float mu, float gain_mu, float omega, float gain_omega, float omega_rel)
 Constructor to synchronize incoming M-PSK symbols.
void make_constellation ()
void mm_sampler (const gr_complex symbol)
void mm_error_tracking (gr_complex sample)
void phase_error_tracking (gr_complex sample)
float phase_error_detector_generic (gr_complex sample) const
 Phase error detector for MPSK modulations.
float phase_error_detector_bpsk (gr_complex sample) const
 Phase error detector for BPSK modulation.
float phase_error_detector_qpsk (gr_complex sample) const
 Phase error detector for QPSK modulation.
unsigned int decision_generic (gr_complex sample) const
 Decision maker for a generic MPSK constellation.
unsigned int decision_bpsk (gr_complex sample) const
 Decision maker for BPSK constellation.
unsigned int decision_qpsk (gr_complex sample) const
 Decision maker for QPSK constellation.

Friends

gr_mpsk_receiver_cc_sptr gr_make_mpsk_receiver_cc (unsigned int M, float theta, float alpha, float beta, float fmin, float fmax, float mu, float gain_mu, float omega, float gain_omega, float omega_rel)

Detailed Description

This block takes care of receiving M-PSK modulated signals through phase, frequency, and symbol synchronization.

This block takes care of receiving M-PSK modulated signals through phase, frequency, and symbol synchronization. It performs carrier frequency and phase locking as well as symbol timing recovery. It works with (D)BPSK, (D)QPSK, and (D)8PSK as tested currently. It should also work for OQPSK and PI/4 DQPSK.

The phase and frequency synchronization are based on a Costas loop that finds the error of the incoming signal point compared to its nearest constellation point. The frequency and phase of the NCO are updated according to this error. There are optimized phase error detectors for BPSK and QPSK, but 8PSK is done using a brute-force computation of the constellation points to find the minimum.

The symbol synchronization is done using a modified Mueller and Muller circuit from the paper:

G. R. Danesfahani, T.G. Jeans, "Optimisation of modified Mueller and Muller algorithm," Electronics Letters, Vol. 31, no. 13, 22 June 1995, pp. 1032 - 1033.

This circuit interpolates the downconverted sample (using the NCO developed by the Costas loop) every mu samples, then it finds the sampling error based on this and the past symbols and the decision made on the samples. Like the phase error detector, there are optimized decision algorithms for BPSK and QPKS, but 8PSK uses another brute force computation against all possible symbols. The modifications to the M&M used here reduce self-noise.


Constructor & Destructor Documentation

gr_mpsk_receiver_cc::~gr_mpsk_receiver_cc ( )
gr_mpsk_receiver_cc::gr_mpsk_receiver_cc ( unsigned int  M,
float  theta,
float  alpha,
float  beta,
float  fmin,
float  fmax,
float  mu,
float  gain_mu,
float  omega,
float  gain_omega,
float  omega_rel 
) [protected]

Constructor to synchronize incoming M-PSK symbols.

Parameters:
Mmodulation order of the M-PSK modulation
thetaany constant phase rotation from the real axis of the constellation
alphagain parameter to adjust the phase in the Costas loop (~0.01)
betagain parameter to adjust the frequency in the Costas loop (~alpha^2/4)
fminminimum normalized frequency value the loop can achieve
fmaxmaximum normalized frequency value the loop can achieve
muinitial parameter for the interpolator [0,1]
gain_mugain parameter of the M&M error signal to adjust mu (~0.05)
omegainitial value for the number of symbols between samples (~number of samples/symbol)
gain_omegagain parameter to adjust omega based on the error (~omega^2/4)
omega_relsets the maximum (omega*(1+omega_rel)) and minimum (omega*(1+omega_rel)) omega (~0.005)

The constructor also chooses which phase detector and decision maker to use in the work loop based on the value of M.


Member Function Documentation

float gr_mpsk_receiver_cc::alpha ( ) const [inline]

(CL) Returns the value for alpha (the phase gain term)

Referenced by set_alpha().

float gr_mpsk_receiver_cc::beta ( ) const [inline]

(CL) Returns the value of beta (the frequency gain term)

Referenced by set_beta().

unsigned int gr_mpsk_receiver_cc::decision_bpsk ( gr_complex  sample) const [protected]

Decision maker for BPSK constellation.

Parameters:
samplethe baseband I&Q sample from which to make the decision

This decision maker is a simple slicer function that makes a decision on the symbol based on its placement on the real axis of greater than 0 or less than 0; the quadrature component is always 0.

Returns:
the index to d_constellation that minimizes the error/
unsigned int gr_mpsk_receiver_cc::decision_generic ( gr_complex  sample) const [protected]

Decision maker for a generic MPSK constellation.

Parameters:
samplethe baseband I&Q sample from which to make the decision

This decision maker is a generic implementation that does a brute-force search for the constellation point that minimizes the error between it and the incoming signal.

Returns:
the index to d_constellation that minimizes the error/
unsigned int gr_mpsk_receiver_cc::decision_qpsk ( gr_complex  sample) const [protected]

Decision maker for QPSK constellation.

Parameters:
samplethe baseband I&Q sample from which to make the decision

This decision maker is a simple slicer function that makes a decision on the symbol based on its placement versus both axes and returns which quadrant the symbol is in.

Returns:
the index to d_constellation that minimizes the error/
void gr_mpsk_receiver_cc::forecast ( int  noutput_items,
gr_vector_int ninput_items_required 
) [virtual]

Estimate input requirements given output request.

Parameters:
noutput_itemsnumber of output items to produce
ninput_items_requirednumber of input items required on each input stream

Given a request to product noutput_items, estimate the number of data items required on each input stream. The estimate doesn't have to be exact, but should be close.

Reimplemented from gr_block.

float gr_mpsk_receiver_cc::freq ( ) const [inline]

(CL) Returns the current value of the frequency of the NCO in the Costas loop

Referenced by set_freq().

float gr_mpsk_receiver_cc::gain_mu ( ) const [inline]

(M&M) Returns mu gain factor

Referenced by set_gain_mu().

float gr_mpsk_receiver_cc::gain_omega ( ) const [inline]

(M&M) Returns omega gain factor

Referenced by set_gain_omega().

int gr_mpsk_receiver_cc::general_work ( int  noutput_items,
gr_vector_int ninput_items,
gr_vector_const_void_star input_items,
gr_vector_void_star output_items 
) [virtual]

compute output items from input items

Parameters:
noutput_itemsnumber of output items to write on each output stream
ninput_itemsnumber of input items available on each input stream
input_itemsvector of pointers to the input items, one entry per input stream
output_itemsvector of pointers to the output items, one entry per output stream
Returns:
number of items actually written to each output stream, or -1 on EOF. It is OK to return a value less than noutput_items. -1 <= return value <= noutput_items

general_work must call consume or consume_each to indicate how many items were consumed on each input stream.

Implements gr_block.

void gr_mpsk_receiver_cc::make_constellation ( ) [protected]
void gr_mpsk_receiver_cc::mm_error_tracking ( gr_complex  sample) [protected]
void gr_mpsk_receiver_cc::mm_sampler ( const gr_complex  symbol) [protected]
float gr_mpsk_receiver_cc::mu ( ) const [inline]

(M&M) Returns current value of mu

Referenced by set_mu().

float gr_mpsk_receiver_cc::omega ( ) const [inline]

(M&M) Returns current value of omega

Referenced by set_omega().

float gr_mpsk_receiver_cc::phase ( ) const [inline]

(CL) Returns the current value of the phase of the NCO in the Costal loop

Referenced by set_phase().

float gr_mpsk_receiver_cc::phase_error_detector_bpsk ( gr_complex  sample) const [protected]

Phase error detector for BPSK modulation.

Parameters:
samplethe I&Q sample from which to determine the phase error

This function determines the phase error using a simple BPSK phase error detector by multiplying the real and imaginary (the error signal) components together. As the imaginary part goes to 0, so does this error.

Returns:
the approximated phase error.
float gr_mpsk_receiver_cc::phase_error_detector_generic ( gr_complex  sample) const [protected]

Phase error detector for MPSK modulations.

Parameters:
samplethe I&Q sample from which to determine the phase error

This function determines the phase error for any MPSK signal by creating a set of PSK constellation points and doing a brute-force search to see which point minimizes the Euclidean distance. This point is then used to derotate the sample to the real-axis and a atan (using the fast approximation function) to determine the phase difference between the incoming sample and the real constellation point

This should be cleaned up and made more efficient.

Returns:
the approximated phase error.
float gr_mpsk_receiver_cc::phase_error_detector_qpsk ( gr_complex  sample) const [protected]

Phase error detector for QPSK modulation.

Parameters:
samplethe I&Q sample from which to determine the phase error

This function determines the phase error using the limiter approach in a standard 4th order Costas loop

Returns:
the approximated phase error.
void gr_mpsk_receiver_cc::phase_error_tracking ( gr_complex  sample) [protected]
void gr_mpsk_receiver_cc::set_alpha ( float  alpha) [inline]

(CL) Sets the value for alpha (the phase gain term)

References alpha().

void gr_mpsk_receiver_cc::set_beta ( float  beta) [inline]

(CL) Setss the value of beta (the frequency gain term)

References beta().

void gr_mpsk_receiver_cc::set_freq ( float  freq) [inline]

(CL) Sets the current value of the frequency of the NCO in the Costas loop

References freq().

void gr_mpsk_receiver_cc::set_gain_mu ( float  gain_mu) [inline]

(M&M) Sets value for mu gain factor

References gain_mu().

void gr_mpsk_receiver_cc::set_gain_omega ( float  gain_omega) [inline]

(M&M) Sets value for omega gain factor

References gain_omega().

void gr_mpsk_receiver_cc::set_mu ( float  mu) [inline]

(M&M) Sets value of mu

References mu().

void gr_mpsk_receiver_cc::set_omega ( float  omega) [inline]

(M&M) Sets value of omega and its min and max values

References omega().

void gr_mpsk_receiver_cc::set_phase ( float  phase) [inline]

(CL) Setss the current value of the phase of the NCO in the Costal loop

References phase().


Friends And Related Function Documentation

gr_mpsk_receiver_cc_sptr gr_make_mpsk_receiver_cc ( unsigned int  M,
float  theta,
float  alpha,
float  beta,
float  fmin,
float  fmax,
float  mu,
float  gain_mu,
float  omega,
float  gain_omega,
float  omega_rel 
) [friend]

The documentation for this class was generated from the following file: