summaryrefslogtreecommitdiff
path: root/gnuradio-core/src
diff options
context:
space:
mode:
authorTom <trondeau@vt.edu>2009-10-09 13:57:52 -0700
committerTom <trondeau@vt.edu>2009-10-09 13:57:52 -0700
commit5c70f942f8b1f979b5a58ec9b58ae409fa077005 (patch)
tree9ca4f737b62fd1331ea1d321283c061aab5bb861 /gnuradio-core/src
parent1bce7d89c205502ed933add1a5e97c86db0b0d80 (diff)
Working fractional sample rates in clock recovery algorithm.
Diffstat (limited to 'gnuradio-core/src')
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc31
1 files changed, 17 insertions, 14 deletions
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
index 56ad24ffcf..fcd3686013 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -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;