diff options
author | Tom Rondeau <tom@trondeau.com> | 2016-06-14 10:37:46 -0700 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2016-06-14 10:58:05 -0700 |
commit | c475f14e4604b9bca25c08f1d30a2e8ff9bbcf26 (patch) | |
tree | 4edfb99ff5daa7c7cbf4af6156acb927cd383a00 | |
parent | 32d1c7d3188bf3107b45f350e44907cf23faee3e (diff) |
digital: pfb_clock_sync_ccf tag offset update.
This seems to work correctly regardless of the sps.
-rw-r--r-- | gr-digital/lib/pfb_clock_sync_ccf_impl.cc | 32 | ||||
-rw-r--r-- | gr-digital/lib/pfb_clock_sync_ccf_impl.h | 2 |
2 files changed, 29 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 314ff94b0b..6ac39fbcfc 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<tag_t> 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,23 @@ 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<tag_t> xtags; + std::vector<tag_t>::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; + new_tag.offset = d_last_out + d_taps_per_filter/4 - 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 535628189f..b23b8fefa4 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<float> &newtaps, std::vector<float> &difftaps); |