Revision 86553ec4 gr-digital/lib/digital_lms_dd_equalizer_cc.h
| b/gr-digital/lib/digital_lms_dd_equalizer_cc.h | ||
|---|---|---|
| 23 | 23 |
#ifndef INCLUDED_DIGITAL_LMS_DD_EQUALIZER_CC_H |
| 24 | 24 |
#define INCLUDED_DIGITAL_LMS_DD_EQUALIZER_CC_H |
| 25 | 25 |
|
| 26 |
#include <gr_sync_block.h>
|
|
| 26 |
#include <gr_adaptive_fir_ccc.h>
|
|
| 27 | 27 |
#include <digital_constellation.h> |
| 28 | 28 |
|
| 29 | 29 |
class digital_lms_dd_equalizer_cc; |
| 30 | 30 |
typedef boost::shared_ptr<digital_lms_dd_equalizer_cc> digital_lms_dd_equalizer_cc_sptr; |
| 31 | 31 |
|
| 32 |
digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (float mu, int ntaps, |
|
| 32 |
digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (int num_taps, |
|
| 33 |
float mu, int sps, |
|
| 33 | 34 |
digital_constellation_sptr cnst); |
| 34 |
|
|
| 35 |
|
|
| 35 | 36 |
/*! |
| 36 | 37 |
* \brief Least-Mean-Square Decision Directed Equalizer (complex in/out) |
| 37 | 38 |
* \ingroup eq_blk |
| ... | ... | |
| 64 | 65 |
* Prentice Hall, 1996. |
| 65 | 66 |
* |
| 66 | 67 |
*/ |
| 67 |
class digital_lms_dd_equalizer_cc : public gr_sync_block
|
|
| 68 |
class digital_lms_dd_equalizer_cc : public gr_adaptive_fir_ccc
|
|
| 68 | 69 |
{
|
| 69 | 70 |
private: |
| 70 |
friend digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (float mu, int ntaps, |
|
| 71 |
friend digital_lms_dd_equalizer_cc_sptr digital_make_lms_dd_equalizer_cc (int num_taps, |
|
| 72 |
float mu, int sps, |
|
| 71 | 73 |
digital_constellation_sptr cnst); |
| 72 | 74 |
|
| 73 | 75 |
float d_mu; |
| 74 | 76 |
std::vector<gr_complex> d_taps; |
| 75 | 77 |
digital_constellation_sptr d_cnst; |
| 76 | 78 |
|
| 77 |
digital_lms_dd_equalizer_cc (float mu, int ntaps, |
|
| 79 |
digital_lms_dd_equalizer_cc (int num_taps, |
|
| 80 |
float mu, int sps, |
|
| 78 | 81 |
digital_constellation_sptr cnst); |
| 79 | 82 |
|
| 83 |
protected: |
|
| 84 |
|
|
| 85 |
virtual gr_complex error(const gr_complex &out) |
|
| 86 |
{
|
|
| 87 |
gr_complex decision, error; |
|
| 88 |
d_cnst->map_to_points(d_cnst->decision_maker(&out), &decision); |
|
| 89 |
error = decision - out; |
|
| 90 |
return error; |
|
| 91 |
} |
|
| 92 |
|
|
| 93 |
virtual void update_tap(gr_complex &tap, const gr_complex &in) |
|
| 94 |
{
|
|
| 95 |
tap += d_mu*conj(in)*d_error; |
|
| 96 |
} |
|
| 97 |
|
|
| 80 | 98 |
public: |
| 81 |
float get_mu(); |
|
| 82 |
void set_mu(float mu); |
|
| 83 |
int work (int noutput_items, |
|
| 84 |
gr_vector_const_void_star &input_items, |
|
| 85 |
gr_vector_void_star &output_items); |
|
| 99 |
float get_gain() |
|
| 100 |
{
|
|
| 101 |
return d_mu; |
|
| 102 |
} |
|
| 103 |
|
|
| 104 |
void set_gain(float mu) |
|
| 105 |
{
|
|
| 106 |
if(mu < 0.0f || mu > 1.0f) {
|
|
| 107 |
throw std::out_of_range("digital_lms_dd_equalizer::set_mu: Gain value must in [0, 1]");
|
|
| 108 |
} |
|
| 109 |
else {
|
|
| 110 |
d_mu = mu; |
|
| 111 |
} |
|
| 112 |
} |
|
| 113 |
|
|
| 86 | 114 |
}; |
| 87 | 115 |
|
| 88 | 116 |
#endif |
Also available in: Unified diff