summaryrefslogtreecommitdiff
path: root/gr-digital
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2011-06-06 11:36:24 -0400
committerTom Rondeau <trondeau@vt.edu>2011-06-06 11:51:28 -0400
commit86553ec410b1074bc4258b22027c5d31443d12ec (patch)
tree0efb9aba7063285e68ba4004efbaba31562c9cf4 /gr-digital
parent23ee6269df6f139ef6b85e7f404d452c10bb63a8 (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.xml9
-rw-r--r--gr-digital/lib/digital_lms_dd_equalizer_cc.cc46
-rw-r--r--gr-digital/lib/digital_lms_dd_equalizer_cc.h50
-rw-r--r--gr-digital/swig/digital_lms_dd_equalizer_cc.i22
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);
};