GNU Radio 3.7.1 C++ API
|
Least-Mean-Square Decision Directed Equalizer (complex in/out) More...
#include <lms_dd_equalizer_cc.h>
Public Types | |
typedef boost::shared_ptr < lms_dd_equalizer_cc > | sptr |
Public Member Functions | |
virtual void | set_taps (const std::vector< gr_complex > &taps)=0 |
virtual std::vector< gr_complex > | taps () const =0 |
virtual float | gain () const =0 |
virtual void | set_gain (float mu)=0 |
Static Public Member Functions | |
static sptr | make (int num_taps, float mu, int sps, constellation_sptr cnst) |
Protected Member Functions | |
virtual gr_complex | error (const gr_complex &out)=0 |
virtual void | update_tap (gr_complex &tap, const gr_complex &in)=0 |
Least-Mean-Square Decision Directed Equalizer (complex in/out)
This block implements an LMS-based decision-directed equalizer. It uses a set of weights, w, to correlate against the inputs, u, and a decisions is then made from this output. The error in the decision is used to update the weight vector.
y[n] = conj(w[n]) u[n] d[n] = decision(y[n]) e[n] = d[n] - y[n] w[n+1] = w[n] + mu u[n] conj(e[n])
Where mu is a gain value (between 0 and 1 and usualy small, around 0.001 - 0.01.
This block uses the digital_constellation object for making the decision from y[n]. Create the constellation object for whatever constellation is to be used and pass in the object. In Python, you can use something like:
self.constellation = digital.constellation_qpsk()
To create a QPSK constellation (see the digital_constellation block for more details as to what constellations are available or how to create your own). You then pass the object to this block as an sptr, or using "self.constellation.base()".
The theory for this algorithm can be found in Chapter 9 of: S. Haykin, Adaptive Filter Theory, Upper Saddle River, NJ: Prentice Hall, 1996.
virtual gr_complex gr::digital::lms_dd_equalizer_cc::error | ( | const gr_complex & | out | ) | [protected, pure virtual] |
virtual float gr::digital::lms_dd_equalizer_cc::gain | ( | ) | const [pure virtual] |
static sptr gr::digital::lms_dd_equalizer_cc::make | ( | int | num_taps, |
float | mu, | ||
int | sps, | ||
constellation_sptr | cnst | ||
) | [static] |
Make an LMS decision-directed equalizer
num_taps | Numer of taps in the equalizer (channel size) |
mu | Gain of the update loop |
sps | Number of samples per symbol of the input signal |
cnst | A constellation derived from class 'constellation'. Use base() method to get a shared pointer to this base class type. |
virtual void gr::digital::lms_dd_equalizer_cc::set_gain | ( | float | mu | ) | [pure virtual] |
virtual void gr::digital::lms_dd_equalizer_cc::set_taps | ( | const std::vector< gr_complex > & | taps | ) | [pure virtual] |
virtual std::vector<gr_complex> gr::digital::lms_dd_equalizer_cc::taps | ( | ) | const [pure virtual] |
virtual void gr::digital::lms_dd_equalizer_cc::update_tap | ( | gr_complex & | tap, |
const gr_complex & | in | ||
) | [protected, pure virtual] |