diff options
author | Tom Rondeau <trondeau@vt.edu> | 2012-07-06 18:09:08 -0400 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2012-07-06 18:11:04 -0400 |
commit | 491e6b0b94e4973ee9b763f85fabda578fbe7f92 (patch) | |
tree | 50ca636d2f8bbe68cbe2a4a9d2801d818c200558 /gr-digital | |
parent | 5f103b0a99d5f31e0dc55693242b887b8186eac3 (diff) |
digital: updated equalizers to use new gr::filter::kernel::adaptive_fir_ccc.
Diffstat (limited to 'gr-digital')
-rw-r--r-- | gr-digital/include/digital_cma_equalizer_cc.h | 26 | ||||
-rw-r--r-- | gr-digital/include/digital_kurtotic_equalizer_cc.h | 22 | ||||
-rw-r--r-- | gr-digital/include/digital_lms_dd_equalizer_cc.h | 26 | ||||
-rw-r--r-- | gr-digital/lib/digital_cma_equalizer_cc.cc | 41 | ||||
-rw-r--r-- | gr-digital/lib/digital_kurtotic_equalizer_cc.cc | 39 | ||||
-rw-r--r-- | gr-digital/lib/digital_lms_dd_equalizer_cc.cc | 20 | ||||
-rw-r--r-- | gr-digital/swig/digital_cma_equalizer_cc.i | 7 | ||||
-rw-r--r-- | gr-digital/swig/digital_kurtotic_equalizer_cc.i | 8 | ||||
-rw-r--r-- | gr-digital/swig/digital_lms_dd_equalizer_cc.i | 2 |
9 files changed, 139 insertions, 52 deletions
diff --git a/gr-digital/include/digital_cma_equalizer_cc.h b/gr-digital/include/digital_cma_equalizer_cc.h index 79e84ca4b3..551048afd4 100644 --- a/gr-digital/include/digital_cma_equalizer_cc.h +++ b/gr-digital/include/digital_cma_equalizer_cc.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2011 Free Software Foundation, Inc. + * Copyright 2011,2012 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -24,9 +24,11 @@ #define INCLUDED_DIGITAL_CMA_EQUALIZER_CC_H #include <digital_api.h> -#include <gr_adaptive_fir_ccc.h> +#include <gr_sync_decimator.h> +#include <filter/adaptive_fir.h> #include <gr_math.h> #include <iostream> +#include <stdexcept> class digital_cma_equalizer_cc; typedef boost::shared_ptr<digital_cma_equalizer_cc> digital_cma_equalizer_cc_sptr; @@ -45,21 +47,23 @@ digital_make_cma_equalizer_cc(int num_taps, float modulus, float mu, int sps); * Two-Dimensional Data Communication Systems," IEEE Transactions on * Communications, Vol. 28, No. 11, pp. 1867 - 1875, 1980." */ -class DIGITAL_API digital_cma_equalizer_cc : public gr_adaptive_fir_ccc +class DIGITAL_API digital_cma_equalizer_cc : + public gr_sync_decimator, public gr::filter::kernel::adaptive_fir_ccc { private: float d_modulus; float d_mu; - friend DIGITAL_API digital_cma_equalizer_cc_sptr digital_make_cma_equalizer_cc(int num_taps, - float modulus, - float mu, - int sps); + friend DIGITAL_API digital_cma_equalizer_cc_sptr + digital_make_cma_equalizer_cc(int num_taps, + float modulus, + float mu, + int sps); digital_cma_equalizer_cc(int num_taps, float modulus, float mu, int sps); protected: - virtual gr_complex error(const gr_complex &out) + gr_complex error(const gr_complex &out) { gr_complex error = out*(norm(out) - d_modulus); float re = gr_clip(error.real(), 1.0); @@ -67,7 +71,7 @@ protected: return gr_complex(re, im); } - virtual void update_tap(gr_complex &tap, const gr_complex &in) + void update_tap(gr_complex &tap, const gr_complex &in) { // Hn+1 = Hn - mu*conj(Xn)*zn*(|zn|^2 - 1) tap -= d_mu*conj(in)*d_error; @@ -98,6 +102,10 @@ public: throw std::out_of_range("digital_cma_equalizer::set_modulus: Modulus value must be >= 0"); d_modulus = mod; } + + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); }; #endif diff --git a/gr-digital/include/digital_kurtotic_equalizer_cc.h b/gr-digital/include/digital_kurtotic_equalizer_cc.h index fed88c3741..27098f4083 100644 --- a/gr-digital/include/digital_kurtotic_equalizer_cc.h +++ b/gr-digital/include/digital_kurtotic_equalizer_cc.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2011 Free Software Foundation, Inc. + * Copyright 2011,2012 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -24,9 +24,11 @@ #define INCLUDED_DIGITAL_KURTOTIC_EQUALIZER_CC_H #include <digital_api.h> -#include <gr_adaptive_fir_ccc.h> +#include <gr_sync_decimator.h> +#include <filter/adaptive_fir.h> #include <gr_math.h> #include <iostream> +#include <stdexcept> class digital_kurtotic_equalizer_cc; typedef boost::shared_ptr<digital_kurtotic_equalizer_cc> digital_kurtotic_equalizer_cc_sptr; @@ -39,11 +41,14 @@ digital_make_kurtotic_equalizer_cc(int num_taps, float mu); * \ingroup eq_blk * \ingroup digital * + * WARNING: This block does not yet work. + * * "Y. Guo, J. Zhao, Y. Sun, "Sign kurtosis maximization based blind * equalization algorithm," IEEE Conf. on Control, Automation, * Robotics and Vision, Vol. 3, Dec. 2004, pp. 2052 - 2057." */ -class DIGITAL_API digital_kurtotic_equalizer_cc : public gr_adaptive_fir_ccc +class DIGITAL_API digital_kurtotic_equalizer_cc : + public gr_sync_decimator, public gr::filter::kernel::adaptive_fir_ccc { private: float d_mu; @@ -51,8 +56,9 @@ private: gr_complex d_q, d_u; float d_alpha_p, d_alpha_q, d_alpha_m; - friend DIGITAL_API digital_kurtotic_equalizer_cc_sptr digital_make_kurtotic_equalizer_cc(int num_taps, - float mu); + friend DIGITAL_API digital_kurtotic_equalizer_cc_sptr + digital_make_kurtotic_equalizer_cc(int num_taps, float mu); + digital_kurtotic_equalizer_cc(int num_taps, float mu); gr_complex sign(gr_complex x) @@ -108,6 +114,12 @@ public: throw std::out_of_range("digital_kurtotic_equalizer::set_gain: Gain value must be >= 0"); d_mu = mu; } + + float gain() const { return d_mu; } + + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); }; #endif diff --git a/gr-digital/include/digital_lms_dd_equalizer_cc.h b/gr-digital/include/digital_lms_dd_equalizer_cc.h index 56871fa678..a993776c03 100644 --- a/gr-digital/include/digital_lms_dd_equalizer_cc.h +++ b/gr-digital/include/digital_lms_dd_equalizer_cc.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2011 Free Software Foundation, Inc. + * Copyright 2011,2012 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -24,15 +24,18 @@ #define INCLUDED_DIGITAL_LMS_DD_EQUALIZER_CC_H #include <digital_api.h> -#include <gr_adaptive_fir_ccc.h> +#include <gr_sync_decimator.h> +#include <filter/adaptive_fir.h> #include <digital_constellation.h> +#include <stdexcept> class digital_lms_dd_equalizer_cc; typedef boost::shared_ptr<digital_lms_dd_equalizer_cc> digital_lms_dd_equalizer_cc_sptr; -DIGITAL_API digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (int num_taps, - float mu, int sps, - digital_constellation_sptr cnst); +DIGITAL_API 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) @@ -67,12 +70,14 @@ DIGITAL_API digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (i * Prentice Hall, 1996. * */ -class DIGITAL_API digital_lms_dd_equalizer_cc : public gr_adaptive_fir_ccc +class DIGITAL_API digital_lms_dd_equalizer_cc : + public gr_sync_decimator, public gr::filter::kernel::adaptive_fir_ccc { private: - friend DIGITAL_API digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (int num_taps, - float mu, int sps, - digital_constellation_sptr cnst); + friend DIGITAL_API 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; @@ -113,6 +118,9 @@ public: } } + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); }; #endif diff --git a/gr-digital/lib/digital_cma_equalizer_cc.cc b/gr-digital/lib/digital_cma_equalizer_cc.cc index c6c46c2d8c..23ad9d19c2 100644 --- a/gr-digital/lib/digital_cma_equalizer_cc.cc +++ b/gr-digital/lib/digital_cma_equalizer_cc.cc @@ -25,22 +25,55 @@ #endif #include <digital_cma_equalizer_cc.h> +#include <gr_io_signature.h> #include <cstdio> digital_cma_equalizer_cc_sptr digital_make_cma_equalizer_cc(int num_taps, float modulus, float mu, int sps) { - return gnuradio::get_initial_sptr(new digital_cma_equalizer_cc(num_taps, modulus, - mu, sps)); + return gnuradio::get_initial_sptr + (new digital_cma_equalizer_cc(num_taps, modulus, mu, sps)); } digital_cma_equalizer_cc::digital_cma_equalizer_cc(int num_taps, float modulus, float mu, int sps) - : gr_adaptive_fir_ccc("cma_equalizer_cc", sps, - std::vector<gr_complex>(num_taps, gr_complex(0,0))) + : gr_sync_decimator("cma_equalizer_cc", + gr_make_io_signature(1, 1, sizeof(gr_complex)), + gr_make_io_signature(1, 1, sizeof(gr_complex)), + sps), + gr::filter::kernel::adaptive_fir_ccc(sps, std::vector<gr_complex>(num_taps, gr_complex(0,0))) { set_modulus(modulus); set_gain(mu); if (num_taps > 0) d_taps[0] = 1.0; } + + +int +digital_cma_equalizer_cc::work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + gr_complex *in = (gr_complex *)input_items[0]; + gr_complex *out = (gr_complex *)output_items[0]; + + if(d_updated) { + gr::filter::kernel::fir_filter_ccc::set_taps(d_new_taps); + set_history(d_ntaps); + d_updated = false; + return 0; // history requirements may have changed. + } + + // Call base class filtering function that uses + // overloaded error and update_tap functions. + if(decimation() == 1) { + filterN(out, in, noutput_items); + } + else { + filterNdec(out, in, noutput_items, + decimation()); + } + + return noutput_items; +} diff --git a/gr-digital/lib/digital_kurtotic_equalizer_cc.cc b/gr-digital/lib/digital_kurtotic_equalizer_cc.cc index c95b560216..44d292141f 100644 --- a/gr-digital/lib/digital_kurtotic_equalizer_cc.cc +++ b/gr-digital/lib/digital_kurtotic_equalizer_cc.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2011 Free Software Foundation, Inc. + * Copyright 2011,2012 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -25,15 +25,21 @@ #endif #include <digital_kurtotic_equalizer_cc.h> +#include <gr_io_signature.h> digital_kurtotic_equalizer_cc_sptr digital_make_kurtotic_equalizer_cc(int num_taps, float mu) { - return gnuradio::get_initial_sptr(new digital_kurtotic_equalizer_cc(num_taps, mu)); + return gnuradio::get_initial_sptr + (new digital_kurtotic_equalizer_cc(num_taps, mu)); } digital_kurtotic_equalizer_cc::digital_kurtotic_equalizer_cc(int num_taps, float mu) - : gr_adaptive_fir_ccc("kurtotic_equalizer_cc", 1, std::vector<gr_complex>(num_taps)) + : gr_sync_decimator("kurtotic_equalizer_cc", + gr_make_io_signature(1, 1, sizeof(gr_complex)), + gr_make_io_signature(1, 1, sizeof(gr_complex)), + 1), + gr::filter::kernel::adaptive_fir_ccc(1, std::vector<gr_complex>(num_taps, gr_complex(0,0))) { set_gain(mu); if (num_taps > 0) @@ -49,3 +55,30 @@ digital_kurtotic_equalizer_cc::digital_kurtotic_equalizer_cc(int num_taps, float d_u = gr_complex(0,0); } +int +digital_kurtotic_equalizer_cc::work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + gr_complex *in = (gr_complex *)input_items[0]; + gr_complex *out = (gr_complex *)output_items[0]; + + if(d_updated) { + gr::filter::kernel::fir_filter_ccc::set_taps(d_new_taps); + set_history(d_ntaps); + d_updated = false; + return 0; // history requirements may have changed. + } + + // Call base class filtering function that uses + // overloaded error and update_tap functions. + if(decimation() == 1) { + filterN(out, in, noutput_items); + } + else { + filterNdec(out, in, noutput_items, + decimation()); + } + + return noutput_items; +} diff --git a/gr-digital/lib/digital_lms_dd_equalizer_cc.cc b/gr-digital/lib/digital_lms_dd_equalizer_cc.cc index e2c2f16f28..7e22562950 100644 --- a/gr-digital/lib/digital_lms_dd_equalizer_cc.cc +++ b/gr-digital/lib/digital_lms_dd_equalizer_cc.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2011 Free Software Foundation, Inc. + * Copyright 2011,2012 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -33,26 +33,25 @@ digital_lms_dd_equalizer_cc_sptr 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(num_taps, mu, - sps, 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(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) + : gr_sync_decimator("lms_dd_equalizer_cc", + gr_make_io_signature(1, 1, sizeof(gr_complex)), + gr_make_io_signature(1, 1, sizeof(gr_complex)), + sps), + gr::filter::kernel::adaptive_fir_ccc(sps, std::vector<gr_complex>(num_taps, gr_complex(0,0))), + d_cnst(cnst) { set_gain(mu); if (num_taps > 0) d_taps[num_taps/2] = 1.0; } - - - -/* int digital_lms_dd_equalizer_cc::work (int noutput_items, gr_vector_const_void_star &input_items, @@ -82,4 +81,3 @@ digital_lms_dd_equalizer_cc::work (int noutput_items, return noutput_items; } -*/ diff --git a/gr-digital/swig/digital_cma_equalizer_cc.i b/gr-digital/swig/digital_cma_equalizer_cc.i index 183e43ef94..9c2d5f2146 100644 --- a/gr-digital/swig/digital_cma_equalizer_cc.i +++ b/gr-digital/swig/digital_cma_equalizer_cc.i @@ -22,15 +22,12 @@ GR_SWIG_BLOCK_MAGIC(digital,cma_equalizer_cc) -// 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_cma_equalizer_cc_sptr digital_make_cma_equalizer_cc(int num_taps, float modulus, float mu, int sps); -class digital_cma_equalizer_cc : public gr_adaptive_fir_ccc +class digital_cma_equalizer_cc : + public gr::filter::kernel::adaptive_fir_ccc { private: digital_cma_equalizer_cc(int num_taps, float modulus, diff --git a/gr-digital/swig/digital_kurtotic_equalizer_cc.i b/gr-digital/swig/digital_kurtotic_equalizer_cc.i index 67a9dc6fdc..24183b5f2a 100644 --- a/gr-digital/swig/digital_kurtotic_equalizer_cc.i +++ b/gr-digital/swig/digital_kurtotic_equalizer_cc.i @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2011 Free Software Foundation, Inc. + * Copyright 2011,2012 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -24,7 +24,7 @@ GR_SWIG_BLOCK_MAGIC(digital,kurtotic_equalizer_cc) // retrieve info on the base class, without generating wrappers since // the base class has a pure virual method. -%import "gr_adaptive_fir_ccc.i" +//%import "gr_adaptive_fir_ccc.i" digital_kurtotic_equalizer_cc_sptr digital_make_kurtotic_equalizer_cc(int num_taps, @@ -32,9 +32,7 @@ digital_make_kurtotic_equalizer_cc(int num_taps, class digital_kurtotic_equalizer_cc : public gr_adaptive_fir_ccc { -private: - digital_kurtotic_equalizer_cc(int num_taps, float mu); - public: void set_gain(float mu); + float gain() const; }; diff --git a/gr-digital/swig/digital_lms_dd_equalizer_cc.i b/gr-digital/swig/digital_lms_dd_equalizer_cc.i index bd5c6ae29d..ac2504b0a9 100644 --- a/gr-digital/swig/digital_lms_dd_equalizer_cc.i +++ b/gr-digital/swig/digital_lms_dd_equalizer_cc.i @@ -25,7 +25,7 @@ GR_SWIG_BLOCK_MAGIC(digital,lms_dd_equalizer_cc) // retrieve info on the base class, without generating wrappers since // the base class has a pure virual method. -%import "gr_adaptive_fir_ccc.i" +//%import "gr_adaptive_fir_ccc.i" digital_lms_dd_equalizer_cc_sptr |