From eeea619b80578665fd470f850c390d4aa6782336 Mon Sep 17 00:00:00 2001 From: Tom Date: Wed, 7 Oct 2009 17:45:19 -0700 Subject: [PATCH] More stable version of clock sync. --- .../src/lib/filter/gr_pfb_clock_sync_ccf.cc | 14 +++++++++----- .../src/lib/filter/gr_pfb_clock_sync_ccf.h | 3 ++- 2 files changed, 11 insertions(+), 6 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 35fe2a88..fe399ffb 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 @@ -63,6 +63,7 @@ gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain, set_alpha(gain); set_beta(0.25*gain*gain); d_k = d_nfilters / 2; + d_filtnum = (int)floor(d_k); d_rate = 0; d_start_count = 0; @@ -237,21 +238,24 @@ 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)) { - int filtnum = (int)d_k; // FIXME: prevent this from asserting assert(filtnum < d_nfilters); - out[i] = d_filters[filtnum]->filter(&in[count]); - error = (out[i] * d_diff_filters[filtnum]->filter(&in[count])).real(); + out[i] = d_filters[d_filtnum]->filter(&in[count]); + error = (out[i] * d_diff_filters[d_filtnum]->filter(&in[count])).real(); d_k = d_k + d_alpha*error + d_rate; d_rate = d_rate + d_beta*error; - while(d_k >= (float)d_nfilters) { + d_filtnum = (int)floor(d_k); + + while(d_filtnum >= d_nfilters) { d_k -= d_nfilters; + d_filtnum -= d_nfilters; count++; } - while(d_k < 0) { + while(d_filtnum < 0) { d_k += d_nfilters; + d_filtnum += d_nfilters; count--; } diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h index 14e95869..41e5d7b2 100644 --- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h +++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h @@ -59,13 +59,14 @@ class gr_pfb_clock_sync_ccf : public gr_block unsigned int d_sps; float d_alpha; float d_beta; - unsigned int d_nfilters; + int d_nfilters; std::vector d_filters; std::vector d_diff_filters; std::vector< std::vector > d_taps; std::vector< std::vector > d_dtaps; float d_k; float d_rate; + int d_filtnum; unsigned int d_start_count; unsigned int d_taps_per_filter; -- 2.30.2