diff options
author | Tom Rondeau <trondeau@vt.edu> | 2012-07-07 08:58:08 -0400 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2012-07-07 08:58:08 -0400 |
commit | d68086930cc858d936d847507f6e91d3a9159af3 (patch) | |
tree | 69627d2322c457bd6d8f860f67f4a6b9f393fa28 /gr-digital | |
parent | 01b34d220b5077fef0257d455e13a00daf09545d (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.h | 4 | ||||
-rw-r--r-- | gr-digital/include/digital_lms_dd_equalizer_cc.h | 17 | ||||
-rw-r--r-- | gr-digital/lib/digital_cma_equalizer_cc.cc | 19 | ||||
-rw-r--r-- | gr-digital/lib/digital_kurtotic_equalizer_cc.cc | 31 | ||||
-rw-r--r-- | gr-digital/lib/digital_lms_dd_equalizer_cc.cc | 46 | ||||
-rwxr-xr-x | gr-digital/python/qa_cma_equalizer.py | 6 | ||||
-rwxr-xr-x | gr-digital/python/qa_lms_equalizer.py | 6 | ||||
-rw-r--r-- | gr-digital/swig/digital_lms_dd_equalizer_cc.i | 12 |
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(); |