resampler: adding only one original_offset tag at given position

Change-Id: I502ca1075b4ecf37d922c72f60cca5c64fd0fdee
This commit is contained in:
Piotr Krysik 2019-07-17 10:34:42 +02:00
parent 59257a11a3
commit 21fc94db73
2 changed files with 20 additions and 7 deletions

View File

@ -44,7 +44,8 @@ namespace gr {
io_signature::make(1, 1, sizeof(gr_complex)), io_signature::make(1, 1, sizeof(gr_complex)),
io_signature::make(1, 1, sizeof(gr_complex))), io_signature::make(1, 1, sizeof(gr_complex))),
d_mu(phase_shift), d_mu_inc(resamp_ratio), d_mu(phase_shift), d_mu_inc(resamp_ratio),
d_resamp(new mmse_fir_interpolator_cc()) d_resamp(new mmse_fir_interpolator_cc()),
d_last_original_offset(0)
{ {
this->set_tag_propagation_policy(TPP_DONT); this->set_tag_propagation_policy(TPP_DONT);
if(resamp_ratio <= 0) if(resamp_ratio <= 0)
@ -88,8 +89,9 @@ namespace gr {
pmt::pmt_t key = pmt::string_to_symbol("set_resamp_ratio"); pmt::pmt_t key = pmt::string_to_symbol("set_resamp_ratio");
get_tags_in_range(tags, 0, nitems_read(0), nitems_read(0)+ninput_items[0]); get_tags_in_range(tags, 0, nitems_read(0), nitems_read(0)+ninput_items[0]);
bool out_buffer_full = false; bool out_buffer_full = false;
for(std::vector<tag_t>::iterator i_tag = tags.begin(); i_tag < tags.end(); i_tag++) for(std::vector<tag_t>::iterator i_tag = tags.begin(); i_tag != tags.end(); i_tag++)
{ {
uint64_t tag_offset_rel = i_tag->offset - nitems_read(0); uint64_t tag_offset_rel = i_tag->offset - nitems_read(0);
@ -102,6 +104,7 @@ namespace gr {
samples_to_produce = noutput_items - produced_out_sum; samples_to_produce = noutput_items - produced_out_sum;
out_buffer_full = true; out_buffer_full = true;
} }
processed_in = resample(in, processed_in_sum, out, produced_out_sum, samples_to_produce); processed_in = resample(in, processed_in_sum, out, produced_out_sum, samples_to_produce);
processed_in_sum = processed_in_sum + processed_in; processed_in_sum = processed_in_sum + processed_in;
produced_out_sum = produced_out_sum + samples_to_produce; produced_out_sum = produced_out_sum + samples_to_produce;
@ -112,15 +115,23 @@ namespace gr {
} else { } else {
set_resamp_ratio(pmt::to_double(i_tag->value)); set_resamp_ratio(pmt::to_double(i_tag->value));
tag_t original_offset_tag; tag_t original_offset_tag;
add_item_tag(0, produced_out_sum + nitems_written(0), pmt::mp("original_offset"), pmt::from_uint64(i_tag->offset)); uint64_t offset = produced_out_sum + nitems_written(0);
add_item_tag(0, produced_out_sum + nitems_written(0), i_tag->key, i_tag->value); if(d_last_original_offset != offset){ //prevent from sending multiple "original_offset" tags for the same offset
add_item_tag(0, offset, pmt::mp("original_offset"), pmt::from_uint64(i_tag->offset));
d_last_original_offset = offset;
}
add_item_tag(0, offset, i_tag->key, i_tag->value);
} }
} else { } else {
uint64_t out_samples_to_tag = round(static_cast<double>(tag_offset_rel-processed_in_sum)/d_mu_inc); uint64_t out_samples_to_tag = round(static_cast<double>(tag_offset_rel-processed_in_sum)/d_mu_inc);
if( (out_samples_to_tag + produced_out_sum) < noutput_items) if( (out_samples_to_tag + produced_out_sum) < noutput_items)
{ {
add_item_tag(0, produced_out_sum + out_samples_to_tag + nitems_written(0), pmt::mp("original_offset"), pmt::from_uint64(i_tag->offset)); uint64_t offset = produced_out_sum + out_samples_to_tag + nitems_written(0);
add_item_tag(0, produced_out_sum + out_samples_to_tag + nitems_written(0), i_tag->key, i_tag->value); if(d_last_original_offset != offset){
add_item_tag(0, offset, pmt::mp("original_offset"), pmt::from_uint64(i_tag->offset));
d_last_original_offset = offset;
}
add_item_tag(0, offset, i_tag->key, i_tag->value);
} }
} }
} }
@ -130,6 +141,7 @@ namespace gr {
processed_in = resample(in, processed_in_sum, out, produced_out_sum, (noutput_items-produced_out_sum)); processed_in = resample(in, processed_in_sum, out, produced_out_sum, (noutput_items-produced_out_sum));
processed_in_sum = processed_in_sum + processed_in; processed_in_sum = processed_in_sum + processed_in;
} }
consume_each(processed_in_sum); consume_each(processed_in_sum);
return noutput_items; return noutput_items;
} }
@ -142,7 +154,7 @@ namespace gr {
while(oo < (first_out_sample+samples_to_produce)) //produce samples_to_produce number of samples while(oo < (first_out_sample+samples_to_produce)) //produce samples_to_produce number of samples
{ {
out[oo++] = d_resamp->interpolate(&in[ii], d_mu); out[oo++] = d_resamp->interpolate(&in[ii], d_mu);
double s = d_mu + d_mu_inc; double s = d_mu + d_mu_inc;
double f = floor(s); double f = floor(s);
int incr = (int)f; int incr = (int)f;

View File

@ -37,6 +37,7 @@ namespace gr {
float d_mu; float d_mu;
float d_mu_inc; float d_mu_inc;
mmse_fir_interpolator_cc *d_resamp; mmse_fir_interpolator_cc *d_resamp;
uint64_t d_last_original_offset;
inline uint64_t resample(const gr_complex *in, inline uint64_t resample(const gr_complex *in,
uint64_t first_in_sample, uint64_t first_in_sample,