diff options
-rw-r--r-- | gnuradio-core/src/lib/general/gr_cpm.h | 81 | ||||
-rw-r--r-- | gnuradio-core/src/lib/hier/gr_cpmmod_bc.h | 27 | ||||
-rw-r--r-- | gnuradio-core/src/lib/hier/gr_gmskmod_bc.cc | 6 | ||||
-rw-r--r-- | gnuradio-core/src/lib/hier/gr_gmskmod_bc.h | 28 | ||||
-rw-r--r-- | gnuradio-core/src/lib/hier/gr_gmskmod_bc.i | 4 | ||||
-rwxr-xr-x | gnuradio-core/src/python/gnuradio/gr/qa_cpm.py | 3 |
6 files changed, 73 insertions, 76 deletions
diff --git a/gnuradio-core/src/lib/general/gr_cpm.h b/gnuradio-core/src/lib/general/gr_cpm.h index f9b97f7ea..09598024a 100644 --- a/gnuradio-core/src/lib/general/gr_cpm.h +++ b/gnuradio-core/src/lib/general/gr_cpm.h @@ -1,17 +1,17 @@ /* -*- c++ -*- */ /* * Copyright 2010 Free Software Foundation, Inc. - * + * * 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, @@ -24,7 +24,9 @@ #include <vector> -#define M_TWOPI (2*M_PI) +#ifndef M_TWOPI +# define M_TWOPI (2*M_PI) +#endif class gr_cpm { @@ -38,41 +40,42 @@ class gr_cpm GENERIC = 999 }; - //! Return the taps for an interpolating FIR filter (gr_fir_filter_fff). - // - // These taps represent the phase response for use in a CPM modulator. - // - // Parameters: - // \p type: The CPM type (Rectangular, Raised Cosine, Spectral Raised Cosine, - // Tamed FM or Gaussian). - // \p samples_per_sym: Samples per symbol. - // \p L: The length of the phase response in symbols. - // \p beta: For Spectral Raised Cosine, this is the rolloff factor. For Gaussian - // phase responses, this the 3dB-time-bandwidth product. For all other - // cases, it is ignored. - // - // Output: returns a vector of length \p L * \p samples_per_sym. This can be used - // directly in an interpolating FIR filter such as gr_interp_fir_filter_fff - // with interpolation factor \p samples_per_sym. - // - // All taps are normalised s.t. \sum taps = 1; this causes a maximum phase change - // of h*pi between two symbols, where h is the modulation index. - // - // The following phase responses can be generated: - // * LREC: Rectangular phase response. - // * LRC: Raised cosine phase response, looks like 1 - cos(x). - // * LSRC: Spectral raised cosine. This requires a rolloff factor beta. - // The phase response is the Fourier transform of raised cosine - // function. - // * TFM: Tamed frequency modulation. This scheme minimizes phase change for - // rapidly varying input symbols. - // * GAUSSIAN: A Gaussian phase response. For a modulation index h = 1/2, this - // results in GMSK. - // - // A short description of all these phase responses can be found in [1]. - // - // - // [1]: Anderson, Aulin and Sundberg; Digital Phase Modulation + /*! \brief Return the taps for an interpolating FIR filter (gr_interp_fir_filter_fff). + * + * These taps represent the phase response \f$g(k)\f$ for use in a CPM modulator, + * see also gr_cpmmod_bc. + * + * \param type The CPM type (Rectangular, Raised Cosine, Spectral Raised Cosine, + * Tamed FM or Gaussian). + * \param samples_per_sym Samples per symbol. + * \param L The length of the phase response in symbols. + * \param beta For Spectral Raised Cosine, this is the rolloff factor. For Gaussian + * phase responses, this the 3dB-time-bandwidth product. For all other + * cases, it is ignored. + * + * Output: returns a vector of length \a K = \p samples_per_sym x \p L. + * This can be used directly in an interpolating FIR filter such as + * gr_interp_fir_filter_fff with interpolation factor \p samples_per_sym. + * + * All phase responses are normalised s.t. \f$ \sum_{k=0}^{K-1} g(k) = 1\f$; this will cause + * a maximum phase change of \f$ h \cdot \pi\f$ between two symbols, where \a h is the + * modulation index. + * + * The following phase responses can be generated: + * - LREC: Rectangular phase response. + * - LRC: Raised cosine phase response, looks like 1 - cos(x). + * - LSRC: Spectral raised cosine. This requires a rolloff factor beta. + * The phase response is the Fourier transform of raised cosine + * function. + * - TFM: Tamed frequency modulation. This scheme minimizes phase change for + * rapidly varying input symbols. + * - GAUSSIAN: A Gaussian phase response. For a modulation index h = 1/2, this + * results in GMSK. + * + * A short description of all these phase responses can be found in [1]. + * + * [1]: Anderson, Aulin and Sundberg; Digital Phase Modulation + */ static std::vector<float> phase_response(cpm_type type, unsigned samples_per_sym, unsigned L, double beta=0.3); }; diff --git a/gnuradio-core/src/lib/hier/gr_cpmmod_bc.h b/gnuradio-core/src/lib/hier/gr_cpmmod_bc.h index f32d0fdca..210b30612 100644 --- a/gnuradio-core/src/lib/hier/gr_cpmmod_bc.h +++ b/gnuradio-core/src/lib/hier/gr_cpmmod_bc.h @@ -43,22 +43,21 @@ gr_make_cpmmod_bc(int type, float h, unsigned samples_per_sym, unsigned L, doubl * * \ingroup modulation_blk * - * Parameters: - * * \p type: The modulation type. Can be one of LREC, LRC, LSRC, TFM or GAUSSIAN. See - * gr_cpm::phase_response() for a detailed description. - * * \p h: The modulation index. h*PI is the maximum phase change that can occur - * between two symbols, i.e., if you only send ones, the phase will increase - * by h*PI every \p samples_per_sym samples. Set this to 0.5 for Minimum Shift - * Keying variants. - * * \p samples_per_sym: Samples per symbol. - * * \p L: The length of the phase duration in symbols. For L=1, this yields full- - * response CPM symbols, for L > 1, partial-response. - * * \p beta: For LSRC, this is the rolloff factor. For Gaussian pulses, this is the 3 dB - * time-bandwidth product. + * \param type The modulation type. Can be one of LREC, LRC, LSRC, TFM or GAUSSIAN. See + * gr_cpm::phase_response() for a detailed description. + * \param h The modulation index. \f$ h \cdot \pi\f$ is the maximum phase change that can occur + * between two symbols, i.e., if you only send ones, the phase will increase + * by \f$ h \cdot \pi\f$ every \p samples_per_sym samples. Set this to 0.5 for Minimum Shift + * Keying variants. + * \param samples_per_sym Samples per symbol. + * \param L The length of the phase duration in symbols. For L=1, this yields full- + * response CPM symbols, for L > 1, partial-response. + * \param beta For LSRC, this is the rolloff factor. For Gaussian pulses, this is the 3 dB + * time-bandwidth product. * * Examples: - * * Setting h = 0.5, L = 1, type = LREC yields MSK. - * * Setting h = 0.5, type = GAUSSIAN and beta = 0.3 yields GMSK as used in GSM. + * - Setting h = 0.5, L = 1, type = LREC yields MSK. + * - Setting h = 0.5, type = GAUSSIAN and beta = 0.3 yields GMSK as used in GSM. * * The input of this block are symbols from an M-ary alphabet * +/-1, +/-3, ..., +/-(M-1). Usually, M = 2 and therefore, the diff --git a/gnuradio-core/src/lib/hier/gr_gmskmod_bc.cc b/gnuradio-core/src/lib/hier/gr_gmskmod_bc.cc index 9324edc96..37128d99c 100644 --- a/gnuradio-core/src/lib/hier/gr_gmskmod_bc.cc +++ b/gnuradio-core/src/lib/hier/gr_gmskmod_bc.cc @@ -28,13 +28,13 @@ // Shared pointer constructor gr_gmskmod_bc_sptr -gr_make_gmskmod_bc(unsigned samples_per_sym, unsigned L, double bt) +gr_make_gmskmod_bc(unsigned samples_per_sym, double bt, unsigned L) { - return gnuradio::get_initial_sptr(new gr_gmskmod_bc(samples_per_sym, L, bt)); + return gnuradio::get_initial_sptr(new gr_gmskmod_bc(samples_per_sym, bt, L)); } -gr_gmskmod_bc::gr_gmskmod_bc(unsigned samples_per_sym, unsigned L, double bt) +gr_gmskmod_bc::gr_gmskmod_bc(unsigned samples_per_sym, double bt, unsigned L) : gr_cpmmod_bc(gr_cpm::GAUSSIAN, 0.5, samples_per_sym, L, bt) { } diff --git a/gnuradio-core/src/lib/hier/gr_gmskmod_bc.h b/gnuradio-core/src/lib/hier/gr_gmskmod_bc.h index bfe0513e1..39bd576e2 100644 --- a/gnuradio-core/src/lib/hier/gr_gmskmod_bc.h +++ b/gnuradio-core/src/lib/hier/gr_gmskmod_bc.h @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2010 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, @@ -30,7 +30,7 @@ typedef boost::shared_ptr<gr_gmskmod_bc> gr_gmskmod_bc_sptr; gr_gmskmod_bc_sptr -gr_make_gmskmod_bc(unsigned samples_per_sym=2, unsigned L=4, double bt=0.3); +gr_make_gmskmod_bc(unsigned samples_per_sym=2, double bt=0.3, unsigned L=4); /*! @@ -38,16 +38,10 @@ gr_make_gmskmod_bc(unsigned samples_per_sym=2, unsigned L=4, double bt=0.3); * * \ingroup modulation_blk * - * Parameters: - * * \p samples_per_sym: Samples per symbol. - * * \p L: The length of the phase duration in symbols. The Gaussian pulse is truncated - * after L symbols. - * * \p bt: For LSRC, this is the rolloff factor. For Gaussian pulses, this is the 3 dB - * time-bandwidth product. - * - * Examples: - * * Setting h = 0.5, L = 1, type = LREC yields MSK. - * * Setting h = 0.5, type = GAUSSIAN and beta = 0.3 yields GMSK as used in GSM. + * \param samples_per_sym Samples per symbol. + * \param bt The 3 dB time-bandwidth product. + * \param L The length of the phase duration in symbols. The Gaussian pulse is truncated + * after L symbols. * * The input of this block are symbols from an M-ary alphabet * +/-1, +/-3, ..., +/-(M-1). Usually, M = 2 and therefore, the @@ -57,8 +51,8 @@ gr_make_gmskmod_bc(unsigned samples_per_sym=2, unsigned L=4, double bt=0.3); */ class gr_gmskmod_bc : public gr_cpmmod_bc { - friend gr_gmskmod_bc_sptr gr_make_gmskmod_bc(unsigned samples_per_sym, unsigned L, double bt); - gr_gmskmod_bc(unsigned samples_per_sym, unsigned L, double bt); + friend gr_gmskmod_bc_sptr gr_make_gmskmod_bc(unsigned samples_per_sym, double bt, unsigned L); + gr_gmskmod_bc(unsigned samples_per_sym, double bt, unsigned L); }; #endif /* INCLUDED_GR_GMSKMOD_BC_H */ diff --git a/gnuradio-core/src/lib/hier/gr_gmskmod_bc.i b/gnuradio-core/src/lib/hier/gr_gmskmod_bc.i index 7fb16839b..dadf3be62 100644 --- a/gnuradio-core/src/lib/hier/gr_gmskmod_bc.i +++ b/gnuradio-core/src/lib/hier/gr_gmskmod_bc.i @@ -23,12 +23,12 @@ GR_SWIG_BLOCK_MAGIC(gr, gmskmod_bc) gr_gmskmod_bc_sptr -gr_make_gmskmod_bc(unsigned samples_per_sym=2, unsigned L=4, double bt=0.3); +gr_make_gmskmod_bc(unsigned samples_per_sym=2, double bt=0.3, unsigned L=4); class gr_gmskmod_bc : public gr_hier_block2 { private: - gr_cpmmod_bc(int type, float h, unsigned samples_per_sym, unsigned L, double beta); + gr_cpmmod_bc(int type, float h, unsigned samples_per_sym, double beta, unsigned L); public: std::vector<float> get_taps(); diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_cpm.py b/gnuradio-core/src/python/gnuradio/gr/qa_cpm.py index 9cc22c257..b28decce2 100755 --- a/gnuradio-core/src/python/gnuradio/gr/qa_cpm.py +++ b/gnuradio-core/src/python/gnuradio/gr/qa_cpm.py @@ -64,9 +64,10 @@ class test_cpm(gr_unittest.TestCase): def test_001_lgmsk(self): sps = 2 L = 5 + bt = 0.3 in_bits = (1,) * 20 src = gr.vector_source_b(in_bits, False) - gmsk = gr.gmskmod_bc(sps, L) + gmsk = gr.gmskmod_bc(sps, bt, L) arg = gr.complex_to_arg() sink = gr.vector_sink_f() |