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