summaryrefslogtreecommitdiff
path: root/gr-digital/lib/ofdm_serializer_vcc_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-digital/lib/ofdm_serializer_vcc_impl.cc')
-rw-r--r--gr-digital/lib/ofdm_serializer_vcc_impl.cc31
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++) {