Two loop gr_costas_loop removing one if statement per sample
authorn4hy <n4hy@221aa14e-8319-0410-a670-987f0aec2ac5>
Thu, 14 Dec 2006 05:20:15 +0000 (05:20 +0000)
committern4hy <n4hy@221aa14e-8319-0410-a670-987f0aec2ac5>
Thu, 14 Dec 2006 05:20:15 +0000 (05:20 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@4080 221aa14e-8319-0410-a670-987f0aec2ac5

gnuradio-core/src/lib/general/gr_costas_loop_cc.cc

index f06be47eba1cbdb4cc06ef83a9acab1688222b2a..61d58ebe5fa4f3b200832704cfc867f0ed8e7de6 100644 (file)
@@ -98,33 +98,58 @@ gr_costas_loop_cc::work (int noutput_items,
 
   float error;
   gr_complex nco_out;
-
-  for (int i = 0; i < noutput_items; i++){
-    nco_out = gr_expj(-d_phase);
-    optr[i] = iptr[i] * nco_out;
-    
-    error = (*this.*d_phase_detector)(optr[i]);
-    if (error > 1)
-      error = 1;
-    else if (error < -1)
-      error = -1;
-    
-    d_freq = d_freq + d_beta * error;
-    d_phase = d_phase + d_freq + d_alpha * error;
-
-    while(d_phase>M_TWOPI)
-      d_phase -= M_TWOPI;
-    while(d_phase<-M_TWOPI)
-      d_phase += M_TWOPI;
-    
-    if (d_freq > d_max_freq)
-      d_freq = d_max_freq;
-    else if (d_freq < d_min_freq)
-      d_freq = d_min_freq;
-    
-    if (write_foptr){
+  
+  if (write_foptr) {
+
+    for (int i = 0; i < noutput_items; i++){
+      nco_out = gr_expj(-d_phase);
+      optr[i] = iptr[i] * nco_out;
+      
+      error = (*this.*d_phase_detector)(optr[i]);
+      if (error > 1)
+       error = 1;
+      else if (error < -1)
+       error = -1;
+      
+      d_freq = d_freq + d_beta * error;
+      d_phase = d_phase + d_freq + d_alpha * error;
+      
+      while(d_phase>M_TWOPI)
+       d_phase -= M_TWOPI;
+      while(d_phase<-M_TWOPI)
+       d_phase += M_TWOPI;
+      
+      if (d_freq > d_max_freq)
+       d_freq = d_max_freq;
+      else if (d_freq < d_min_freq)
+       d_freq = d_min_freq;
+      
       foptr[i] = gr_complex(d_freq,0);
-      //foptr[i] = gr_complex(error, 0);
+    } 
+  } else {
+    for (int i = 0; i < noutput_items; i++){
+      nco_out = gr_expj(-d_phase);
+      optr[i] = iptr[i] * nco_out;
+      
+      error = (*this.*d_phase_detector)(optr[i]);
+      if (error > 1)
+       error = 1;
+      else if (error < -1)
+       error = -1;
+      
+      d_freq = d_freq + d_beta * error;
+      d_phase = d_phase + d_freq + d_alpha * error;
+      
+      while(d_phase>M_TWOPI)
+       d_phase -= M_TWOPI;
+      while(d_phase<-M_TWOPI)
+       d_phase += M_TWOPI;
+      
+      if (d_freq > d_max_freq)
+       d_freq = d_max_freq;
+      else if (d_freq < d_min_freq)
+       d_freq = d_min_freq;
+      
     }
   }
   return noutput_items;