diff options
Diffstat (limited to 'gr-digital/lib/ofdm_chanest_vcvc_impl.cc')
-rw-r--r-- | gr-digital/lib/ofdm_chanest_vcvc_impl.cc | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/gr-digital/lib/ofdm_chanest_vcvc_impl.cc b/gr-digital/lib/ofdm_chanest_vcvc_impl.cc index a4025cc381..f8aebec60d 100644 --- a/gr-digital/lib/ofdm_chanest_vcvc_impl.cc +++ b/gr-digital/lib/ofdm_chanest_vcvc_impl.cc @@ -45,10 +45,16 @@ namespace gr { ); } - ofdm_chanest_vcvc_impl::ofdm_chanest_vcvc_impl(const std::vector<gr_complex> &sync_symbol1, const std::vector<gr_complex> &sync_symbol2, int n_data_symbols, int eq_noise_red_len, int max_carr_offset, bool force_one_sync_symbol) - : block("ofdm_chanest_vcvc", - io_signature::make(1, 1, sizeof (gr_complex) * sync_symbol1.size()), - io_signature::make(1, 1, sizeof (gr_complex) * sync_symbol1.size())), + ofdm_chanest_vcvc_impl::ofdm_chanest_vcvc_impl( + const std::vector<gr_complex> &sync_symbol1, + const std::vector<gr_complex> &sync_symbol2, + int n_data_symbols, + int eq_noise_red_len, + int max_carr_offset, + bool force_one_sync_symbol + ) : block("ofdm_chanest_vcvc", + io_signature::make(1, 1, sizeof (gr_complex) * sync_symbol1.size()), + io_signature::make(1, 2, sizeof (gr_complex) * sync_symbol1.size())), d_fft_len(sync_symbol1.size()), d_n_data_syms(n_data_symbols), d_n_sync_syms(1), @@ -197,13 +203,13 @@ namespace gr { } for (int i = loop_start; i < loop_end; i++) { if ((d_ref_sym[i-carr_offset] != gr_complex(0, 0))) { - taps[i] = sym[i] / d_ref_sym[i-carr_offset]; + taps[i-carr_offset] = sym[i] / d_ref_sym[i-carr_offset]; } } if (d_interpolate) { for (int i = d_first_active_carrier + 1; i < d_last_active_carrier; i += 2) { - taps[i] = (taps[i-1] + taps[i+1]) / gr_complex(2.0, 0); + taps[i] = taps[i-1]; } taps[d_last_active_carrier] = taps[d_last_active_carrier-1]; } @@ -217,6 +223,13 @@ namespace gr { } + // 1) Go through all the frames available on the input buffer + // 2) Estimate the coarse freq. offset and the eq. taps from the + // input symbol(s) + // 3) Copy the data symbols to the output + // 4) Copy all other tags onto the output. A tag that was on + // a sync symbol is copied onto the first data symbol. + // 5) Add the new tags for carrier offset and eq. taps int ofdm_chanest_vcvc_impl::general_work (int noutput_items, gr_vector_int &ninput_items, @@ -235,6 +248,12 @@ namespace gr { std::vector<gr_complex> chan_taps(d_fft_len, 0); get_chan_taps(in, in+d_fft_len, carr_offset, chan_taps); + if (output_items.size() == 2) { + gr_complex *out_chantaps = ((gr_complex *) output_items[1]) + i * d_fft_len; + memcpy((void *) out_chantaps, (void *) &chan_taps[0], sizeof(gr_complex) * d_fft_len); + produce(1, 1); + } + memcpy((void *) out, (void *) &in[d_n_sync_syms * d_fft_len], sizeof(gr_complex) * d_fft_len * d_n_data_syms); @@ -242,30 +261,32 @@ namespace gr { out += d_n_data_syms * d_fft_len; std::vector<tag_t> tags; - this->get_tags_in_range(tags, 0, - this->nitems_read(0)+i*framesize, - this->nitems_read(0)+(i+1)*framesize); + get_tags_in_range(tags, 0, + nitems_read(0)+i*framesize, + nitems_read(0)+(i+1)*framesize); + for (unsigned t = 0; t < tags.size(); t++) { - int offset = tags[t].offset - (this->nitems_read(0) + i*framesize); + int offset = tags[t].offset - (nitems_read(0) + i*framesize); if (offset < d_n_sync_syms) { offset = 0; } else { offset -= d_n_sync_syms; } - tags[t].offset = offset + this->nitems_written(0) + i*d_n_data_syms; - this->add_item_tag(0, tags[t]); + tags[t].offset = offset + nitems_written(0) + i*d_n_data_syms; + add_item_tag(0, tags[t]); } - this->add_item_tag(0, this->nitems_written(0) + i*d_n_data_syms, + add_item_tag(0, nitems_written(0) + i*d_n_data_syms, pmt::string_to_symbol("ofdm_sync_carr_offset"), pmt::from_long(carr_offset)); - this->add_item_tag(0, this->nitems_written(0) + i*d_n_data_syms, + add_item_tag(0, nitems_written(0) + i*d_n_data_syms, pmt::string_to_symbol("ofdm_sync_chan_taps"), pmt::init_c32vector(d_fft_len, chan_taps)); } - + produce(0, n_frames * d_n_data_syms); consume_each(n_frames * framesize); - return n_frames * d_n_data_syms; + + return WORK_CALLED_PRODUCE; } } /* namespace digital */ |