diff --git a/lib/ofdm_decode_mac.cc b/lib/ofdm_decode_mac.cc index 427f6da..eb4f633 100644 --- a/lib/ofdm_decode_mac.cc +++ b/lib/ofdm_decode_mac.cc @@ -40,65 +40,18 @@ ofdm_decode_mac_impl(bool log, bool debug) : block("ofdm_decode_mac", message_port_register_out(pmt::mp("out")); // bpsk - std::complex bpsk_syms[] = {std::complex(-1, 0), std::complex(1, 0)}; int bpsk_bits[] = {0, 1}; - bpsk.set(cvec(bpsk_syms, 2), ivec(bpsk_bits, 2)); + bpsk.set(cvec(BPSK_D, 2), ivec(bpsk_bits, 2)); // qpsk - std::complex qpsk_syms[] = { - std::complex(-1, -1), std::complex(-1, 1), - std::complex( 1, -1), std::complex( 1, 1)}; int qpsk_bits[] = {0, 1, 2, 3}; - qpsk.set(cvec(qpsk_syms, 4), ivec(qpsk_bits, 4)); + qpsk.set(cvec(QPSK_D, 4), ivec(qpsk_bits, 4)); // qam16 - std::complex qam16_syms[] = { - std::complex(-0.9487, -0.9487), std::complex(-0.9487, -0.3162), - std::complex(-0.9487, 0.9487), std::complex(-0.9487, 0.3162), - std::complex(-0.3162, -0.9487), std::complex(-0.3162, -0.3162), - std::complex(-0.3162, 0.9487), std::complex(-0.3162, 0.3162), - std::complex(0.9487, -0.9487), std::complex(0.9487, -0.3162), - std::complex(0.9487, 0.9487), std::complex(0.9487, 0.3162), - std::complex(0.3162, -0.9487), std::complex(0.3162, -0.3162), - std::complex(0.3162, 0.9487), std::complex(0.3162, 0.3162)}; int qam16_bits[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; - qam16.set(cvec(qam16_syms, 16), ivec(qam16_bits, 16)); + qam16.set(cvec(QAM16_D, 16), ivec(qam16_bits, 16)); // qam64 - std::complex qam64_syms[] = { - std::complex(-1.0801, -1.0801), std::complex(-1.0801, -0.7715), - std::complex(-1.0801, -0.1543), std::complex(-1.0801, -0.4629), - std::complex(-1.0801, 1.0801), std::complex(-1.0801, 0.7715), - std::complex(-1.0801, 0.1543), std::complex(-1.0801, 0.4629), - std::complex(-0.7715, -1.0801), std::complex(-0.7715, -0.7715), - std::complex(-0.7715, -0.1543), std::complex(-0.7715, -0.4629), - std::complex(-0.7715, 1.0801), std::complex(-0.7715, 0.7715), - std::complex(-0.7715, 0.1543), std::complex(-0.7715, 0.4629), - std::complex(-0.1543, -1.0801), std::complex(-0.1543, -0.7715), - std::complex(-0.1543, -0.1543), std::complex(-0.1543, -0.4629), - std::complex(-0.1543, 1.0801), std::complex(-0.1543, 0.7715), - std::complex(-0.1543, 0.1543), std::complex(-0.1543, 0.4629), - std::complex(-0.4629, -1.0801), std::complex(-0.4629, -0.7715), - std::complex(-0.4629, -0.1543), std::complex(-0.4629, -0.4629), - std::complex(-0.4629, 1.0801), std::complex(-0.4629, 0.7715), - std::complex(-0.4629, 0.1543), std::complex(-0.4629, 0.4629), - std::complex(1.0801, -1.0801), std::complex(1.0801, -0.7715), - std::complex(1.0801, -0.1543), std::complex(1.0801, -0.4629), - std::complex(1.0801, 1.0801), std::complex(1.0801, 0.7715), - std::complex(1.0801, 0.1543), std::complex(1.0801, 0.4629), - std::complex(0.7715, -1.0801), std::complex(0.7715, -0.7715), - std::complex(0.7715, -0.1543), std::complex(0.7715, -0.4629), - std::complex(0.7715, 1.0801), std::complex(0.7715, 0.7715), - std::complex(0.7715, 0.1543), std::complex(0.7715, 0.4629), - std::complex(0.1543, -1.0801), std::complex(0.1543, -0.7715), - std::complex(0.1543, -0.1543), std::complex(0.1543, -0.4629), - std::complex(0.1543, 1.0801), std::complex(0.1543, 0.7715), - std::complex(0.1543, 0.1543), std::complex(0.1543, 0.4629), - std::complex(0.4629, -1.0801), std::complex(0.4629, -0.7715), - std::complex(0.4629, -0.1543), std::complex(0.4629, -0.4629), - std::complex(0.4629, 1.0801), std::complex(0.4629, 0.7715), - std::complex(0.4629, 0.1543), std::complex(0.4629, 0.4629)}; - int qam64_bits[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, @@ -107,10 +60,7 @@ ofdm_decode_mac_impl(bool log, bool debug) : block("ofdm_decode_mac", 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63}; - qam64.set(cvec(qam64_syms, 64), ivec(qam64_bits, 64)); -} - -~ofdm_decode_mac_impl(){ + qam64.set(cvec(QAM64_D, 64), ivec(qam64_bits, 64)); } int general_work (int noutput_items, gr_vector_int& ninput_items, diff --git a/lib/ofdm_mapper.cc b/lib/ofdm_mapper.cc index 43e9065..b9aae2b 100644 --- a/lib/ofdm_mapper.cc +++ b/lib/ofdm_mapper.cc @@ -63,7 +63,7 @@ void map_to_symbols(const char *bits, size_t len) { for(int i = 0; i < len; i++) { // the signal field is bpsk encoded - d_symbols[i] = (i < 48) ? bpsk_mapping[bits[i]] : mapping[bits[i]]; + d_symbols[i] = (i < 48) ? BPSK[bits[i]] : mapping[bits[i]]; dout << d_symbols[i] << " "; } dout << std::endl; @@ -194,22 +194,22 @@ void set_encoding(Encoding encoding) { switch (encoding) { case BPSK_1_2: case BPSK_3_4: - mapping = bpsk_mapping; + mapping = BPSK; break; case QPSK_1_2: case QPSK_3_4: - mapping = qpsk_mapping; + mapping = QPSK; break; case QAM16_1_2: case QAM16_3_4: - mapping = qam16_mapping; + mapping = QAM16; break; case QAM64_2_3: case QAM64_3_4: - mapping = qam64_mapping; + mapping = QAM64; break; default: @@ -227,62 +227,8 @@ private: gr::thread::mutex d_mutex; const gr_complex *mapping; - static const gr_complex bpsk_mapping[2]; - static const gr_complex qpsk_mapping[4]; - static const gr_complex qam16_mapping[16]; - static const gr_complex qam64_mapping[64]; }; -// constellations for different modulations (normalized to avg power 1) -const gr_complex ofdm_mapper_impl::bpsk_mapping[2] = { - gr_complex(-1.0, 0.0), gr_complex(1.0, 0.0)}; -const gr_complex ofdm_mapper_impl::qpsk_mapping[4] = { - gr_complex(-0.7071, -0.7071), gr_complex(-0.7071, 0.7071), - gr_complex(+0.7071, -0.7071), gr_complex(+0.7071, 0.7071)}; -const gr_complex ofdm_mapper_impl::qam16_mapping[16] = { - gr_complex(-0.9487, -0.9487), gr_complex(-0.9487, -0.3162), - gr_complex(-0.9487, 0.9487), gr_complex(-0.9487, 0.3162), - gr_complex(-0.3162, -0.9487), gr_complex(-0.3162, -0.3162), - gr_complex(-0.3162, 0.9487), gr_complex(-0.3162, 0.3162), - gr_complex(0.9487, -0.9487), gr_complex(0.9487, -0.3162), - gr_complex(0.9487, 0.9487), gr_complex(0.9487, 0.3162), - gr_complex(0.3162, -0.9487), gr_complex(0.3162, -0.3162), - gr_complex(0.3162, 0.9487), gr_complex(0.3162, 0.3162)}; -const gr_complex ofdm_mapper_impl::qam64_mapping[64] = { - gr_complex(-1.0801, -1.0801), gr_complex(-1.0801, -0.7715), - gr_complex(-1.0801, -0.1543), gr_complex(-1.0801, -0.4629), - gr_complex(-1.0801, 1.0801), gr_complex(-1.0801, 0.7715), - gr_complex(-1.0801, 0.1543), gr_complex(-1.0801, 0.4629), - gr_complex(-0.7715, -1.0801), gr_complex(-0.7715, -0.7715), - gr_complex(-0.7715, -0.1543), gr_complex(-0.7715, -0.4629), - gr_complex(-0.7715, 1.0801), gr_complex(-0.7715, 0.7715), - gr_complex(-0.7715, 0.1543), gr_complex(-0.7715, 0.4629), - gr_complex(-0.1543, -1.0801), gr_complex(-0.1543, -0.7715), - gr_complex(-0.1543, -0.1543), gr_complex(-0.1543, -0.4629), - gr_complex(-0.1543, 1.0801), gr_complex(-0.1543, 0.7715), - gr_complex(-0.1543, 0.1543), gr_complex(-0.1543, 0.4629), - gr_complex(-0.4629, -1.0801), gr_complex(-0.4629, -0.7715), - gr_complex(-0.4629, -0.1543), gr_complex(-0.4629, -0.4629), - gr_complex(-0.4629, 1.0801), gr_complex(-0.4629, 0.7715), - gr_complex(-0.4629, 0.1543), gr_complex(-0.4629, 0.4629), - gr_complex(1.0801, -1.0801), gr_complex(1.0801, -0.7715), - gr_complex(1.0801, -0.1543), gr_complex(1.0801, -0.4629), - gr_complex(1.0801, 1.0801), gr_complex(1.0801, 0.7715), - gr_complex(1.0801, 0.1543), gr_complex(1.0801, 0.4629), - gr_complex(0.7715, -1.0801), gr_complex(0.7715, -0.7715), - gr_complex(0.7715, -0.1543), gr_complex(0.7715, -0.4629), - gr_complex(0.7715, 1.0801), gr_complex(0.7715, 0.7715), - gr_complex(0.7715, 0.1543), gr_complex(0.7715, 0.4629), - gr_complex(0.1543, -1.0801), gr_complex(0.1543, -0.7715), - gr_complex(0.1543, -0.1543), gr_complex(0.1543, -0.4629), - gr_complex(0.1543, 1.0801), gr_complex(0.1543, 0.7715), - gr_complex(0.1543, 0.1543), gr_complex(0.1543, 0.4629), - gr_complex(0.4629, -1.0801), gr_complex(0.4629, -0.7715), - gr_complex(0.4629, -0.1543), gr_complex(0.4629, -0.4629), - gr_complex(0.4629, 1.0801), gr_complex(0.4629, 0.7715), - gr_complex(0.4629, 0.1543), gr_complex(0.4629, 0.4629)}; - - ofdm_mapper::sptr ofdm_mapper::make(Encoding mcs, bool debug) { return gnuradio::get_initial_sptr(new ofdm_mapper_impl(mcs, debug)); diff --git a/lib/utils.cc b/lib/utils.cc index 4d9c1a0..5ae7a87 100644 --- a/lib/utils.cc +++ b/lib/utils.cc @@ -20,6 +20,112 @@ #include #include +// constellations for different modulations (normalized to avg power 1) +const std::complex BPSK[2] = { + std::complex(-1.0, 0.0), std::complex(1.0, 0.0)}; + +const std::complex BPSK_D[2] = { + std::complex(-1.0, 0.0), std::complex(1.0, 0.0)}; + + +const std::complex QPSK[4] = { + std::complex(-0.7071, -0.7071), std::complex(-0.7071, 0.7071), + std::complex(+0.7071, -0.7071), std::complex(+0.7071, 0.7071)}; + +const std::complex QPSK_D[4] = { + std::complex(-0.7071, -0.7071), std::complex(-0.7071, 0.7071), + std::complex(+0.7071, -0.7071), std::complex(+0.7071, 0.7071)}; + + +const std::complex QAM16[16] = { + std::complex(-0.9487, -0.9487), std::complex(-0.9487, -0.3162), + std::complex(-0.9487, 0.9487), std::complex(-0.9487, 0.3162), + std::complex(-0.3162, -0.9487), std::complex(-0.3162, -0.3162), + std::complex(-0.3162, 0.9487), std::complex(-0.3162, 0.3162), + std::complex(0.9487, -0.9487), std::complex(0.9487, -0.3162), + std::complex(0.9487, 0.9487), std::complex(0.9487, 0.3162), + std::complex(0.3162, -0.9487), std::complex(0.3162, -0.3162), + std::complex(0.3162, 0.9487), std::complex(0.3162, 0.3162)}; + +const std::complex QAM16_D[16] = { + std::complex(-0.9487, -0.9487), std::complex(-0.9487, -0.3162), + std::complex(-0.9487, 0.9487), std::complex(-0.9487, 0.3162), + std::complex(-0.3162, -0.9487), std::complex(-0.3162, -0.3162), + std::complex(-0.3162, 0.9487), std::complex(-0.3162, 0.3162), + std::complex(0.9487, -0.9487), std::complex(0.9487, -0.3162), + std::complex(0.9487, 0.9487), std::complex(0.9487, 0.3162), + std::complex(0.3162, -0.9487), std::complex(0.3162, -0.3162), + std::complex(0.3162, 0.9487), std::complex(0.3162, 0.3162)}; + + +const std::complex QAM64[64] = { + std::complex(-1.0801, -1.0801), std::complex(-1.0801, -0.7715), + std::complex(-1.0801, -0.1543), std::complex(-1.0801, -0.4629), + std::complex(-1.0801, 1.0801), std::complex(-1.0801, 0.7715), + std::complex(-1.0801, 0.1543), std::complex(-1.0801, 0.4629), + std::complex(-0.7715, -1.0801), std::complex(-0.7715, -0.7715), + std::complex(-0.7715, -0.1543), std::complex(-0.7715, -0.4629), + std::complex(-0.7715, 1.0801), std::complex(-0.7715, 0.7715), + std::complex(-0.7715, 0.1543), std::complex(-0.7715, 0.4629), + std::complex(-0.1543, -1.0801), std::complex(-0.1543, -0.7715), + std::complex(-0.1543, -0.1543), std::complex(-0.1543, -0.4629), + std::complex(-0.1543, 1.0801), std::complex(-0.1543, 0.7715), + std::complex(-0.1543, 0.1543), std::complex(-0.1543, 0.4629), + std::complex(-0.4629, -1.0801), std::complex(-0.4629, -0.7715), + std::complex(-0.4629, -0.1543), std::complex(-0.4629, -0.4629), + std::complex(-0.4629, 1.0801), std::complex(-0.4629, 0.7715), + std::complex(-0.4629, 0.1543), std::complex(-0.4629, 0.4629), + std::complex(1.0801, -1.0801), std::complex(1.0801, -0.7715), + std::complex(1.0801, -0.1543), std::complex(1.0801, -0.4629), + std::complex(1.0801, 1.0801), std::complex(1.0801, 0.7715), + std::complex(1.0801, 0.1543), std::complex(1.0801, 0.4629), + std::complex(0.7715, -1.0801), std::complex(0.7715, -0.7715), + std::complex(0.7715, -0.1543), std::complex(0.7715, -0.4629), + std::complex(0.7715, 1.0801), std::complex(0.7715, 0.7715), + std::complex(0.7715, 0.1543), std::complex(0.7715, 0.4629), + std::complex(0.1543, -1.0801), std::complex(0.1543, -0.7715), + std::complex(0.1543, -0.1543), std::complex(0.1543, -0.4629), + std::complex(0.1543, 1.0801), std::complex(0.1543, 0.7715), + std::complex(0.1543, 0.1543), std::complex(0.1543, 0.4629), + std::complex(0.4629, -1.0801), std::complex(0.4629, -0.7715), + std::complex(0.4629, -0.1543), std::complex(0.4629, -0.4629), + std::complex(0.4629, 1.0801), std::complex(0.4629, 0.7715), + std::complex(0.4629, 0.1543), std::complex(0.4629, 0.4629)}; + +const std::complex QAM64_D[64] = { + std::complex(-1.0801, -1.0801), std::complex(-1.0801, -0.7715), + std::complex(-1.0801, -0.1543), std::complex(-1.0801, -0.4629), + std::complex(-1.0801, 1.0801), std::complex(-1.0801, 0.7715), + std::complex(-1.0801, 0.1543), std::complex(-1.0801, 0.4629), + std::complex(-0.7715, -1.0801), std::complex(-0.7715, -0.7715), + std::complex(-0.7715, -0.1543), std::complex(-0.7715, -0.4629), + std::complex(-0.7715, 1.0801), std::complex(-0.7715, 0.7715), + std::complex(-0.7715, 0.1543), std::complex(-0.7715, 0.4629), + std::complex(-0.1543, -1.0801), std::complex(-0.1543, -0.7715), + std::complex(-0.1543, -0.1543), std::complex(-0.1543, -0.4629), + std::complex(-0.1543, 1.0801), std::complex(-0.1543, 0.7715), + std::complex(-0.1543, 0.1543), std::complex(-0.1543, 0.4629), + std::complex(-0.4629, -1.0801), std::complex(-0.4629, -0.7715), + std::complex(-0.4629, -0.1543), std::complex(-0.4629, -0.4629), + std::complex(-0.4629, 1.0801), std::complex(-0.4629, 0.7715), + std::complex(-0.4629, 0.1543), std::complex(-0.4629, 0.4629), + std::complex(1.0801, -1.0801), std::complex(1.0801, -0.7715), + std::complex(1.0801, -0.1543), std::complex(1.0801, -0.4629), + std::complex(1.0801, 1.0801), std::complex(1.0801, 0.7715), + std::complex(1.0801, 0.1543), std::complex(1.0801, 0.4629), + std::complex(0.7715, -1.0801), std::complex(0.7715, -0.7715), + std::complex(0.7715, -0.1543), std::complex(0.7715, -0.4629), + std::complex(0.7715, 1.0801), std::complex(0.7715, 0.7715), + std::complex(0.7715, 0.1543), std::complex(0.7715, 0.4629), + std::complex(0.1543, -1.0801), std::complex(0.1543, -0.7715), + std::complex(0.1543, -0.1543), std::complex(0.1543, -0.4629), + std::complex(0.1543, 1.0801), std::complex(0.1543, 0.7715), + std::complex(0.1543, 0.1543), std::complex(0.1543, 0.4629), + std::complex(0.4629, -1.0801), std::complex(0.4629, -0.7715), + std::complex(0.4629, -0.1543), std::complex(0.4629, -0.4629), + std::complex(0.4629, 1.0801), std::complex(0.4629, 0.7715), + std::complex(0.4629, 0.1543), std::complex(0.4629, 0.4629)}; + ofdm_param::ofdm_param(Encoding e) { encoding = e; diff --git a/lib/utils.h b/lib/utils.h index a120e7d..5a2d4f3 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -25,6 +25,17 @@ #define dout d_debug && std::cout #define mylog(msg) do { if(d_log) *d_logger << log4cpp::Priority::INFO << msg << log4cpp::eol; } while(0); +extern const std::complex BPSK[2]; +extern const std::complex QPSK[4]; +extern const std::complex QAM16[16]; +extern const std::complex QAM64[64]; + +// same mappings in double (itpp sucks) +extern const std::complex BPSK_D[2]; +extern const std::complex QPSK_D[4]; +extern const std::complex QAM16_D[16]; +extern const std::complex QAM64_D[64]; + struct MAC_DATAFRAME_HEADER { //protocol version, type, subtype, to_ds, from_ds, ... char frame_control[2];