Changeset 2432
- Timestamp:
- 12/20/06 17:13:16 (6 years ago)
- Location:
- SigProc/trunk/SigProc
- Files:
-
- 2 modified
-
SigProc.h (modified) (2 diffs)
-
sources.cpp (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
SigProc/trunk/SigProc/SigProc.h
r2393 r2432 47 47 agc(); 48 48 49 // intialize constructor 50 agc(float _elo, 51 float _ehi, 52 float _ka, 53 float _kr, 54 float _gmin, 55 float _gmax); 56 49 // set signal processing values 50 void set_values( 51 float _elo, 52 float _ehi, 53 float _ka, 54 float _kr, 55 float _gmin, 56 float _gmax); 57 58 // get signal processing values 59 void get_values( 60 float & _elo, 61 float & _ehi, 62 float & _ka, 63 float & _kr, 64 float & _gmin, 65 float & _gmax); 66 67 // get status 68 void get_status(float & _gain, float & _energy); 69 57 70 // destructor 58 71 ~agc(); … … 80 93 float zeta; // low-pass filter coefficient for 81 94 // estimating average energy 95 96 float energy_av; // average energy threshold for 97 // smoother tracking 82 98 }; 83 99 -
SigProc/trunk/SigProc/sources.cpp
r2393 r2432 34 34 SigProc::agc::agc() 35 35 { 36 energy_lo = 8192; 37 energy_hi = 8192; 38 ka = 0.5f; 39 kr = 0.05f; 36 energy_lo = 8192.0f; 37 energy_hi = 8192.0f; 38 energy_av = 8192.0f; 39 ka = 0.0001f; 40 kr = 0.000025f; 40 41 gmin = 0.0f; 41 42 gmax = 32768.0f; … … 43 44 gain = 1.0f; 44 45 energy = 0.0f; 45 46 46 zeta = 0.001; 47 47 } 48 48 49 // intialize constructor 50 SigProc::agc::agc( 49 // destructor 50 SigProc::agc::~agc() 51 { 52 } 53 54 // set signal processing values 55 void SigProc::agc::set_values( 51 56 float _elo, 52 57 float _ehi, … … 63 68 gmax = (_gmax>32768.0f) ? 32768.0f : _gmax; 64 69 65 gain = 1.0f; 66 energy = 0.0f; 67 68 zeta = 0.001; 69 } 70 71 // destructor 72 SigProc::agc::~agc() 73 { 70 if ( gmin > gmax ) 71 { 72 std::cout << "WARNING: SigProc::agc: minimum gain " 73 << "must be less than maximum gain" 74 << std::endl; 75 } 76 77 if ( energy_lo > energy_hi ) 78 { 79 std::cout << "WARNING: SigProc::agc: low energy threshold " 80 << "must be less than high energy threshold" 81 << std::endl; 82 } 83 84 energy_av = 0.5*( energy_hi + energy_lo ); 85 } 86 87 // get signal processing values 88 void SigProc::agc::get_values( 89 float & _elo, 90 float & _ehi, 91 float & _ka, 92 float & _kr, 93 float & _gmin, 94 float & _gmax) 95 { 96 _elo = energy_lo; 97 _ehi = energy_hi; 98 _ka = ka; 99 _kr = kr; 100 _gmin = gmin; 101 _gmax = gmax; 102 } 103 104 // get status 105 void SigProc::agc::get_status(float & _gain, float & _energy) 106 { 107 _gain = gain; 108 _energy = energy; 74 109 } 75 110 … … 78 113 { 79 114 // update energy value 80 energy = (1-zeta)*energy + zeta*abs(I); 115 // TODO: implement IIR low-pass filter 116 energy = (1-zeta)*energy + zeta*gain*abs(I); 81 117 82 118 // update gain value … … 91 127 { 92 128 short abs_I, abs_Q; 93 float energy_this ;129 float energy_this, I_tmp, Q_tmp; 94 130 95 131 // update energy 132 // TODO: implement IIR low-pass filter 133 // NOTE: A good approximation to A=sqrt(I^2 + Q^2) is 134 // A ~= max(|I|,|Q|) + 0.30059*min(|I|,|Q|) 135 // This yields a MSE of about -30dB 96 136 abs_I = abs(I); 97 137 abs_Q = abs(Q); … … 101 141 energy_this = float(abs_Q) + 0.30059f*float(abs_I); 102 142 103 energy = (1-zeta)*energy + zeta* energy_this;143 energy = (1-zeta)*energy + zeta*gain*energy_this; 104 144 105 145 // update gain value 106 146 compute_gain(); 107 147 108 // apply gain 109 I = short( I*gain ); 110 Q = short( Q*gain ); 148 // apply gain to I-channel, prevent clipping 149 I_tmp = float(I)*gain; 150 if ( I_tmp > float(SHRT_MAX) ) 151 I = SHRT_MAX; 152 else if ( I_tmp < -float(SHRT_MAX) ) 153 I = -SHRT_MAX; 154 else 155 I = short(I_tmp); 156 157 // apply gain to Q-channel, prevent clipping 158 Q_tmp = float(Q)*gain; 159 if ( Q_tmp > float(SHRT_MAX) ) 160 Q = SHRT_MAX; 161 else if ( Q_tmp < -float(SHRT_MAX) ) 162 Q = -SHRT_MAX; 163 else 164 Q = short(Q_tmp); 165 111 166 } 112 167 … … 124 179 gain *= 1 + kr*(energy_hi - energy)/energy_hi; 125 180 } 181 else if ( energy > energy_av ) 182 { 183 gain *= 1 - ka*(energy - energy_av)/energy_av; 184 } 185 else if ( energy < energy_av ) 186 { 187 gain *= 1 + kr*(energy_av - energy)/energy_av; 188 } 126 189 else 127 190 { … … 129 192 } 130 193 194 // hard limit gain values 131 195 gain = (gain>gmax) ? gmax : gain; 132 196 gain = (gain<gmin) ? gmin : gain;