Imported Upstream version 3.2.2
[debian/gnuradio] / gnuradio-core / src / lib / general / gr_costas_loop_cc.cc
index a119bd6e51a789a9b914e3ad7ce9b29d0c256d88..4e0f7e067352941753b7d760280d5305fe7478f9 100644 (file)
@@ -85,6 +85,18 @@ gr_costas_loop_cc::phase_detector_2(gr_complex sample) const
   return (sample.real()*sample.imag());
 }
 
+void
+gr_costas_loop_cc::set_alpha(float alpha)
+{
+  d_alpha = alpha;
+}
+
+void
+gr_costas_loop_cc::set_beta(float beta)
+{
+  d_beta = beta;
+}
+
 int
 gr_costas_loop_cc::work (int noutput_items,
                         gr_vector_const_void_star &input_items,
@@ -98,33 +110,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;