From 8b5169b933cb4d9443ed3a8e242a22bb981c1267 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Fri, 19 Feb 2016 12:22:39 -0500 Subject: [PATCH] digital: fixing PFB clock sync block handling of tags. Fixes handling of time_est tag information and how to convert to the correct phase arm of the filterbank. Stopped using enable_update_rate; instead, handle tags within work. Because the relative rate can change within this block's work function, applying the same update to the tag offets after work does not work. Instead, we use TPP_DONT and handle the placement of the tags on the output buffer ourselves. --- gr-digital/lib/pfb_clock_sync_ccf_impl.cc | 31 +++++++++++++++++++---- gr-digital/lib/pfb_clock_sync_ccf_impl.h | 2 ++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/gr-digital/lib/pfb_clock_sync_ccf_impl.cc b/gr-digital/lib/pfb_clock_sync_ccf_impl.cc index 314ff94b0b0..b017a95a360 100644 --- a/gr-digital/lib/pfb_clock_sync_ccf_impl.cc +++ b/gr-digital/lib/pfb_clock_sync_ccf_impl.cc @@ -72,7 +72,8 @@ namespace gr { throw std::runtime_error("pfb_clock_sync_ccf: please specify a filter.\n"); // Let scheduler adjust our relative_rate. - enable_update_rate(true); + //enable_update_rate(true); + set_tag_propagation_policy(TPP_DONT); d_nfilters = filter_size; d_sps = floor(sps); @@ -108,6 +109,10 @@ namespace gr { set_taps(taps, d_taps, d_filters); set_taps(dtaps, d_dtaps, d_diff_filters); + d_old_in = 0; + d_new_in = 0; + d_last_out = 0; + set_relative_rate((float)d_osps/(float)d_sps); } @@ -420,8 +425,8 @@ namespace gr { } std::vector tags; - get_tags_in_range(tags, 0, nitems_read(0), - nitems_read(0)+d_sps*noutput_items, + get_tags_in_window(tags, 0, 0, + d_sps*noutput_items, pmt::intern("time_est")); int i = 0, count = 0; @@ -433,7 +438,8 @@ namespace gr { size_t offset = tags[0].offset-nitems_read(0); if((offset >= (size_t)count) && (offset < (size_t)(count + d_sps))) { float center = (float)pmt::to_double(tags[0].value); - d_k = (offset-count - d_sps/2.0) * d_nfilters + (M_PI*center*d_nfilters); + d_k = d_nfilters*(center + (offset - count)); + tags.erase(tags.begin()); } } @@ -458,7 +464,22 @@ namespace gr { out[i+d_out_idx] = d_filters[d_filtnum]->filter(&in[count+d_out_idx]); d_k = d_k + d_rate_i + d_rate_f; // update phase - d_out_idx++; + + + // Manage Tags + std::vector xtags; + std::vector::iterator itags; + d_new_in = nitems_read(0) + count + d_out_idx + d_sps; + get_tags_in_range(xtags, 0, d_old_in, d_new_in); + for(itags = xtags.begin(); itags != xtags.end(); itags++) { + tag_t new_tag = *itags; + new_tag.offset = d_last_out + d_taps_per_filter/(2*d_sps) - 2; + add_item_tag(0, new_tag); + } + d_old_in = d_new_in; + d_last_out = nitems_written(0) + i + d_out_idx; + + d_out_idx++; if(output_items.size() == 4) { err[i] = d_error; diff --git a/gr-digital/lib/pfb_clock_sync_ccf_impl.h b/gr-digital/lib/pfb_clock_sync_ccf_impl.h index 535628189fb..b23b8fefa43 100644 --- a/gr-digital/lib/pfb_clock_sync_ccf_impl.h +++ b/gr-digital/lib/pfb_clock_sync_ccf_impl.h @@ -59,6 +59,8 @@ namespace gr { float d_error; int d_out_idx; + uint64_t d_old_in, d_new_in, d_last_out; + void create_diff_taps(const std::vector &newtaps, std::vector &difftaps);