diff options
Diffstat (limited to 'gr-digital/lib/ofdm_serializer_vcc_impl.cc')
-rw-r--r-- | gr-digital/lib/ofdm_serializer_vcc_impl.cc | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/gr-digital/lib/ofdm_serializer_vcc_impl.cc b/gr-digital/lib/ofdm_serializer_vcc_impl.cc index 9ca6d59ec9..261111f22a 100644 --- a/gr-digital/lib/ofdm_serializer_vcc_impl.cc +++ b/gr-digital/lib/ofdm_serializer_vcc_impl.cc @@ -36,6 +36,7 @@ namespace gr { const std::string &len_tag_key, const std::string &packet_len_tag_key, int symbols_skipped, + const std::string &carr_offset_key, bool input_is_shifted ) { @@ -43,7 +44,9 @@ namespace gr { new ofdm_serializer_vcc_impl( fft_len, occupied_carriers, len_tag_key, packet_len_tag_key, - symbols_skipped, input_is_shifted + symbols_skipped, + carr_offset_key, + input_is_shifted ) ); } @@ -53,6 +56,7 @@ namespace gr { const gr::digital::ofdm_carrier_allocator_cvc::sptr &allocator, const std::string &packet_len_tag_key, int symbols_skipped, + const std::string &carr_offset_key, bool input_is_shifted ) { @@ -63,7 +67,8 @@ namespace gr { allocator->len_tag_key(), packet_len_tag_key, symbols_skipped, - input_is_shifted + carr_offset_key, + !input_is_shifted ) ); } @@ -74,6 +79,7 @@ namespace gr { const std::string &len_tag_key, const std::string &packet_len_tag_key, int symbols_skipped, + const std::string &carr_offset_key, bool input_is_shifted) : tagged_stream_block ("ofdm_serializer_vcc", io_signature::make(1, 1, sizeof (gr_complex) * fft_len), @@ -84,20 +90,25 @@ namespace gr { d_packet_len_tag_key(pmt::string_to_symbol(packet_len_tag_key)), d_out_len_tag_key(pmt::string_to_symbol((packet_len_tag_key.empty() ? len_tag_key : packet_len_tag_key))), d_symbols_skipped(symbols_skipped % occupied_carriers.size()), + d_carr_offset_key(pmt::string_to_symbol(carr_offset_key)), d_curr_set(symbols_skipped % occupied_carriers.size()), d_symbols_per_set(0) { for (unsigned i = 0; i < d_occupied_carriers.size(); i++) { for (unsigned k = 0; k < d_occupied_carriers[i].size(); k++) { - if (d_occupied_carriers[i][k] < 0) { - d_occupied_carriers[i][k] += fft_len; + if (input_is_shifted) { + d_occupied_carriers[i][k] += fft_len/2; + if (d_occupied_carriers[i][k] > fft_len) { + d_occupied_carriers[i][k] -= fft_len; + } + } else { + if (d_occupied_carriers[i][k] < 0) { + d_occupied_carriers[i][k] += fft_len; + } } if (d_occupied_carriers[i][k] >= fft_len || d_occupied_carriers[i][k] < 0) { throw std::invalid_argument("ofdm_serializer_vcc: trying to occupy a carrier outside the fft length."); } - if (input_is_shifted) { - d_occupied_carriers[i][k] = (d_occupied_carriers[i][k] + fft_len) % fft_len; - } } } @@ -148,7 +159,7 @@ namespace gr { if (!d_length_tag_key_str.empty()) { get_tags_in_range(tags, 0, nitems_read(0), nitems_read(0)+1); for (unsigned i = 0; i < tags.size(); i++) { - if (pmt::symbol_to_string(tags[i].key) == "ofdm_sync_carr_offset") { + if (tags[i].key == d_carr_offset_key) { carr_offset = pmt::to_long(tags[i].value); } if (tags[i].key == d_packet_len_tag_key) { @@ -176,8 +187,8 @@ namespace gr { ); for (unsigned t = 0; t < tags.size(); t++) { add_item_tag(0, nitems_written(0)+n_out_symbols, - tags[i].key, - tags[i].value + tags[t].key, + tags[t].value ); } for (unsigned k = 0; k < d_occupied_carriers[d_curr_set].size(); k++) { |