From 7f95f47ec6a7203985b2e6c9d44d5175a93b7a1e Mon Sep 17 00:00:00 2001 From: Bastian Bloessl Date: Tue, 31 May 2016 15:32:18 +0200 Subject: [PATCH] add wifi constellation objects --- include/ieee802-11/CMakeLists.txt | 1 + include/ieee802-11/constellations.h | 71 +++++++++ lib/CMakeLists.txt | 2 +- lib/constellations_impl.cc | 235 ++++++++++++++++++++++++++++ lib/constellations_impl.h | 71 +++++++++ swig/ieee802_11_swig.i | 33 +++- utils/16-qam.png | Bin 0 -> 15996 bytes utils/64-qam.png | Bin 0 -> 39633 bytes utils/constellations.py | 96 ++++++++++++ 9 files changed, 507 insertions(+), 2 deletions(-) create mode 100644 include/ieee802-11/constellations.h create mode 100644 lib/constellations_impl.cc create mode 100644 lib/constellations_impl.h create mode 100644 utils/16-qam.png create mode 100644 utils/64-qam.png create mode 100644 utils/constellations.py diff --git a/include/ieee802-11/CMakeLists.txt b/include/ieee802-11/CMakeLists.txt index 159c3c6..c7e375e 100644 --- a/include/ieee802-11/CMakeLists.txt +++ b/include/ieee802-11/CMakeLists.txt @@ -70,6 +70,7 @@ list(APPEND include_sources ${generated_includes} api.h chunks_to_symbols.h + constellations.h decode_mac.h decode_signal.h equalize_symbols.h diff --git a/include/ieee802-11/constellations.h b/include/ieee802-11/constellations.h new file mode 100644 index 0000000..bcc79a5 --- /dev/null +++ b/include/ieee802-11/constellations.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2016 Bastian Bloessl + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef INCLUDED_IEEE802_11_CONSTELLATIONS_H +#define INCLUDED_IEEE802_11_CONSTELLATIONS_H + +#include +#include + +namespace gr { +namespace ieee802_11 { + +class IEEE802_11_API constellation_bpsk : virtual public digital::constellation +{ +public: + typedef boost::shared_ptr sptr; + static sptr make(); + +protected: + constellation_bpsk(); +}; + +class IEEE802_11_API constellation_qpsk : virtual public digital::constellation +{ +public: + typedef boost::shared_ptr sptr; + static sptr make(); + +protected: + constellation_qpsk(); +}; + +class IEEE802_11_API constellation_16qam : virtual public digital::constellation +{ +public: + typedef boost::shared_ptr sptr; + static sptr make(); + +protected: + constellation_16qam(); +}; + +class IEEE802_11_API constellation_64qam : virtual public digital::constellation +{ +public: + typedef boost::shared_ptr sptr; + static sptr make(); + +protected: + constellation_64qam(); +}; + +} // namespace ieee802_11 +} // namespace gr + +#endif /* INCLUDED_IEEE802_11_CONSTELLATIONS_H */ + diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index fca0ec2..c2abad8 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -95,7 +95,7 @@ add_dependencies(ieee802_11_generated_sources ieee802_11_generated_includes) list(APPEND gr_ieee802_11_sources ${generated_sources} chunks_to_symbols_impl.cc - constellations.cc + constellations_impl.cc decode_mac.cc decode_signal.cc equalize_symbols.cc diff --git a/lib/constellations_impl.cc b/lib/constellations_impl.cc new file mode 100644 index 0000000..6f7792d --- /dev/null +++ b/lib/constellations_impl.cc @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2016 Bastian Bloessl + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "constellations_impl.h" + +using namespace gr::ieee802_11; + +constellation_bpsk::sptr +constellation_bpsk::make() { + return constellation_bpsk::sptr(new constellation_bpsk_impl()); +} + +constellation_bpsk::constellation_bpsk() {} + +constellation_bpsk_impl::constellation_bpsk_impl() { + d_constellation.resize(2); + d_constellation[0] = gr_complex(-1, 0); + d_constellation[1] = gr_complex(1, 0); + d_rotational_symmetry = 2; + d_dimensionality = 1; + calc_arity(); +} + +constellation_bpsk_impl::~constellation_bpsk_impl() { +} + +unsigned int +constellation_bpsk_impl::decision_maker(const gr_complex *sample) { + return (real(*sample) > 0); +} + + +/**********************************************************/ + +constellation_qpsk::sptr +constellation_qpsk::make() { + return constellation_qpsk::sptr(new constellation_qpsk_impl()); +} + +constellation_qpsk::constellation_qpsk() {} + +constellation_qpsk_impl::constellation_qpsk_impl() { + const float level = sqrt(float(0.5)); + d_constellation.resize(4); + // Gray-coded + d_constellation[0] = gr_complex(-level, -level); + d_constellation[1] = gr_complex( level, -level); + d_constellation[2] = gr_complex(-level, level); + d_constellation[3] = gr_complex( level, level); + + d_rotational_symmetry = 4; + d_dimensionality = 1; + calc_arity(); +} + +constellation_qpsk_impl::~constellation_qpsk_impl() { +} + +unsigned int +constellation_qpsk_impl::decision_maker(const gr_complex *sample) { + return 2*(imag(*sample)>0) + (real(*sample)>0); +} + + +/**********************************************************/ + +constellation_16qam::sptr +constellation_16qam::make() { + return constellation_16qam::sptr(new constellation_16qam_impl()); +} + +constellation_16qam::constellation_16qam() {} + +constellation_16qam_impl::constellation_16qam_impl() +{ + const float level = sqrt(float(0.1)); + d_constellation.resize(16); + + d_constellation[ 0] = gr_complex(-3*level,-3*level); + d_constellation[ 1] = gr_complex( 3*level,-3*level); + d_constellation[ 2] = gr_complex(-1*level,-3*level); + d_constellation[ 3] = gr_complex( 1*level,-3*level); + d_constellation[ 4] = gr_complex(-3*level, 3*level); + d_constellation[ 5] = gr_complex( 3*level, 3*level); + d_constellation[ 6] = gr_complex(-1*level, 3*level); + d_constellation[ 7] = gr_complex( 1*level, 3*level); + d_constellation[ 8] = gr_complex(-3*level,-1*level); + d_constellation[ 9] = gr_complex( 3*level,-1*level); + d_constellation[10] = gr_complex(-1*level,-1*level); + d_constellation[11] = gr_complex( 1*level,-1*level); + d_constellation[12] = gr_complex(-3*level, 1*level); + d_constellation[13] = gr_complex( 3*level, 1*level); + d_constellation[14] = gr_complex(-1*level, 1*level); + d_constellation[15] = gr_complex( 1*level, 1*level); + + d_rotational_symmetry = 4; + d_dimensionality = 1; + calc_arity(); +} + +constellation_16qam_impl::~constellation_16qam_impl() { +} + +unsigned int +constellation_16qam_impl::decision_maker(const gr_complex *sample) +{ + unsigned int ret = 0; + const float level = sqrt(float(0.1)); + float re = sample->real(); + float im = sample->imag(); + + ret |= re > 0; + ret |= (std::abs(re) < (2*level)) << 1; + ret |= (im > 0) << 2; + ret |= (std::abs(im) < (2*level)) << 3; + + return ret; +} + + +/**********************************************************/ + +constellation_64qam::sptr +constellation_64qam::make() { + return constellation_64qam::sptr(new constellation_64qam_impl()); +} + +constellation_64qam::constellation_64qam() {} + +constellation_64qam_impl::constellation_64qam_impl() { + const float level = sqrt(float(1/42.0)); + d_constellation.resize(64); + + d_constellation[ 0] = gr_complex(-7*level,-7*level); + d_constellation[ 1] = gr_complex( 7*level,-7*level); + d_constellation[ 2] = gr_complex(-1*level,-7*level); + d_constellation[ 3] = gr_complex( 1*level,-7*level); + d_constellation[ 4] = gr_complex(-5*level,-7*level); + d_constellation[ 5] = gr_complex( 5*level,-7*level); + d_constellation[ 6] = gr_complex(-3*level,-7*level); + d_constellation[ 7] = gr_complex( 3*level,-7*level); + d_constellation[ 8] = gr_complex(-7*level, 7*level); + d_constellation[ 9] = gr_complex( 7*level, 7*level); + d_constellation[10] = gr_complex(-1*level, 7*level); + d_constellation[11] = gr_complex( 1*level, 7*level); + d_constellation[12] = gr_complex(-5*level, 7*level); + d_constellation[13] = gr_complex( 5*level, 7*level); + d_constellation[14] = gr_complex(-3*level, 7*level); + d_constellation[15] = gr_complex( 3*level, 7*level); + d_constellation[16] = gr_complex(-7*level,-1*level); + d_constellation[17] = gr_complex( 7*level,-1*level); + d_constellation[18] = gr_complex(-1*level,-1*level); + d_constellation[19] = gr_complex( 1*level,-1*level); + d_constellation[20] = gr_complex(-5*level,-1*level); + d_constellation[21] = gr_complex( 5*level,-1*level); + d_constellation[22] = gr_complex(-3*level,-1*level); + d_constellation[23] = gr_complex( 3*level,-1*level); + d_constellation[24] = gr_complex(-7*level, 1*level); + d_constellation[25] = gr_complex( 7*level, 1*level); + d_constellation[26] = gr_complex(-1*level, 1*level); + d_constellation[27] = gr_complex( 1*level, 1*level); + d_constellation[28] = gr_complex(-5*level, 1*level); + d_constellation[29] = gr_complex( 5*level, 1*level); + d_constellation[30] = gr_complex(-3*level, 1*level); + d_constellation[31] = gr_complex( 3*level, 1*level); + d_constellation[32] = gr_complex(-7*level,-5*level); + d_constellation[33] = gr_complex( 7*level,-5*level); + d_constellation[34] = gr_complex(-1*level,-5*level); + d_constellation[35] = gr_complex( 1*level,-5*level); + d_constellation[36] = gr_complex(-5*level,-5*level); + d_constellation[37] = gr_complex( 5*level,-5*level); + d_constellation[38] = gr_complex(-3*level,-5*level); + d_constellation[39] = gr_complex( 3*level,-5*level); + d_constellation[40] = gr_complex(-7*level, 5*level); + d_constellation[41] = gr_complex( 7*level, 5*level); + d_constellation[42] = gr_complex(-1*level, 5*level); + d_constellation[43] = gr_complex( 1*level, 5*level); + d_constellation[44] = gr_complex(-5*level, 5*level); + d_constellation[45] = gr_complex( 5*level, 5*level); + d_constellation[46] = gr_complex(-3*level, 5*level); + d_constellation[47] = gr_complex( 3*level, 5*level); + d_constellation[48] = gr_complex(-7*level,-3*level); + d_constellation[49] = gr_complex( 7*level,-3*level); + d_constellation[50] = gr_complex(-1*level,-3*level); + d_constellation[51] = gr_complex( 1*level,-3*level); + d_constellation[52] = gr_complex(-5*level,-3*level); + d_constellation[53] = gr_complex( 5*level,-3*level); + d_constellation[54] = gr_complex(-3*level,-3*level); + d_constellation[55] = gr_complex( 3*level,-3*level); + d_constellation[56] = gr_complex(-7*level, 3*level); + d_constellation[57] = gr_complex( 7*level, 3*level); + d_constellation[58] = gr_complex(-1*level, 3*level); + d_constellation[59] = gr_complex( 1*level, 3*level); + d_constellation[60] = gr_complex(-5*level, 3*level); + d_constellation[61] = gr_complex( 5*level, 3*level); + d_constellation[62] = gr_complex(-3*level, 3*level); + d_constellation[63] = gr_complex( 3*level, 3*level); + + d_rotational_symmetry = 4; + d_dimensionality = 1; + calc_arity(); +} + +constellation_64qam_impl::~constellation_64qam_impl() { +} + +unsigned int +constellation_64qam_impl::decision_maker(const gr_complex *sample) { + unsigned int ret = 0; + const float level = sqrt(float(1/42.0)); + float re = sample->real(); + float im = sample->imag(); + + ret |= re > 0; + ret |= (std::abs(re) < (4*level)) << 1; + ret |= (std::abs(re) < (6*level) && std::abs(re) > (2*level)) << 2; + ret |= (im > 0) << 3; + ret |= (std::abs(im) < (4*level)) << 4; + ret |= (std::abs(im) < (6*level) && std::abs(im) > (2*level)) << 5; + + return ret; +} diff --git a/lib/constellations_impl.h b/lib/constellations_impl.h new file mode 100644 index 0000000..7519d0b --- /dev/null +++ b/lib/constellations_impl.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2016 Bastian Bloessl + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef INCLUDED_IEEE802_11_CONSTELLATIONS_IMPL_H +#define INCLUDED_IEEE802_11_CONSTELLATIONS_IMPL_H + +#include + +namespace gr { +namespace ieee802_11 { + +class constellation_bpsk_impl : public constellation_bpsk +{ +public: + constellation_bpsk_impl(); + ~constellation_bpsk_impl(); + + unsigned int decision_maker(const gr_complex *sample); +}; + + +class constellation_qpsk_impl : public constellation_qpsk +{ +public: + constellation_qpsk_impl(); + ~constellation_qpsk_impl(); + + unsigned int decision_maker(const gr_complex *sample); +}; + + + +class constellation_16qam_impl : public constellation_16qam +{ +public: + constellation_16qam_impl(); + ~constellation_16qam_impl(); + + unsigned int decision_maker(const gr_complex *sample); +}; + + + + +class constellation_64qam_impl : public constellation_64qam +{ +public: + constellation_64qam_impl(); + ~constellation_64qam_impl(); + + unsigned int decision_maker(const gr_complex *sample); +}; + + +} // namespace ieee802_11 +} // namespace gr + +#endif /* INCLUDED_IEEE802_11_CONSTELLATIONS_IMPL_H */ diff --git a/swig/ieee802_11_swig.i b/swig/ieee802_11_swig.i index 2995854..2eba124 100644 --- a/swig/ieee802_11_swig.i +++ b/swig/ieee802_11_swig.i @@ -25,6 +25,7 @@ #include "gnuradio/digital/packet_header_default.h" #include "ieee802-11/chunks_to_symbols.h" +#include "ieee802-11/constellations.h" #include "ieee802-11/ether_encap.h" #include "ieee802-11/moving_average_cc.h" #include "ieee802-11/moving_average_ff.h" @@ -41,7 +42,13 @@ %include "gnuradio/digital/packet_header_default.h" +%ignore gr::digital::constellation_bpsk; +%ignore gr::digital::constellation_qpsk; +%ignore gr::digital::constellation_16qam; +%include "gnuradio/digital/constellation.h" + %include "ieee802-11/chunks_to_symbols.h" +%include "ieee802-11/constellations.h" %include "ieee802-11/ether_encap.h" %include "ieee802-11/moving_average_cc.h" %include "ieee802-11/moving_average_ff.h" @@ -71,5 +78,29 @@ GR_SWIG_BLOCK_MAGIC2(ieee802_11, sync_short); %template(signal_field_sptr) boost::shared_ptr; %pythoncode %{ signal_field_sptr.__repr__ = lambda self: "" -signal_field = signal_field .make; +signal_field = signal_field.make; +%} + +%template(constellation_bpsk_sptr) boost::shared_ptr; +%pythoncode %{ +constellation_bpsk_sptr.__repr__ = lambda self: "" +constellation_bpsk = constellation_bpsk.make; +%} + +%template(constellation_qpsk_sptr) boost::shared_ptr; +%pythoncode %{ +constellation_qpsk_sptr.__repr__ = lambda self: "" +constellation_qpsk = constellation_qpsk.make; +%} + +%template(constellation_16qam_sptr) boost::shared_ptr; +%pythoncode %{ +constellation_16qam_sptr.__repr__ = lambda self: "" +constellation_16qam = constellation_16qam.make; +%} + +%template(constellation_64qam_sptr) boost::shared_ptr; +%pythoncode %{ +constellation_64qam_sptr.__repr__ = lambda self: "" +constellation_64qam = constellation_64qam.make; %} diff --git a/utils/16-qam.png b/utils/16-qam.png new file mode 100644 index 0000000000000000000000000000000000000000..ad62b306a597d75a560ef3be3f60b25b168a9ed4 GIT binary patch literal 15996 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 Q{20tJjZ?UE^5O6@2VIR#@WX%*&5ik`| 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