commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r7369 - gnuradio/branches/developers/trondeau/receiver


From: trondeau
Subject: [Commit-gnuradio] r7369 - gnuradio/branches/developers/trondeau/receiver/gnuradio-core/src/lib/general
Date: Sun, 6 Jan 2008 16:24:13 -0700 (MST)

Author: trondeau
Date: 2008-01-06 16:24:12 -0700 (Sun, 06 Jan 2008)
New Revision: 7369

Modified:
   
gnuradio/branches/developers/trondeau/receiver/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
   
gnuradio/branches/developers/trondeau/receiver/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.h
Log:
Implementing branchless clipping in MPSK receiver and moving towards optimized 
BPSK and QPSK slicers. Tests show huge performance improvements for BPSK and 
QPSK.

Modified: 
gnuradio/branches/developers/trondeau/receiver/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
===================================================================
--- 
gnuradio/branches/developers/trondeau/receiver/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
 2008-01-06 23:22:20 UTC (rev 7368)
+++ 
gnuradio/branches/developers/trondeau/receiver/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.cc
 2008-01-06 23:24:12 UTC (rev 7369)
@@ -91,12 +91,12 @@
   switch(d_M) {
   case 2:  // optimized algorithms for BPSK
     d_phase_error_detector = 
&gr_mpsk_receiver_cc::phase_error_detector_generic; //bpsk;
-    d_decision = &gr_mpsk_receiver_cc::decision_generic; //bpsk;
+    d_decision = &gr_mpsk_receiver_cc::decision_bpsk;
     break;
 
   case 4: // optimized algorithms for QPSK
     d_phase_error_detector = 
&gr_mpsk_receiver_cc::phase_error_detector_generic; //qpsk;
-    d_decision = &gr_mpsk_receiver_cc::decision_generic; //qpsk;
+    d_decision = &gr_mpsk_receiver_cc::decision_qpsk;
     break;
 
   default: // generic algorithms for any M (power of 2?) but not pretty
@@ -145,32 +145,20 @@
   return -arg(sample*conj(d_constellation[d_current_const_point]));
 }
 
-// FIXME add these back in an test difference in performance
 unsigned int
 gr_mpsk_receiver_cc::decision_bpsk(gr_complex sample) const
 {
-  unsigned int index = 0;
-
-  // Implements a 1-demensional slicer
-  if(sample.real() > 0)
-    index = 1;
-  return index;
+  return (gr_branchless_binary_slicer(sample.real()) ^ 1);
+  //return gr_binary_slicer(sample.real()) ^ 1;
 }
 
-// FIXME add these back in an test difference in performance
 unsigned int
 gr_mpsk_receiver_cc::decision_qpsk(gr_complex sample) const
 {
-  unsigned int index = 0;
+  unsigned int index;
 
-  // Implements a simple slicer function
-  if((sample.real() < 0) && (sample.imag() > 0))
-    index = 1;
-  else if((sample.real() < 0) && (sample.imag() < 0))
-    index = 2;
-  else
-    index = 3;
-  return index;
+  index = gr_quad_0deg_slicer(sample);
+  return index ^ ((index & 0x2) >> 0x1);  // switch 2's and 3's to fit 
constellation
 }
 
 unsigned int
@@ -211,11 +199,8 @@
   d_phase += d_freq;  // increment the phase based on the frequency of the 
rotation
 
   // Keep phase clamped and not walk to infinity
-  while(d_phase>M_TWOPI)
-    d_phase -= M_TWOPI;
-  while(d_phase<-M_TWOPI)
-    d_phase += M_TWOPI;
-
+  d_phase = gr_branchless_clip(d_phase, M_TWOPI);
+  
   nco = gr_expj(d_phase+d_theta);   // get the NCO value for derotating the 
current sample
   sample = nco*symbol;      // get the downconverted symbol
   
@@ -247,20 +232,10 @@
   y = (d_p_0T - d_p_2T) * conj(d_c_1T);
   u = y - x;
   mm_error = u.real();   // the error signal is in the real part
-  
-  // limit mm_val
-  if (mm_error > 1.0)
-    mm_error = 1.0;
-  else if (mm_error < -1.0)
-    mm_error = -1.0;
-  
+  mm_error = gr_branchless_clip(mm_error, 1.0); // limit mm_val
+    
   d_omega = d_omega + d_gain_omega * mm_error;  // update omega based on loop 
error
-
-  // make sure we don't walk away
-  if (d_omega > d_max_omega)
-    d_omega = d_max_omega;
-  else if (d_omega < d_min_omega)
-    d_omega = d_min_omega;
+  d_omega = d_omega_mid + gr_branchless_clip(d_omega-d_omega_mid, 
d_omega_rel);   // make sure we don't walk away
   
   d_mu += d_omega + d_gain_mu * mm_error;   // update mu based on loop error
   
@@ -280,26 +255,17 @@
   // Make phase and frequency corrections based on sampled value
   phase_error = (*this.*d_phase_error_detector)(sample);
 
-  if (phase_error > 1)
-    phase_error = 1;
-  else if (phase_error < -1)
-    phase_error = -1;  
-
+  phase_error = gr_branchless_clip(phase_error, 1.0);
+    
   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;
+  d_phase = gr_branchless_clip(d_phase, M_TWOPI);
   
   // Limit the frequency range
-  if (d_freq > d_max_freq)
-    d_freq = d_max_freq;
-  else if (d_freq < d_min_freq)
-    d_freq = d_min_freq;
-
+  d_freq = gr_branchless_clip(d_freq, d_max_freq);
+  
 #if VERBOSE_COSTAS
   printf("cl: phase_error: %f  phase: %f  freq: %f  sample: %f+j%f  
constellation: %f+j%f\n",
         phase_error, d_phase, d_freq, sample.real(), sample.imag(), 
@@ -318,7 +284,6 @@
 
   int i=0, o=0;
 
-  //while(i < ninput_items[0]) {    
   while((o < noutput_items) && (i < ninput_items[0])) {
     while((d_mu > 1) && (i < ninput_items[0]))  {
       mm_sampler(in[i]);   // puts symbols into a buffer and adjusts d_mu

Modified: 
gnuradio/branches/developers/trondeau/receiver/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.h
===================================================================
--- 
gnuradio/branches/developers/trondeau/receiver/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.h
  2008-01-06 23:22:20 UTC (rev 7368)
+++ 
gnuradio/branches/developers/trondeau/receiver/gnuradio-core/src/lib/general/gr_mpsk_receiver_cc.h
  2008-01-06 23:24:12 UTC (rev 7369)
@@ -100,6 +100,7 @@
     d_omega = omega;
     d_min_omega = omega*(1.0 - d_omega_rel);
     d_max_omega = omega*(1.0 + d_omega_rel);
+    d_omega_mid = 0.5*(d_min_omega+d_max_omega);
   }
 
   //! (M&M) Sets value for mu gain factor
@@ -275,7 +276,7 @@
 
   // Members related to symbol timing
   float d_mu, d_gain_mu;
-  float d_omega, d_gain_omega, d_omega_rel, d_max_omega, d_min_omega;
+  float d_omega, d_gain_omega, d_omega_rel, d_max_omega, d_min_omega, 
d_omega_mid;
   gr_complex d_p_2T, d_p_1T, d_p_0T;
   gr_complex d_c_2T, d_c_1T, d_c_0T;
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]