summaryrefslogtreecommitdiff
path: root/gr-digital/lib/pfb_clock_sync_ccf_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-digital/lib/pfb_clock_sync_ccf_impl.cc')
-rw-r--r--gr-digital/lib/pfb_clock_sync_ccf_impl.cc32
1 files changed, 27 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;