diff options
Diffstat (limited to 'gr-digital/include/digital/constellation.h')
-rw-r--r-- | gr-digital/include/digital/constellation.h | 478 |
1 files changed, 0 insertions, 478 deletions
diff --git a/gr-digital/include/digital/constellation.h b/gr-digital/include/digital/constellation.h deleted file mode 100644 index d81cac478e..0000000000 --- a/gr-digital/include/digital/constellation.h +++ /dev/null @@ -1,478 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2010-2012 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio 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, or (at your option) - * any later version. - * - * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_DIGITAL_CONSTELLATION_H -#define INCLUDED_DIGITAL_CONSTELLATION_H - -#include <digital/api.h> -#include <digital/metric_type.h> -#include <boost/enable_shared_from_this.hpp> -#include <gnuradio/gr_complex.h> -#include <vector> - -namespace gr { - namespace digital { - - /************************************************************/ - /* constellation */ - /* */ - /* Base class defining interface. */ - /************************************************************/ - - class constellation; - typedef boost::shared_ptr<constellation> constellation_sptr; - - /*! - * \brief An abstracted constellation object - * \ingroup symbol_coding_blk - * - * \details - * The constellation objects hold the necessary information to pass - * around constellation information for modulators and - * demodulators. These objects contain the mapping between the bits - * and the constellation points used to represent them as well as - * methods for slicing the symbol space. Various implementations are - * possible for efficiency and ease of use. - * - * Standard constellations (BPSK, QPSK, QAM, etc) can be inherited - * from this class and overloaded to perform optimized slicing and - * constellation mappings. - */ - class DIGITAL_API constellation - : public boost::enable_shared_from_this<constellation> - { - public: - constellation(std::vector<gr_complex> constell, - std::vector<int> pre_diff_code, - unsigned int rotational_symmetry, - unsigned int dimensionality); - constellation(); - virtual ~constellation(); - - //! Returns the constellation points for a symbol value - void map_to_points(unsigned int value, gr_complex *points); - std::vector<gr_complex> map_to_points_v(unsigned int value); - - //! Returns the constellation point that matches best. - virtual unsigned int decision_maker(const gr_complex *sample) = 0; - //! Takes a vector rather than a pointer. Better for SWIG wrapping. - unsigned int decision_maker_v(std::vector<gr_complex> sample); - //! Also calculates the phase error. - unsigned int decision_maker_pe(const gr_complex *sample, float *phase_error); - //! Calculates distance. - //unsigned int decision_maker_e(const gr_complex *sample, float *error); - - //! Calculates metrics for all points in the constellation. - //! For use with the viterbi algorithm. - virtual void calc_metric(const gr_complex *sample, float *metric, gr::digital::trellis_metric_type_t type); - virtual void calc_euclidean_metric(const gr_complex *sample, float *metric); - virtual void calc_hard_symbol_metric(const gr_complex *sample, float *metric); - - //! Returns the set of points in this constellation. - std::vector<gr_complex> points() { return d_constellation;} - //! Returns the vector of points in this constellation. - //! Raise error if dimensionality is not one. - std::vector<gr_complex> s_points(); - //! Returns a vector of vectors of points. - std::vector<std::vector<gr_complex> > v_points(); - //! Whether to apply an encoding before doing differential encoding. (e.g. gray coding) - bool apply_pre_diff_code() { return d_apply_pre_diff_code;} - //! Whether to apply an encoding before doing differential encoding. (e.g. gray coding) - void set_pre_diff_code(bool a) { d_apply_pre_diff_code = a;} - //! Returns the encoding to apply before differential encoding. - std::vector<int> pre_diff_code() { return d_pre_diff_code;} - //! Returns the order of rotational symmetry. - unsigned int rotational_symmetry() { return d_rotational_symmetry;} - //! Returns the number of complex numbers in a single symbol. - unsigned int dimensionality() {return d_dimensionality;} - - unsigned int bits_per_symbol() - { - return floor(log(double(d_constellation.size()))/d_dimensionality/log(2.0)); - } - - unsigned int arity() - { - return d_arity; - } - - constellation_sptr base() - { - return shared_from_this(); - } - - protected: - std::vector<gr_complex> d_constellation; - std::vector<int> d_pre_diff_code; - bool d_apply_pre_diff_code; - unsigned int d_rotational_symmetry; - unsigned int d_dimensionality; - unsigned int d_arity; - //! The factor by which the user given constellation points were - //! scaled by to achieve an average amplitude of 1. - float d_scalefactor; - - float get_distance(unsigned int index, const gr_complex *sample); - unsigned int get_closest_point(const gr_complex *sample); - void calc_arity(); - }; - - /************************************************************/ - /* constellation_calcdist */ - /* */ - /************************************************************/ - - /*! \brief Calculate Euclidian distance for any constellation - * \ingroup digital - * - * Constellation which calculates the distance to each point in the - * constellation for decision making. Inefficient for large - * constellations. - */ - class DIGITAL_API constellation_calcdist - : public constellation - { - public: - typedef boost::shared_ptr<constellation_calcdist> sptr; - - // public constructor - static sptr make(std::vector<gr_complex> constell, - std::vector<int> pre_diff_code, - unsigned int rotational_symmetry, - unsigned int dimensionality); - - unsigned int decision_maker(const gr_complex *sample); - // void calc_metric(gr_complex *sample, float *metric, trellis_metric_type_t type); - // void calc_euclidean_metric(gr_complex *sample, float *metric); - // void calc_hard_symbol_metric(gr_complex *sample, float *metric); - - protected: - constellation_calcdist(std::vector<gr_complex> constell, - std::vector<int> pre_diff_code, - unsigned int rotational_symmetry, - unsigned int dimensionality); - }; - - - /************************************************************/ - /*! constellation_sector */ - /************************************************************/ - - /*! - * \brief Sectorized digital constellation - * \ingroup digital - * - * Constellation space is divided into sectors. Each sector is - * associated with the nearest constellation point. - * - */ - class DIGITAL_API constellation_sector : public constellation - { - public: - - constellation_sector(std::vector<gr_complex> constell, - std::vector<int> pre_diff_code, - unsigned int rotational_symmetry, - unsigned int dimensionality, - unsigned int n_sectors); - - ~constellation_sector(); - - unsigned int decision_maker(const gr_complex *sample); - - protected: - virtual unsigned int get_sector(const gr_complex *sample) = 0; - virtual unsigned int calc_sector_value(unsigned int sector) = 0; - void find_sector_values(); - - unsigned int n_sectors; - - private: - std::vector<int> sector_values; - }; - - /************************************************************/ - /* constellation_rect */ - /************************************************************/ - - /*! - * \brief Rectangular digital constellation - * \ingroup digital - * - * Only implemented for 1-(complex)dimensional constellation. - * - * Constellation space is divided into rectangular sectors. Each - * sector is associated with the nearest constellation point. - * - * Works well for square QAM. - * - * Works for any generic constellation provided sectors are not - * too large. - */ - - - class DIGITAL_API constellation_rect - : public constellation_sector - { - public: - typedef boost::shared_ptr<constellation_rect> sptr; - - // public constructor - static constellation_rect::sptr make(std::vector<gr_complex> constell, - std::vector<int> pre_diff_code, - unsigned int rotational_symmetry, - unsigned int real_sectors, - unsigned int imag_sectors, - float width_real_sectors, - float width_imag_sectors); - ~constellation_rect(); - - protected: - - constellation_rect(std::vector<gr_complex> constell, - std::vector<int> pre_diff_code, - unsigned int rotational_symmetry, - unsigned int real_sectors, - unsigned int imag_sectors, - float width_real_sectors, - float width_imag_sectors); - - unsigned int get_sector(const gr_complex *sample); - - unsigned int calc_sector_value(unsigned int sector); - - private: - unsigned int n_real_sectors; - unsigned int n_imag_sectors; - float d_width_real_sectors; - float d_width_imag_sectors; - }; - - - /************************************************************/ - /* constellation_expl_rect */ - /************************************************************/ - - /*! - * \brief Rectangular digital constellation - * \ingroup digital - * - * Only implemented for 1-(complex)dimensional constellation. - * - * Constellation space is divided into rectangular sectors. Each - * sector is associated with the nearest constellation point. - * - * This class is different from constellation_rect in that the - * mapping from sector to constellation point is explicitly passed - * into the constructor as sector_values. Usually we do not need - * this, since we want each sector to be automatically mapped to - * the closest constellation point, however sometimes it's nice to - * have the flexibility. - */ - class DIGITAL_API constellation_expl_rect - : public constellation_rect - { - public: - typedef boost::shared_ptr<constellation_expl_rect> sptr; - - static sptr make(std::vector<gr_complex> constellation, - std::vector<int> pre_diff_code, - unsigned int rotational_symmetry, - unsigned int real_sectors, - unsigned int imag_sectors, - float width_real_sectors, - float width_imag_sectors, - std::vector<unsigned int> sector_values); - ~constellation_expl_rect(); - - protected: - constellation_expl_rect(std::vector<gr_complex> constellation, - std::vector<int> pre_diff_code, - unsigned int rotational_symmetry, - unsigned int real_sectors, - unsigned int imag_sectors, - float width_real_sectors, - float width_imag_sectors, - std::vector<unsigned int> sector_values); - - unsigned int calc_sector_value (unsigned int sector) { - return d_sector_values[sector]; - } - - private: - std::vector<unsigned int> d_sector_values; - }; - - /************************************************************/ - /* constellation_psk */ - /************************************************************/ - - /*! - * \brief constellation_psk - * \ingroup digital - * - * Constellation space is divided into pie slices sectors. - * - * Each slice is associated with the nearest constellation point. - * - * Works well for PSK but nothing else. - * - * Assumes that there is a constellation point at 1.x - */ - class DIGITAL_API constellation_psk : public constellation_sector - { - public: - typedef boost::shared_ptr<constellation_psk> sptr; - - // public constructor - static sptr make(std::vector<gr_complex> constell, - std::vector<int> pre_diff_code, - unsigned int n_sectors); - - ~constellation_psk(); - - protected: - unsigned int get_sector(const gr_complex *sample); - - unsigned int calc_sector_value(unsigned int sector); - - constellation_psk(std::vector<gr_complex> constell, - std::vector<int> pre_diff_code, - unsigned int n_sectors); - }; - - - /************************************************************/ - /* constellation_bpsk */ - /* */ - /* Only works for BPSK. */ - /* */ - /************************************************************/ - - /*! - * \brief Digital constellation for BPSK - * \ingroup digital - */ - class DIGITAL_API constellation_bpsk : public constellation - { - public: - typedef boost::shared_ptr<constellation_bpsk> sptr; - - // public constructor - static sptr make(); - - ~constellation_bpsk(); - - unsigned int decision_maker(const gr_complex *sample); - - protected: - constellation_bpsk(); - }; - - - /************************************************************/ - /* constellation_qpsk */ - /* */ - /* Only works for QPSK. */ - /* */ - /************************************************************/ - - /*! - * \brief Digital constellation for QPSK - * \ingroup digital - */ - class DIGITAL_API constellation_qpsk : public constellation - { - public: - typedef boost::shared_ptr<constellation_qpsk> sptr; - - // public constructor - static sptr make(); - - ~constellation_qpsk(); - - unsigned int decision_maker(const gr_complex *sample); - - protected: - constellation_qpsk(); - }; - - - /************************************************************/ - /* constellation_dqpsk */ - /* */ - /* Works with differential encoding; slower decisions. */ - /* */ - /************************************************************/ - - /*! - * \brief Digital constellation for DQPSK - * \ingroup digital - */ - class DIGITAL_API constellation_dqpsk : public constellation - { - public: - typedef boost::shared_ptr<constellation_dqpsk> sptr; - - // public constructor - static sptr make(); - - ~constellation_dqpsk(); - - unsigned int decision_maker(const gr_complex *sample); - - protected: - constellation_dqpsk(); - }; - - - /************************************************************/ - /* constellation_8psk */ - /* */ - /* Only works for 8PSK. */ - /* */ - /************************************************************/ - - /*! - * \brief Digital constellation for 8PSK - * \ingroup digital - */ - class DIGITAL_API constellation_8psk : public constellation - { - public: - typedef boost::shared_ptr<constellation_8psk> sptr; - - // public constructor - static sptr make(); - - ~constellation_8psk(); - - unsigned int decision_maker(const gr_complex *sample); - - protected: - constellation_8psk(); - }; - - } /* namespace digital */ -} /* namespace gr */ - -#endif /* INCLUDED_DIGITAL_CONSTELLATION_H */ |