summaryrefslogtreecommitdiff
path: root/gr-digital
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2012-07-07 08:58:08 -0400
committerTom Rondeau <trondeau@vt.edu>2012-07-07 08:58:08 -0400
commitd68086930cc858d936d847507f6e91d3a9159af3 (patch)
tree69627d2322c457bd6d8f860f67f4a6b9f393fa28 /gr-digital
parent01b34d220b5077fef0257d455e13a00daf09545d (diff)
digital: fixing up equalizers to work with new inheritance structure.
Diffstat (limited to 'gr-digital')
-rw-r--r--gr-digital/include/digital_kurtotic_equalizer_cc.h4
-rw-r--r--gr-digital/include/digital_lms_dd_equalizer_cc.h17
-rw-r--r--gr-digital/lib/digital_cma_equalizer_cc.cc19
-rw-r--r--gr-digital/lib/digital_kurtotic_equalizer_cc.cc31
-rw-r--r--gr-digital/lib/digital_lms_dd_equalizer_cc.cc46
-rwxr-xr-xgr-digital/python/qa_cma_equalizer.py6
-rwxr-xr-xgr-digital/python/qa_lms_equalizer.py6
-rw-r--r--gr-digital/swig/digital_lms_dd_equalizer_cc.i12
8 files changed, 69 insertions, 72 deletions
diff --git a/gr-digital/include/digital_kurtotic_equalizer_cc.h b/gr-digital/include/digital_kurtotic_equalizer_cc.h
index 27098f4083..c18d91560c 100644
--- a/gr-digital/include/digital_kurtotic_equalizer_cc.h
+++ b/gr-digital/include/digital_kurtotic_equalizer_cc.h
@@ -93,10 +93,6 @@ protected:
(sign(d_u) * (nrm*cnj - 2.0f*d_p*cnj - conj(d_q)*out) -
abs(d_u)*cnj);
- //std::cout << "out: " << out << " p: " << d_p << " q: " << d_q;
- //std::cout << " m: " << d_m << " u: " << d_u << std::endl;
- //std::cout << "error: " << F << std::endl;
-
float re = gr_clip(F.real(), 1.0);
float im = gr_clip(F.imag(), 1.0);
return gr_complex(re, im);
diff --git a/gr-digital/include/digital_lms_dd_equalizer_cc.h b/gr-digital/include/digital_lms_dd_equalizer_cc.h
index a993776c03..3bb9e935ad 100644
--- a/gr-digital/include/digital_lms_dd_equalizer_cc.h
+++ b/gr-digital/include/digital_lms_dd_equalizer_cc.h
@@ -33,9 +33,9 @@ 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_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)
@@ -80,16 +80,15 @@ private:
digital_constellation_sptr cnst);
float d_mu;
- std::vector<gr_complex> d_taps;
digital_constellation_sptr d_cnst;
- digital_lms_dd_equalizer_cc (int num_taps,
- float mu, int sps,
- digital_constellation_sptr cnst);
+ 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 error(const gr_complex &out)
{
gr_complex decision, error;
d_cnst->map_to_points(d_cnst->decision_maker(&out), &decision);
@@ -97,7 +96,7 @@ protected:
return error;
}
- virtual void update_tap(gr_complex &tap, const gr_complex &in)
+ void update_tap(gr_complex &tap, const gr_complex &in)
{
tap += d_mu*conj(in)*d_error;
}
diff --git a/gr-digital/lib/digital_cma_equalizer_cc.cc b/gr-digital/lib/digital_cma_equalizer_cc.cc
index 6ee9a2f84f..132e5aa1e8 100644
--- a/gr-digital/lib/digital_cma_equalizer_cc.cc
+++ b/gr-digital/lib/digital_cma_equalizer_cc.cc
@@ -27,7 +27,6 @@
#include <digital_cma_equalizer_cc.h>
#include <gr_io_signature.h>
#include <volk/volk.h>
-#include <cstdio>
digital_cma_equalizer_cc_sptr
digital_make_cma_equalizer_cc(int num_taps, float modulus, float mu, int sps)
@@ -48,10 +47,12 @@ digital_cma_equalizer_cc::digital_cma_equalizer_cc(int num_taps, float modulus,
set_gain(mu);
if (num_taps > 0)
d_taps[0] = 1.0;
+ set_taps(d_taps);
const int alignment_multiple =
volk_get_alignment() / sizeof(gr_complex);
set_alignment(std::max(1,alignment_multiple));
+ set_history(num_taps+1);
}
@@ -63,29 +64,19 @@ digital_cma_equalizer_cc::work(int noutput_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.
- }
-
- int j = 0, k, l = d_taps.size();
+ int j = 0;
+ size_t l = d_taps.size();
for(int i = 0; i < noutput_items; i++) {
out[i] = filter(&in[j]);
// Adjust taps
d_error = error(out[i]);
- for(k = 0; k < l; k++) {
+ for(size_t k = 0; k < l; k++) {
update_tap(d_taps[l-k-1], in[j+k]);
}
j += decimation();
}
- std::cout << std::endl;
- std::cout << "noutput_items: " << noutput_items << std::endl;
- std::cout << "nitems_read: " << nitems_read(0) << std::endl;
- std::cout << "nitems_written: " << nitems_written(0) << std::endl;
return noutput_items;
}
diff --git a/gr-digital/lib/digital_kurtotic_equalizer_cc.cc b/gr-digital/lib/digital_kurtotic_equalizer_cc.cc
index 44d292141f..f10ec83482 100644
--- a/gr-digital/lib/digital_kurtotic_equalizer_cc.cc
+++ b/gr-digital/lib/digital_kurtotic_equalizer_cc.cc
@@ -26,6 +26,7 @@
#include <digital_kurtotic_equalizer_cc.h>
#include <gr_io_signature.h>
+#include <volk/volk.h>
digital_kurtotic_equalizer_cc_sptr
digital_make_kurtotic_equalizer_cc(int num_taps, float mu)
@@ -44,6 +45,7 @@ digital_kurtotic_equalizer_cc::digital_kurtotic_equalizer_cc(int num_taps, float
set_gain(mu);
if (num_taps > 0)
d_taps[0] = 1.0;
+ set_taps(d_taps);
d_alpha_p = 0.01;
d_alpha_q = 0.01;
@@ -53,6 +55,11 @@ digital_kurtotic_equalizer_cc::digital_kurtotic_equalizer_cc(int num_taps, float
d_m = 0.0f;
d_q = gr_complex(0,0);
d_u = gr_complex(0,0);
+
+ const int alignment_multiple =
+ volk_get_alignment() / sizeof(gr_complex);
+ set_alignment(std::max(1,alignment_multiple));
+ set_history(num_taps+1);
}
int
@@ -63,21 +70,17 @@ digital_kurtotic_equalizer_cc::work(int noutput_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.
- }
+ int j = 0, k, l = d_taps.size();
+ for(int i = 0; i < noutput_items; i++) {
+ out[i] = filter(&in[j]);
- // 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());
+ // Adjust taps
+ d_error = error(out[i]);
+ for(k = 0; k < l; k++) {
+ update_tap(d_taps[l-k-1], in[j+k]);
+ }
+
+ j += 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 7e22562950..5238063fa7 100644
--- a/gr-digital/lib/digital_lms_dd_equalizer_cc.cc
+++ b/gr-digital/lib/digital_lms_dd_equalizer_cc.cc
@@ -27,7 +27,7 @@
#include <digital_lms_dd_equalizer_cc.h>
#include <gr_io_signature.h>
#include <gr_misc.h>
-#include <iostream>
+#include <volk/volk.h>
digital_lms_dd_equalizer_cc_sptr
digital_make_lms_dd_equalizer_cc(int num_taps, float mu, int sps,
@@ -48,35 +48,35 @@ digital_lms_dd_equalizer_cc::digital_lms_dd_equalizer_cc(int num_taps, float mu,
d_cnst(cnst)
{
set_gain(mu);
- if (num_taps > 0)
- d_taps[num_taps/2] = 1.0;
+ if(num_taps > 0)
+ d_taps[0] = 1.0;
+ set_taps(d_taps);
+
+ const int alignment_multiple =
+ volk_get_alignment() / sizeof(gr_complex);
+ set_alignment(std::max(1,alignment_multiple));
+ set_history(num_taps+1);
}
int
-digital_lms_dd_equalizer_cc::work (int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
+digital_lms_dd_equalizer_cc::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
{
- const gr_complex *in = (const gr_complex *) input_items[0];
- gr_complex *out = (gr_complex *) output_items[0];
-
- gr_complex acc, decision, error;
+ const gr_complex *in = (const gr_complex *)input_items[0];
+ gr_complex *out = (gr_complex *)output_items[0];
+ int j = 0;
+ size_t l = d_taps.size();
for(int i = 0; i < noutput_items; i++) {
- acc = 0;
+ out[i] = filter(&in[j]);
+
+ d_error = error(out[i]);
+ for(size_t k=0; k < l; k++) {
+ update_tap(d_taps[k], in[i+k]);
+ }
- // Compute output
- for (size_t j=0; j < d_taps.size(); j++)
- acc += in[i+j] * conj(d_taps[j]);
-
- d_cnst->map_to_points(d_cnst->decision_maker(&acc), &decision);
- error = decision - acc;
-
- // Update taps
- for (size_t j=0; j < d_taps.size(); j++)
- d_taps[j] += d_mu * conj(error) * in[i+j];
-
- out[i] = acc;
+ j += decimation();
}
return noutput_items;
diff --git a/gr-digital/python/qa_cma_equalizer.py b/gr-digital/python/qa_cma_equalizer.py
index 4632856069..2af1505c1c 100755
--- a/gr-digital/python/qa_cma_equalizer.py
+++ b/gr-digital/python/qa_cma_equalizer.py
@@ -44,7 +44,11 @@ class test_cma_equalizer_fir(gr_unittest.TestCase):
src_data = (1+0j, 0+1j, -1+0j, 0-1j)*1000
expected_data = src_data
result = self.transform(src_data)
- self.assertComplexTuplesAlmostEqual(expected_data, result)
+
+ # only test last N samples to allow for settling. Also adjust
+ # for a 1 sample delay in the filter.
+ N = -500
+ self.assertComplexTuplesAlmostEqual(expected_data[N:-1], result[N+1:])
if __name__ == "__main__":
gr_unittest.run(test_cma_equalizer_fir, "test_cma_equalizer_fir.xml")
diff --git a/gr-digital/python/qa_lms_equalizer.py b/gr-digital/python/qa_lms_equalizer.py
index d5fafbd33a..7bde258e7f 100755
--- a/gr-digital/python/qa_lms_equalizer.py
+++ b/gr-digital/python/qa_lms_equalizer.py
@@ -47,7 +47,11 @@ class test_lms_dd_equalizer(gr_unittest.TestCase):
N = 100 # settling time
expected_data = src_data[N:]
result = self.transform(src_data, 0.1, const)[N:]
- self.assertComplexTuplesAlmostEqual(expected_data, result, 5)
+
+ # only test last N samples to allow for settling. Also adjust
+ # for a 1 sample delay in the filter.
+ N = -500
+ self.assertComplexTuplesAlmostEqual(expected_data[N:-1], result[N+1:])
if __name__ == "__main__":
gr_unittest.run(test_lms_dd_equalizer, "test_lms_dd_equalizer.xml")
diff --git a/gr-digital/swig/digital_lms_dd_equalizer_cc.i b/gr-digital/swig/digital_lms_dd_equalizer_cc.i
index 6602f3bfb5..46ddfce79c 100644
--- a/gr-digital/swig/digital_lms_dd_equalizer_cc.i
+++ b/gr-digital/swig/digital_lms_dd_equalizer_cc.i
@@ -24,17 +24,17 @@
GR_SWIG_BLOCK_MAGIC(digital,lms_dd_equalizer_cc)
digital_lms_dd_equalizer_cc_sptr
-digital_make_lms_dd_equalizer_cc (int num_taps,
- float mu, int sps,
- digital_constellation_sptr cnst);
+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_decimator, public gr::filter::kernel::adaptive_fir_ccc
{
private:
- digital_lms_dd_equalizer_cc (int num_taps,
- float mu, int sps,
- digital_constellation_sptr cnst);
+ digital_lms_dd_equalizer_cc(int num_taps,
+ float mu, int sps,
+ digital_constellation_sptr cnst);
public:
float get_gain();