diff options
author | Tom <trondeau@vt.edu> | 2009-10-09 13:57:52 -0700 |
---|---|---|
committer | Tom <trondeau@vt.edu> | 2009-10-09 13:57:52 -0700 |
commit | 5c70f942f8b1f979b5a58ec9b58ae409fa077005 (patch) | |
tree | 9ca4f737b62fd1331ea1d321283c061aab5bb861 /gnuradio-core/src | |
parent | 1bce7d89c205502ed933add1a5e97c86db0b0d80 (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.cc | 31 |
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; |