gr-baz Package
digital_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 <digital_mpsk_receiver_cc.h>

Inheritance diagram for digital_mpsk_receiver_cc:
gr_block gri_control_loop gr_basic_block gr_msg_accepter gruel::msg_accepter

List of all members.

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.
- Public Member Functions inherited from gr_block
virtual ~gr_block ()
unsigned history () const
void set_history (unsigned history)
bool fixed_rate () const
 Return true if this block has a fixed input to output rate.
virtual bool start ()
 Called to enable drivers, etc for i/o devices.
virtual bool stop ()
 Called to disable drivers, etc for i/o devices.
void set_output_multiple (int multiple)
 Constrain the noutput_items argument passed to forecast and general_work.
int output_multiple () const
bool output_multiple_set () const
void set_alignment (int multiple)
 Constrains buffers to work on a set item alignment (for SIMD)
int alignment () const
void set_unaligned (int na)
int unaligned () const
void set_is_unaligned (bool u)
bool is_unaligned () const
void consume (int which_input, int how_many_items)
 Tell the scheduler how_many_items of input stream which_input were consumed.
void consume_each (int how_many_items)
 Tell the scheduler how_many_items were consumed on each input stream.
void produce (int which_output, int how_many_items)
 Tell the scheduler how_many_items were produced on output stream which_output.
void set_relative_rate (double relative_rate)
 Set the approximate output rate / input rate.
double relative_rate () const
 return the approximate output rate / input rate
virtual int fixed_rate_ninput_to_noutput (int ninput)
 Given ninput samples, return number of output samples that will be produced. N.B. this is only defined if fixed_rate returns true. Generally speaking, you don't need to override this.
virtual int fixed_rate_noutput_to_ninput (int noutput)
 Given noutput samples, return number of input samples required to produce noutput. N.B. this is only defined if fixed_rate returns true. Generally speaking, you don't need to override this.
uint64_t nitems_read (unsigned int which_input)
 Return the number of items read on input stream which_input.
uint64_t nitems_written (unsigned int which_output)
 Return the number of items written on output stream which_output.
tag_propagation_policy_t tag_propagation_policy ()
 Asks for the policy used by the scheduler to moved tags downstream.
void set_tag_propagation_policy (tag_propagation_policy_t p)
 Set the policy by the scheduler to determine how tags are moved downstream.
int min_noutput_items () const
 Return the minimum number of output items this block can produce during a call to work.
void set_min_noutput_items (int m)
 Set the minimum number of output items this block can produce during a call to work.
int max_noutput_items ()
 Return the maximum number of output items this block will handle during a call to work.
void set_max_noutput_items (int m)
 Set the maximum number of output items this block will handle during a call to work.
void unset_max_noutput_items ()
 Clear the switch for using the max_noutput_items value of this block.
bool is_set_max_noutput_items ()
 Ask the block if the flag is or is not set to use the internal value of max_noutput_items during a call to work.
void expand_minmax_buffer (int port)
long max_output_buffer (size_t i)
 Returns max buffer size on output port i.
void set_max_output_buffer (long max_output_buffer)
 Sets max buffer size on all output ports.
void set_max_output_buffer (int port, long max_output_buffer)
 Sets max buffer size on output port port.
long min_output_buffer (size_t i)
 Returns min buffer size on output port i.
void set_min_output_buffer (long min_output_buffer)
 Sets min buffer size on all output ports.
void set_min_output_buffer (int port, long min_output_buffer)
 Sets min buffer size on output port port.
float pc_noutput_items ()
 Gets average noutput_items performance counter.
float pc_noutput_items_var ()
 Gets variance of noutput_items performance counter.
float pc_nproduced ()
 Gets average num items produced performance counter.
float pc_nproduced_var ()
 Gets variance of num items produced performance counter.
float pc_input_buffers_full (int which)
 Gets average fullness of which input buffer.
float pc_input_buffers_full_var (int which)
 Gets variance of fullness of which input buffer.
std::vector< float > pc_input_buffers_full ()
 Gets average fullness of all input buffers.
std::vector< float > pc_input_buffers_full_var ()
 Gets variance of fullness of all input buffers.
float pc_output_buffers_full (int which)
 Gets average fullness of which input buffer.
float pc_output_buffers_full_var (int which)
 Gets variance of fullness of which input buffer.
std::vector< float > pc_output_buffers_full ()
 Gets average fullness of all output buffers.
std::vector< float > pc_output_buffers_full_var ()
 Gets variance of fullness of all output buffers.
float pc_work_time ()
 Gets average clock cycles spent in work.
float pc_work_time_var ()
 Gets average clock cycles spent in work.
void reset_perf_counters ()
 Resets the performance counters.
void set_processor_affinity (const std::vector< unsigned int > &mask)
 Set the thread's affinity to processor core n.
void unset_processor_affinity ()
 Remove processor affinity to a specific core.
std::vector< unsigned int > processor_affinity ()
 Get the current processor affinity.
gr_block_detail_sptr detail () const
void set_detail (gr_block_detail_sptr detail)
- Public Member Functions inherited from gr_basic_block
virtual ~gr_basic_block ()
long unique_id () const
long symbolic_id () const
std::string name () const
std::string symbol_name () const
gr_io_signature_sptr input_signature () const
gr_io_signature_sptr output_signature () const
gr_basic_block_sptr to_basic_block ()
bool alias_set ()
std::string alias ()
pmt::pmt_t alias_pmt ()
void set_block_alias (std::string name)
void message_port_register_in (pmt::pmt_t port_id)
void message_port_register_out (pmt::pmt_t port_id)
void message_port_pub (pmt::pmt_t port_id, pmt::pmt_t msg)
void message_port_sub (pmt::pmt_t port_id, pmt::pmt_t target)
void message_port_unsub (pmt::pmt_t port_id, pmt::pmt_t target)
virtual bool message_port_is_hier (pmt::pmt_t port_id)
virtual bool message_port_is_hier_in (pmt::pmt_t port_id)
virtual bool message_port_is_hier_out (pmt::pmt_t port_id)
pmt::pmt_t message_ports_in ()
 Get input message port names.
pmt::pmt_t message_ports_out ()
 Get output message port names.
void _post (pmt::pmt_t which_port, pmt::pmt_t msg)
bool empty_p (pmt::pmt_t which_port)
 is the queue empty?
bool empty_p ()
size_t nmsgs (pmt::pmt_t which_port)
 How many messages in the queue?
void insert_tail (pmt::pmt_t which_port, pmt::pmt_t msg)
pmt::pmt_t delete_head_nowait (pmt::pmt_t which_port)
pmt::pmt_t delete_head_blocking (pmt::pmt_t which_port)
msg_queue_t::iterator get_iterator (pmt::pmt_t which_port)
void erase_msg (pmt::pmt_t which_port, msg_queue_t::iterator it)
virtual bool has_msg_port (pmt::pmt_t which_port)
virtual bool check_topology (int ninputs, int noutputs)
 Confirm that ninputs and noutputs is an acceptable combination.
template<typename T >
void set_msg_handler (pmt::pmt_t which_port, T msg_handler)
 Set the callback that is fired when messages are available.
- Public Member Functions inherited from gr_msg_accepter
 gr_msg_accepter ()
 ~gr_msg_accepter ()
void post (pmt::pmt_t which_port, pmt::pmt_t msg)
 send msg to msg_accepter on port which_port
- Public Member Functions inherited from gruel::msg_accepter
 msg_accepter ()
virtual ~msg_accepter ()
- Public Member Functions inherited from gri_control_loop
 gri_control_loop (float loop_bw, float max_freq, float min_freq)
virtual ~gri_control_loop ()
void update_gains ()
 update the system gains from the loop bandwidth and damping factor
void advance_loop (float error)
 update the system gains from the loop bandwidth and damping factor
void phase_wrap ()
 Keep the phase between -2pi and 2pi.
void frequency_limit ()
 Keep the frequency between d_min_freq and d_max_freq.
void set_loop_bandwidth (float bw)
 Set the loop bandwidth.
void set_damping_factor (float df)
 Set the loop damping factor.
void set_alpha (float alpha)
 Set the loop gain alpha.
void set_beta (float beta)
 Set the loop gain beta.
void set_frequency (float freq)
 Set the control loop's frequency.
void set_phase (float phase)
 Set the control loop's phase.
void set_max_freq (float freq)
 Set the control loop's maximum frequency.
void set_min_freq (float freq)
 Set the control loop's minimum frequency.
float get_loop_bandwidth () const
 Returns the loop bandwidth.
float get_damping_factor () const
 Returns the loop damping factor.
float get_alpha () const
 Returns the loop gain alpha.
float get_beta () const
 Returns the loop gain beta.
float get_frequency () const
 Get the control loop's frequency estimate.
float get_phase () const
 Get the control loop's phase estimate.
float get_max_freq () const
 Get the control loop's maximum frequency.
float get_min_freq () const
 Get the control loop's minimum frequency.

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 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.
- Protected Member Functions inherited from gr_block
 gr_block (void)
 gr_block (const std::string &name, gr_io_signature_sptr input_signature, gr_io_signature_sptr output_signature)
void set_fixed_rate (bool fixed_rate)
void add_item_tag (unsigned int which_output, uint64_t abs_offset, const pmt::pmt_t &key, const pmt::pmt_t &value, const pmt::pmt_t &srcid=pmt::PMT_F)
 Adds a new tag onto the given output buffer.
void add_item_tag (unsigned int which_output, const gr_tag_t &tag)
 Adds a new tag onto the given output buffer.
void remove_item_tag (unsigned int which_input, uint64_t abs_offset, const pmt::pmt_t &key, const pmt::pmt_t &value, const pmt::pmt_t &srcid=pmt::PMT_F)
 Removes a tag from the given input buffer.
void remove_item_tag (unsigned int which_input, const gr_tag_t &tag)
 Removes a tag from the given input buffer.
void get_tags_in_range (std::vector< gr_tag_t > &v, unsigned int which_input, uint64_t abs_start, uint64_t abs_end)
 Given a [start,end), returns a vector of all tags in the range.
void get_tags_in_range (std::vector< gr_tag_t > &v, unsigned int which_input, uint64_t abs_start, uint64_t abs_end, const pmt::pmt_t &key)
 Given a [start,end), returns a vector of all tags in the range with a given key.
- Protected Member Functions inherited from gr_basic_block
 gr_basic_block (void)
 gr_basic_block (const std::string &name, gr_io_signature_sptr input_signature, gr_io_signature_sptr output_signature)
 Protected constructor prevents instantiation by non-derived classes.
void set_input_signature (gr_io_signature_sptr iosig)
 may only be called during constructor
void set_output_signature (gr_io_signature_sptr iosig)
 may only be called during constructor
void set_color (vcolor color)
 Allow the flowgraph to set for sorting and partitioning.
vcolor color () const
bool has_msg_handler (pmt::pmt_t which_port)
 Tests if there is a handler attached to port which_port.
virtual void dispatch_msg (pmt::pmt_t which_port, pmt::pmt_t msg)

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)

Additional Inherited Members

- Public Types inherited from gr_block
enum  { WORK_CALLED_PRODUCE = -2, WORK_DONE = -1 }
 Magic return values from general_work. More...
enum  tag_propagation_policy_t { TPP_DONT = 0, TPP_ALL_TO_ALL = 1, TPP_ONE_TO_ONE = 2 }
- Protected Attributes inherited from gr_block
std::vector< long > d_max_output_buffer
std::vector< long > d_min_output_buffer
gruel::mutex d_setlock
- Protected Attributes inherited from gr_basic_block
std::string d_name
gr_io_signature_sptr d_input_signature
gr_io_signature_sptr d_output_signature
long d_unique_id
long d_symbolic_id
std::string d_symbol_name
std::string d_symbol_alias
vcolor d_color
msg_queue_map_t msg_queue
pmt::pmt_t message_subscribers
- Protected Attributes inherited from gri_control_loop
float d_phase
float d_freq
float d_max_freq
float d_min_freq
float d_damping
float d_loop_bw
float d_alpha
float d_beta

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

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 M-PSK symbols.

Parameters:
Mmodulation order of the M-PSK modulation
thetaany constant phase rotation from the real axis of the constellation
loop_bwLoop bandwidth to set gains of phase/freq tracking loop
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

unsigned int digital_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 digital_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 digital_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 digital_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 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

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.

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.

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 digital_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 digital_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 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.


Friends And Related Function Documentation

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

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