attempting to use branchless clipping to prevent pipeline dumping, fabs needs to...
authorn4hy <n4hy@221aa14e-8319-0410-a670-987f0aec2ac5>
Thu, 8 Nov 2007 22:43:26 +0000 (22:43 +0000)
committern4hy <n4hy@221aa14e-8319-0410-a670-987f0aec2ac5>
Thu, 8 Nov 2007 22:43:26 +0000 (22:43 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@6840 221aa14e-8319-0410-a670-987f0aec2ac5

gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.cc
gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.h
gnuradio-core/src/lib/general/gr_clock_recovery_mm_ff.cc
gnuradio-core/src/lib/general/gr_clock_recovery_mm_ff.h
gnuradio-core/src/lib/general/gr_math.h

index 6761392e67929c1de98b760f04c765ebcff32929..df78651666bffbe90388367304b157882b12b5ec 100644 (file)
@@ -151,17 +151,22 @@ gr_clock_recovery_mm_cc::general_work (int noutput_items,
       out[oo++] = d_p_0T;
       
       // limit mm_val
+#if 0
       if (mm_val > 1.0)
        mm_val = 1.0;
       else if (mm_val < -1.0)
        mm_val = -1.0;
-      
+#endif
+      gr_branchless_clip(mm_val,1.0);
       d_omega = d_omega + d_gain_omega * mm_val;
+
+#if 0
       if (d_omega > d_max_omega)
        d_omega = d_max_omega;
       else if (d_omega < d_min_omega)
        d_omega = d_min_omega;
-      
+#endif
+      d_omega = 1.0+gr_branchless_clip(d_omega,d_omega_relative_limit);
       d_mu = d_mu + d_omega + d_gain_mu * mm_val;
       ii += (int)floor(d_mu);
       d_mu -= floor(d_mu);
index 453bafbe1c02c6302bd81242526712631a0552b2..fc8447f80da20a0fb6db489a29f1deea2ba5fe15 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <gr_block.h>
 #include <gr_complex.h>
+#include <gr_math.h>
 
 class gri_mmse_fir_interpolator_cc;
 
index d27ab9d65e52f8bdc0cf4c9dda40456b27d98ca3..e77b5e4a0237187c163d774c359bddcb966a7938 100644 (file)
@@ -118,11 +118,13 @@ gr_clock_recovery_mm_ff::general_work (int noutput_items,
     d_last_sample = out[oo];
 
     d_omega = d_omega + d_gain_omega * mm_val;
+#if 0
     if (d_omega > d_max_omega)
       d_omega = d_max_omega;
     else if (d_omega < d_min_omega)
       d_omega = d_min_omega;
-
+#endif
+    d_omega = gr_branchless_clip(d_omega-d_omega_mid,d_omega_relative_limit);
     d_mu = d_mu + d_omega + d_gain_mu * mm_val;
 
     ii += (int) floor(d_mu);
index 87823c44e3cf9985b6c74de1c8c5d7bb8bfa0c7d..a121fe8213cb3d06db910d8780a7a0693d96d92d 100644 (file)
@@ -24,6 +24,7 @@
 #define        INCLUDED_GR_CLOCK_RECOVERY_MM_FF_H
 
 #include <gr_block.h>
+#include <gr_math.h>
 #include <stdio.h>
 
 class gri_mmse_fir_interpolator;
@@ -67,6 +68,7 @@ class gr_clock_recovery_mm_ff : public gr_block
     d_omega = omega;
     d_min_omega = omega*(1.0 - d_omega_relative_limit);
     d_max_omega = omega*(1.0 + d_omega_relative_limit);
+    d_omega_mid = 0.5*(d_min_omega+d_max_omega);
   }
 
 protected:
@@ -76,7 +78,8 @@ protected:
  private:
   float                        d_mu;           // fractional sample position [0.0, 1.0]
   float                        d_omega;        // nominal frequency
-  float                                d_min_omega;    // minimum allowed omega
+  float                                d_min_omega;    // minimum allowed omega 
+  float                         d_omega_mid;   // average omega
   float                                d_max_omega;    // maximum allowed omega
   float                         d_gain_omega;  // gain for adjusting omega
   float                         d_gain_mu;     // gain for adjusting mu
index 439e5f4b94dfc0c45cb4e4843ec38041bcb8a2ba..54756065048febfd98c61669ae4024e6f59488af 100644 (file)
@@ -64,4 +64,13 @@ static inline float gr_fast_atan2f(gr_complex z)
   return gr_fast_atan2f(z.imag(), z.real()); 
 }
 
+static inline float gr_branchless_clip(float x, float clip)
+{
+  float x1 = fabs(x+clip);
+  float x2 = fabs(x-clip);
+  x1 -= x2;
+  return 0.5*x1;
+}
+
+
 #endif /* _GR_MATH_H_ */