diff options
author | Tom Rondeau <trondeau@vt.edu> | 2011-06-06 11:36:24 -0400 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2011-06-06 11:51:28 -0400 |
commit | 86553ec410b1074bc4258b22027c5d31443d12ec (patch) | |
tree | 0efb9aba7063285e68ba4004efbaba31562c9cf4 /gr-digital | |
parent | 23ee6269df6f139ef6b85e7f404d452c10bb63a8 (diff) |
digital: converting LMS algorithm to use the gr_adaptive_filter structure and making naming consistent (so CMA and LMS look and behave similary with different error and upate functions).
Diffstat (limited to 'gr-digital')
-rw-r--r-- | gr-digital/grc/digital_lms_dd_equalizer_cc.xml | 9 | ||||
-rw-r--r-- | gr-digital/lib/digital_lms_dd_equalizer_cc.cc | 46 | ||||
-rw-r--r-- | gr-digital/lib/digital_lms_dd_equalizer_cc.h | 50 | ||||
-rw-r--r-- | gr-digital/swig/digital_lms_dd_equalizer_cc.i | 22 |
4 files changed, 77 insertions, 50 deletions
diff --git a/gr-digital/grc/digital_lms_dd_equalizer_cc.xml b/gr-digital/grc/digital_lms_dd_equalizer_cc.xml index b484cb6dbc..0fd7d523b8 100644 --- a/gr-digital/grc/digital_lms_dd_equalizer_cc.xml +++ b/gr-digital/grc/digital_lms_dd_equalizer_cc.xml @@ -8,10 +8,10 @@ <name>LMS DD Equalizer</name> <key>digital_lms_dd_equalizer_cc</key> <import>from gnuradio import digital</import> - <make>digital.lms_dd_equalizer_cc($mu, $num_taps, $cnst)</make> + <make>digital.lms_dd_equalizer_cc($num_taps, $mu, $sps, $cnst)</make> <callback>set_gain($mu)</callback> <param> - <name>Mu</name> + <name>Gain</name> <key>mu</key> <type>real</type> </param> @@ -21,6 +21,11 @@ <type>int</type> </param> <param> + <name>Samples per Symbol</name> + <key>sps</key> + <type>int</type> + </param> + <param> <name>Constellation Object</name> <key>cnst</key> <type>raw</type> diff --git a/gr-digital/lib/digital_lms_dd_equalizer_cc.cc b/gr-digital/lib/digital_lms_dd_equalizer_cc.cc index 77b8ac5792..e2c2f16f28 100644 --- a/gr-digital/lib/digital_lms_dd_equalizer_cc.cc +++ b/gr-digital/lib/digital_lms_dd_equalizer_cc.cc @@ -30,44 +30,29 @@ #include <iostream> digital_lms_dd_equalizer_cc_sptr -digital_make_lms_dd_equalizer_cc (float mu, int ntaps, - digital_constellation_sptr cnst) +digital_make_lms_dd_equalizer_cc(int num_taps, float mu, int sps, + digital_constellation_sptr cnst) { - return gnuradio::get_initial_sptr(new digital_lms_dd_equalizer_cc (mu, ntaps, cnst)); + return gnuradio::get_initial_sptr(new digital_lms_dd_equalizer_cc(num_taps, mu, + sps, cnst)); } -digital_lms_dd_equalizer_cc::digital_lms_dd_equalizer_cc (float mu, int ntaps, - digital_constellation_sptr cnst) - : gr_sync_block ("lms_dd_equalizer_cc", - gr_make_io_signature (1, 1, sizeof (gr_complex)), - gr_make_io_signature (1, 1, sizeof (gr_complex))), - d_taps(ntaps), d_cnst(cnst) +digital_lms_dd_equalizer_cc::digital_lms_dd_equalizer_cc(int num_taps, float mu, + int sps, + digital_constellation_sptr cnst) + : gr_adaptive_fir_ccc("lms_dd_equalizer_cc", sps, + std::vector<gr_complex>(num_taps, gr_complex(0,0))), + d_taps(num_taps), d_cnst(cnst) { - set_mu(mu); - - gr_zero_vector(d_taps); - d_taps [d_taps.size()/2] = 1; - - set_history(ntaps+1); + set_gain(mu); + if (num_taps > 0) + d_taps[num_taps/2] = 1.0; } -float -digital_lms_dd_equalizer_cc::get_mu() -{ - return d_mu; -} -void -digital_lms_dd_equalizer_cc::set_mu(float mu) -{ - if(mu < 0.0f || mu > 1.0f) { - throw std::out_of_range("digital_lms_dd_equalizer::set_mu: Gain value must in [0, 1]"); - } - else { - d_mu = mu; - } -} + +/* int digital_lms_dd_equalizer_cc::work (int noutput_items, gr_vector_const_void_star &input_items, @@ -97,3 +82,4 @@ digital_lms_dd_equalizer_cc::work (int noutput_items, return noutput_items; } +*/ diff --git a/gr-digital/lib/digital_lms_dd_equalizer_cc.h b/gr-digital/lib/digital_lms_dd_equalizer_cc.h index 12c2ecc13d..e3ad4bf4a0 100644 --- a/gr-digital/lib/digital_lms_dd_equalizer_cc.h +++ b/gr-digital/lib/digital_lms_dd_equalizer_cc.h @@ -23,15 +23,16 @@ #ifndef INCLUDED_DIGITAL_LMS_DD_EQUALIZER_CC_H #define INCLUDED_DIGITAL_LMS_DD_EQUALIZER_CC_H -#include <gr_sync_block.h> +#include <gr_adaptive_fir_ccc.h> #include <digital_constellation.h> class digital_lms_dd_equalizer_cc; typedef boost::shared_ptr<digital_lms_dd_equalizer_cc> digital_lms_dd_equalizer_cc_sptr; -digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (float mu, int ntaps, +digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (int num_taps, + float mu, int sps, digital_constellation_sptr cnst); - + /*! * \brief Least-Mean-Square Decision Directed Equalizer (complex in/out) * \ingroup eq_blk @@ -64,25 +65,52 @@ digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (float mu, int * Prentice Hall, 1996. * */ -class digital_lms_dd_equalizer_cc : public gr_sync_block +class digital_lms_dd_equalizer_cc : public gr_adaptive_fir_ccc { private: - friend digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (float mu, int ntaps, + friend digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (int num_taps, + float mu, int sps, digital_constellation_sptr cnst); float d_mu; std::vector<gr_complex> d_taps; digital_constellation_sptr d_cnst; - digital_lms_dd_equalizer_cc (float mu, int ntaps, + digital_lms_dd_equalizer_cc (int num_taps, + float mu, int sps, digital_constellation_sptr cnst); +protected: + + virtual gr_complex error(const gr_complex &out) + { + gr_complex decision, error; + d_cnst->map_to_points(d_cnst->decision_maker(&out), &decision); + error = decision - out; + return error; + } + + virtual void update_tap(gr_complex &tap, const gr_complex &in) + { + tap += d_mu*conj(in)*d_error; + } + public: - float get_mu(); - void set_mu(float mu); - int work (int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + float get_gain() + { + return d_mu; + } + + void set_gain(float mu) + { + if(mu < 0.0f || mu > 1.0f) { + throw std::out_of_range("digital_lms_dd_equalizer::set_mu: Gain value must in [0, 1]"); + } + else { + d_mu = mu; + } + } + }; #endif diff --git a/gr-digital/swig/digital_lms_dd_equalizer_cc.i b/gr-digital/swig/digital_lms_dd_equalizer_cc.i index ac6accc6b7..bd5c6ae29d 100644 --- a/gr-digital/swig/digital_lms_dd_equalizer_cc.i +++ b/gr-digital/swig/digital_lms_dd_equalizer_cc.i @@ -23,16 +23,24 @@ GR_SWIG_BLOCK_MAGIC(digital,lms_dd_equalizer_cc) -digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (float mu, int ntaps, - digital_constellation_sptr cnst); +// retrieve info on the base class, without generating wrappers since +// the base class has a pure virual method. +%import "gr_adaptive_fir_ccc.i" + + +digital_lms_dd_equalizer_cc_sptr +digital_make_lms_dd_equalizer_cc (int num_taps, + float mu, int sps, + digital_constellation_sptr cnst); class digital_lms_dd_equalizer_cc : public gr_sync_block { -public: - float get_mu(); - void set_mu(float mu); - private: - digital_lms_dd_equalizer_cc (float mu, int ntaps, + digital_lms_dd_equalizer_cc (int num_taps, + float mu, int sps, digital_constellation_sptr cnst); + +public: + float get_gain(); + void set_gain(float mu); }; |