Working fractional sample rates in clock recovery algorithm.
authorTom <trondeau@vt.edu>
Fri, 9 Oct 2009 20:57:52 +0000 (13:57 -0700)
committerTom <trondeau@vt.edu>
Fri, 9 Oct 2009 20:57:52 +0000 (13:57 -0700)
gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc

index 56ad24ffcf64ed6814e61c34a183da2291d2361f..fcd36860139d8f874368b3d78a81a8a7fefc9030 100644 (file)
@@ -242,6 +242,14 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
 
   // produce output as long as we can and there are enough input samples
   while((i < noutput_items) && (count < nrequired)) {
+    out[i] = d_filters[d_filtnum]->filter(&in[count]);
+    gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]);
+    error_r  = out[i].real() * diff.real();
+    error_i  = out[i].imag() * diff.imag();
+    error = error_i + error_r;
+
+    d_k = d_k + d_alpha*error + d_rate;
+    d_rate = d_rate + d_beta*error;
     d_filtnum = (int)floor(d_k);
 
     // Keep the current filter number in [0, d_nfilters]
@@ -250,29 +258,23 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     while(d_filtnum >= d_nfilters) {
       d_k -= d_nfilters;
       d_filtnum -= d_nfilters;
-      d_sample_num += 1.0;
+      //d_sample_num += 1.0;
+      count += 1;
     }
     while(d_filtnum < 0) {
       d_k += d_nfilters;
       d_filtnum += d_nfilters;
-      d_sample_num -= 1.0;
+      //d_sample_num -= 1.0;
+      count -= 1;
     }
     
-    out[i] = d_filters[d_filtnum]->filter(&in[count]);
-    gr_complex diff = d_diff_filters[d_filtnum]->filter(&in[count]);
-    error_r  = out[i].real() * diff.real();
-    error_i  = out[i].imag() * diff.imag();
-    error = error_i + error_r;
-
-    d_k = d_k + d_alpha*error + d_rate;
-    d_rate = d_rate + d_beta*error;
-
     // Keep our rate within a good range
     d_rate = gr_branchless_clip(d_rate, d_max_dev);
 
     i++;
-    d_sample_num += d_sps;
-    count = (int)floor(d_sample_num);
+    //d_sample_num += d_sps;
+    //count = (int)floor(d_sample_num);
+    count += (int)floor(d_sps);
 
     if(output_items.size() > 2) {
       err[i] = error;
@@ -295,7 +297,8 @@ gr_pfb_clock_sync_ccf::general_work (int noutput_items,
     consume_each(count);
   }
   */
-  d_sample_num -= floor(d_sample_num);
+  //d_sample_num -= floor(d_sample_num);
+  d_sample_num = 0;
   consume_each(count);
 
   return i;