GNU Radio 3.6.5 C++ API

This block takes care of receiving MPSK modulated signals through phase, frequency, and symbol synchronization. More...
#include <digital_mpsk_receiver_cc.h>
Public Member Functions  
~digital_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  modulation_order () const 
Returns the modulation order (M) currently set.  
float  theta () const 
Returns current value of theta.  
float  mu () const 
Returns current value of mu.  
float  omega () const 
Returns current value of omega.  
float  gain_mu () const 
Returns mu gain factor.  
float  gain_omega () const 
Returns omega gain factor.  
float  gain_omega_rel () const 
Returns the relative omega limit.  
void  set_modulation_order (unsigned int M) 
Sets the modulation order (M) currently.  
void  set_theta (float theta) 
Sets value of theta.  
void  set_mu (float mu) 
Sets value of mu.  
void  set_omega (float omega) 
Sets value of omega and its min and max values.  
void  set_gain_mu (float gain_mu) 
Sets value for mu gain factor.  
void  set_gain_omega (float gain_omega) 
Sets value for omega gain factor.  
void  set_gain_omega_rel (float omega_rel) 
Sets the relative omega limit and resets omega min/max values.  
Protected Member Functions  
digital_mpsk_receiver_cc (unsigned int M, float theta, float loop_bw, float fmin, float fmax, float mu, float gain_mu, float omega, float gain_omega, float omega_rel)  
Constructor to synchronize incoming MPSK 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  
DIGITAL_API digital_mpsk_receiver_cc_sptr  digital_make_mpsk_receiver_cc (unsigned int M, float theta, float loop_bw, float fmin, float fmax, float mu, float gain_mu, float omega, float gain_omega, float omega_rel) 
This block takes care of receiving MPSK modulated signals through phase, frequency, and symbol synchronization.
This block takes care of receiving MPSK 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 bruteforce 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 selfnoise.
digital_mpsk_receiver_cc::~digital_mpsk_receiver_cc  (  ) 
digital_mpsk_receiver_cc::digital_mpsk_receiver_cc  (  unsigned int  M, 
float  theta,  
float  loop_bw,  
float  fmin,  
float  fmax,  
float  mu,  
float  gain_mu,  
float  omega,  
float  gain_omega,  
float  omega_rel  
)  [protected] 
Constructor to synchronize incoming MPSK symbols.
M  modulation order of the MPSK modulation 
theta  any constant phase rotation from the real axis of the constellation 
loop_bw  Loop bandwidth to set gains of phase/freq tracking loop 
fmin  minimum normalized frequency value the loop can achieve 
fmax  maximum normalized frequency value the loop can achieve 
mu  initial parameter for the interpolator [0,1] 
gain_mu  gain parameter of the M&M error signal to adjust mu (~0.05) 
omega  initial value for the number of symbols between samples (~number of samples/symbol) 
gain_omega  gain parameter to adjust omega based on the error (~omega^2/4) 
omega_rel  sets 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.
unsigned int digital_mpsk_receiver_cc::decision_bpsk  (  gr_complex  sample  )  const [protected] 
Decision maker for BPSK constellation.
sample  the 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.
unsigned int digital_mpsk_receiver_cc::decision_generic  (  gr_complex  sample  )  const [protected] 
Decision maker for a generic MPSK constellation.
sample  the baseband I&Q sample from which to make the decision 
This decision maker is a generic implementation that does a bruteforce search for the constellation point that minimizes the error between it and the incoming signal.
unsigned int digital_mpsk_receiver_cc::decision_qpsk  (  gr_complex  sample  )  const [protected] 
Decision maker for QPSK constellation.
sample  the 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.
void digital_mpsk_receiver_cc::forecast  (  int  noutput_items, 
gr_vector_int &  ninput_items_required  
)  [virtual] 
Estimate input requirements given output request.
noutput_items  number of output items to produce 
ninput_items_required  number 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 digital_mpsk_receiver_cc::gain_mu  (  )  const [inline] 
Returns mu gain factor.
float digital_mpsk_receiver_cc::gain_omega  (  )  const [inline] 
Returns omega gain factor.
float digital_mpsk_receiver_cc::gain_omega_rel  (  )  const [inline] 
Returns the relative omega limit.
int digital_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
noutput_items  number of output items to write on each output stream 
ninput_items  number of input items available on each input stream 
input_items  vector of pointers to the input items, one entry per input stream 
output_items  vector of pointers to the output items, one entry per output stream 
general_work must call consume or consume_each to indicate how many items were consumed on each input stream.
Reimplemented from gr_block.
void digital_mpsk_receiver_cc::make_constellation  (  )  [protected] 
void digital_mpsk_receiver_cc::mm_error_tracking  (  gr_complex  sample  )  [protected] 
void digital_mpsk_receiver_cc::mm_sampler  (  const gr_complex  symbol  )  [protected] 
float digital_mpsk_receiver_cc::modulation_order  (  )  const [inline] 
Returns the modulation order (M) currently set.
float digital_mpsk_receiver_cc::mu  (  )  const [inline] 
Returns current value of mu.
float digital_mpsk_receiver_cc::omega  (  )  const [inline] 
Returns current value of omega.
float digital_mpsk_receiver_cc::phase_error_detector_bpsk  (  gr_complex  sample  )  const [protected] 
Phase error detector for BPSK modulation.
sample  the 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.
float digital_mpsk_receiver_cc::phase_error_detector_generic  (  gr_complex  sample  )  const [protected] 
Phase error detector for MPSK modulations.
sample  the 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 bruteforce search to see which point minimizes the Euclidean distance. This point is then used to derotate the sample to the realaxis 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.
float digital_mpsk_receiver_cc::phase_error_detector_qpsk  (  gr_complex  sample  )  const [protected] 
Phase error detector for QPSK modulation.
sample  the 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
void digital_mpsk_receiver_cc::phase_error_tracking  (  gr_complex  sample  )  [protected] 
void digital_mpsk_receiver_cc::set_gain_mu  (  float  gain_mu  )  [inline] 
Sets value for mu gain factor.
void digital_mpsk_receiver_cc::set_gain_omega  (  float  gain_omega  )  [inline] 
Sets value for omega gain factor.
void digital_mpsk_receiver_cc::set_gain_omega_rel  (  float  omega_rel  ) 
Sets the relative omega limit and resets omega min/max values.
void digital_mpsk_receiver_cc::set_modulation_order  (  unsigned int  M  ) 
Sets the modulation order (M) currently.
void digital_mpsk_receiver_cc::set_mu  (  float  mu  )  [inline] 
Sets value of mu.
void digital_mpsk_receiver_cc::set_omega  (  float  omega  )  [inline] 
Sets value of omega and its min and max values.
void digital_mpsk_receiver_cc::set_theta  (  float  theta  )  [inline] 
Sets value of theta.
float digital_mpsk_receiver_cc::theta  (  )  const [inline] 
Returns current value of theta.
DIGITAL_API digital_mpsk_receiver_cc_sptr digital_make_mpsk_receiver_cc  (  unsigned int  M, 
float  theta,  
float  loop_bw,  
float  fmin,  
float  fmax,  
float  mu,  
float  gain_mu,  
float  omega,  
float  gain_omega,  
float  omega_rel  
)  [friend] 