summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnuradio-core/src/lib/general/gr_cpm.h81
-rw-r--r--gnuradio-core/src/lib/hier/gr_cpmmod_bc.h27
-rw-r--r--gnuradio-core/src/lib/hier/gr_gmskmod_bc.cc6
-rw-r--r--gnuradio-core/src/lib/hier/gr_gmskmod_bc.h28
-rw-r--r--gnuradio-core/src/lib/hier/gr_gmskmod_bc.i4
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_cpm.py3
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()