commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r4192 - gnuradio/branches/developers/trondeau/digital-


From: trondeau
Subject: [Commit-gnuradio] r4192 - gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general
Date: Tue, 26 Dec 2006 09:28:27 -0700 (MST)

Author: trondeau
Date: 2006-12-26 09:28:27 -0700 (Tue, 26 Dec 2006)
New Revision: 4192

Modified:
   
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.cc
   
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.h
Log:
ugly fix for speed improvement in M&M block

Modified: 
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.cc
===================================================================
--- 
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.cc
  2006-12-25 23:44:16 UTC (rev 4191)
+++ 
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.cc
  2006-12-26 16:28:27 UTC (rev 4192)
@@ -133,47 +133,90 @@
   float mm_val=0;
   gr_complex u, x, y;
 
-  while(oo < noutput_items && ii < ni) {
-    d_p_2T = d_p_1T;
-    d_p_1T = d_p_0T;
-    d_p_0T = d_interp->interpolate (&in[ii], d_mu);
+  // This loop writes the error to the second output, if it exists
+  if (write_foptr) {
+    while(oo < noutput_items && ii < ni) {
+      d_p_2T = d_p_1T;
+      d_p_1T = d_p_0T;
+      d_p_0T = d_interp->interpolate (&in[ii], d_mu);
 
-    d_c_2T = d_c_1T;
-    d_c_1T = d_c_0T;
-    d_c_0T = slicer_0deg(d_p_0T);
-
-    x = (d_c_0T - d_c_2T) * conj(d_p_1T);
-    y = (d_p_0T - d_p_2T) * conj(d_c_1T);
-    u = y - x;
-    mm_val = u.real();
-    out[oo++] = d_p_0T;
-
-    // limit mm_val
-    if (mm_val > 1.0)
-      mm_val = 1.0;
-    else if (mm_val < -1.0)
-      mm_val = -1.0;
-
-    d_omega = d_omega + d_gain_omega * mm_val;
-    if (d_omega > d_max_omega)
-      d_omega = d_max_omega;
-    else if (d_omega < d_min_omega)
-      d_omega = d_min_omega;
-
-    d_mu = d_mu + d_omega + d_gain_mu * mm_val;
-    ii += (int)floor(d_mu);
-    d_mu -= floor(d_mu);
-
-    if(d_verbose) {
+      d_c_2T = d_c_1T;
+      d_c_1T = d_c_0T;
+      d_c_0T = slicer_0deg(d_p_0T);
+      
+      x = (d_c_0T - d_c_2T) * conj(d_p_1T);
+      y = (d_p_0T - d_p_2T) * conj(d_c_1T);
+      u = y - x;
+      mm_val = u.real();
+      out[oo++] = d_p_0T;
+      
+      // limit mm_val
+      if (mm_val > 1.0)
+       mm_val = 1.0;
+      else if (mm_val < -1.0)
+       mm_val = -1.0;
+      
+      d_omega = d_omega + d_gain_omega * mm_val;
+      if (d_omega > d_max_omega)
+       d_omega = d_max_omega;
+      else if (d_omega < d_min_omega)
+       d_omega = d_min_omega;
+      
+      d_mu = d_mu + d_omega + d_gain_mu * mm_val;
+      ii += (int)floor(d_mu);
+      d_mu -= floor(d_mu);
+      
+      #if 0
       printf("%f\t%f\n", d_omega, d_mu);
+      #endif
+      
+      // write the error signal to the second output
+      foptr[oo-1] = gr_complex(d_mu,0);
+      
+      if (ii < 0)      // clamp it.  This should only happen with bogus input
+       ii = 0;
     }
+  }
+  // This loop does not write to the second output (ugly, but faster)
+  else {
+    while(oo < noutput_items && ii < ni) {
+      d_p_2T = d_p_1T;
+      d_p_1T = d_p_0T;
+      d_p_0T = d_interp->interpolate (&in[ii], d_mu);
 
-    // write the error signal to the second output
-    if (write_foptr)
-      foptr[oo-1] = gr_complex(d_mu,0);
-
-    if (ii < 0)        // clamp it.  This should only happen with bogus input
-      ii = 0;
+      d_c_2T = d_c_1T;
+      d_c_1T = d_c_0T;
+      d_c_0T = slicer_0deg(d_p_0T);
+      
+      x = (d_c_0T - d_c_2T) * conj(d_p_1T);
+      y = (d_p_0T - d_p_2T) * conj(d_c_1T);
+      u = y - x;
+      mm_val = u.real();
+      out[oo++] = d_p_0T;
+      
+      // limit mm_val
+      if (mm_val > 1.0)
+       mm_val = 1.0;
+      else if (mm_val < -1.0)
+       mm_val = -1.0;
+      
+      d_omega = d_omega + d_gain_omega * mm_val;
+      if (d_omega > d_max_omega)
+       d_omega = d_max_omega;
+      else if (d_omega < d_min_omega)
+       d_omega = d_min_omega;
+      
+      d_mu = d_mu + d_omega + d_gain_mu * mm_val;
+      ii += (int)floor(d_mu);
+      d_mu -= floor(d_mu);
+      
+      if(d_verbose) {
+       printf("%f\t%f\n", d_omega, d_mu);
+      }
+            
+      if (ii < 0)      // clamp it.  This should only happen with bogus input
+       ii = 0;
+    }
   }
 
   if (ii > 0){

Modified: 
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.h
===================================================================
--- 
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.h
   2006-12-25 23:44:16 UTC (rev 4191)
+++ 
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.h
   2006-12-26 16:28:27 UTC (rev 4192)
@@ -41,10 +41,11 @@
  * \ingroup block
  *
  * This implements the Mueller and Müller (M&M) discrete-time error-tracking 
synchronizer.
- *
- * See "Digital Communication Receivers: Synchronization, Channel
- * Estimation and Signal Processing" by Heinrich Meyr, Marc Moeneclaey, & 
Stefan Fechtel.
- * ISBN 0-471-50275-8.
+ * The complex version here is based on:
+ * Modified Mueller and Muller clock recovery circuit
+ * Based:
+ *    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.
  */
 class gr_clock_recovery_mm_cc : public gr_block
 {





reply via email to

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