From 35fd5072f4a1eba6d02e3c4615dfde33783f876f Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sat, 27 Aug 2011 16:30:56 -0400
Subject: digital: made digital constellation receiver a child of the second
 order control loop class and cleaned up the interface.

---
 .../lib/digital_constellation_receiver_cb.cc       | 145 +--------------------
 1 file changed, 7 insertions(+), 138 deletions(-)

(limited to 'gr-digital/lib/digital_constellation_receiver_cb.cc')

diff --git a/gr-digital/lib/digital_constellation_receiver_cb.cc b/gr-digital/lib/digital_constellation_receiver_cb.cc
index e2b6bf1d80..b9239962a7 100644
--- a/gr-digital/lib/digital_constellation_receiver_cb.cc
+++ b/gr-digital/lib/digital_constellation_receiver_cb.cc
@@ -54,153 +54,20 @@ digital_constellation_receiver_cb::digital_constellation_receiver_cb (digital_co
   : gr_block ("constellation_receiver_cb",
 	      gr_make_io_signature (1, 1, sizeof (gr_complex)),
 	      gr_make_io_signaturev (1, 4, iosig)),
-    d_freq(0), d_max_freq(fmax), d_min_freq(fmin), d_phase(0),
+    gri_control_loop(loop_bw, fmax, fmin),
     d_constellation(constellation), 
     d_current_const_point(0)
 {
   if (d_constellation->dimensionality() != 1)
     throw std::runtime_error ("This receiver only works with constellations of dimension 1.");
-
-  // Set the damping factor for a critically damped system
-  d_damping = sqrtf(2.0f)/2.0f;
-
-  // Set the bandwidth, which will then call update_gains()
-  set_loop_bandwidth(loop_bw);
-}
-
-
-/*******************************************************************
-    SET FUNCTIONS
-*******************************************************************/
-
-void
-digital_constellation_receiver_cb::set_loop_bandwidth(float bw) 
-{
-  if(bw < 0) {
-    throw std::out_of_range ("digital_constellation_receiver_cb: invalid bandwidth. Must be >= 0.");
-  }
-  
-  d_loop_bw = bw;
-  update_gains();
-}
-
-void
-digital_constellation_receiver_cb::set_damping_factor(float df) 
-{
-  if(df < 0 || df > 1.0) {
-    throw std::out_of_range ("digital_constellation_receiver_cb: invalid damping factor. Must be in [0,1].");
-  }
-  
-  d_damping = df;
-  update_gains();
-}
-
-void
-digital_constellation_receiver_cb::set_alpha(float alpha)
-{
-  if(alpha < 0 || alpha > 1.0) {
-    throw std::out_of_range ("digital_constellation_receiver_cb: invalid alpha. Must be in [0,1].");
-  }
-  d_alpha = alpha;
-}
-
-void
-digital_constellation_receiver_cb::set_beta(float beta)
-{
-  if(beta < 0 || beta > 1.0) {
-    throw std::out_of_range ("digital_constellation_receiver_cb: invalid beta. Must be in [0,1].");
-  }
-  d_beta = beta;
-}
-
-void
-digital_constellation_receiver_cb::set_frequency(float freq)
-{
-  if(freq > d_max_freq)
-    d_freq = d_min_freq;
-  else if(freq < d_min_freq)
-    d_freq = d_max_freq;
-  else
-    d_freq = freq;
-}
-
-void
-digital_constellation_receiver_cb::set_phase(float phase)
-{
-  d_phase = phase;
-  while(d_phase>M_TWOPI)
-    d_phase -= M_TWOPI;
-  while(d_phase<-M_TWOPI)
-    d_phase += M_TWOPI;
-}
-
-   
-/*******************************************************************
-    GET FUNCTIONS
-*******************************************************************/
-
-
-float
-digital_constellation_receiver_cb::get_loop_bandwidth() const
-{
-  return d_loop_bw;
-}
-
-float
-digital_constellation_receiver_cb::get_damping_factor() const
-{
-  return d_damping;
-}
-
-float
-digital_constellation_receiver_cb::get_alpha() const
-{
-  return d_alpha;
-}
-
-float
-digital_constellation_receiver_cb::get_beta() const
-{
-  return d_beta;
-}
-
-float
-digital_constellation_receiver_cb::get_frequency() const
-{
-  return d_freq;
-}
-
-float
-digital_constellation_receiver_cb::get_phase() const
-{
-  return d_phase;
-}
-
-/*******************************************************************
-*******************************************************************/
-
-void
-digital_constellation_receiver_cb::update_gains()
-{
-  float denom = (1.0 + 2.0*d_damping*d_loop_bw + d_loop_bw*d_loop_bw);
-  d_alpha = (4*d_damping*d_loop_bw) / denom;
-  d_beta = (4*d_loop_bw*d_loop_bw) / denom;
 }
 
 void
 digital_constellation_receiver_cb::phase_error_tracking(float phase_error)
 {
-  d_freq += d_beta*phase_error;             // adjust frequency based on error
-  d_phase += d_freq + d_alpha*phase_error;  // adjust phase based on error
-
-  // Make sure we stay within +-2pi
-  while(d_phase > M_TWOPI)
-    d_phase -= M_TWOPI;
-  while(d_phase < -M_TWOPI)
-    d_phase += M_TWOPI;
-  
-  // Limit the frequency range
-  d_freq = gr_branchless_clip(d_freq, d_max_freq);
+  advance_loop(phase_error);
+  phase_wrap();
+  frequency_limit();
   
 #if VERBOSE_COSTAS
   printf("cl: phase_error: %f  phase: %f  freq: %f  sample: %f+j%f  constellation: %f+j%f\n",
@@ -236,10 +103,12 @@ digital_constellation_receiver_cb::general_work (int noutput_items,
     sample = in[i];
     nco = gr_expj(d_phase);   // get the NCO value for derotating the current sample
     sample = nco*sample;      // get the downconverted symbol
+
     sym_value = d_constellation->decision_maker_pe(&sample, &phase_error);
-    //    phase_error = -arg(sample*conj(d_constellation->points()[sym_value]));
     phase_error_tracking(phase_error);  // corrects phase and frequency offsets
+
     out[i] = sym_value;
+
     if(output_items.size() == 4) {
       out_err[i] = phase_error;
       out_phase[i] = d_phase;
-- 
cgit v1.2.3