summaryrefslogtreecommitdiff
path: root/gr-digital
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2012-07-06 18:09:08 -0400
committerTom Rondeau <trondeau@vt.edu>2012-07-06 18:11:04 -0400
commit491e6b0b94e4973ee9b763f85fabda578fbe7f92 (patch)
tree50ca636d2f8bbe68cbe2a4a9d2801d818c200558 /gr-digital
parent5f103b0a99d5f31e0dc55693242b887b8186eac3 (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.h26
-rw-r--r--gr-digital/include/digital_kurtotic_equalizer_cc.h22
-rw-r--r--gr-digital/include/digital_lms_dd_equalizer_cc.h26
-rw-r--r--gr-digital/lib/digital_cma_equalizer_cc.cc41
-rw-r--r--gr-digital/lib/digital_kurtotic_equalizer_cc.cc39
-rw-r--r--gr-digital/lib/digital_lms_dd_equalizer_cc.cc20
-rw-r--r--gr-digital/swig/digital_cma_equalizer_cc.i7
-rw-r--r--gr-digital/swig/digital_kurtotic_equalizer_cc.i8
-rw-r--r--gr-digital/swig/digital_lms_dd_equalizer_cc.i2
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