diff --git a/Source/Receiver.cpp b/Source/Receiver.cpp index bd1c353..ed56146 100644 --- a/Source/Receiver.cpp +++ b/Source/Receiver.cpp @@ -509,15 +509,24 @@ void Receiver::processBaseband(CVec const &iq, uint32_t len) if (ClockIsTick(&m_symClock, 1)) { #ifndef DISABLE_UNUSED_STATISTICS - minMaxProcess(&m_statistics.ddcMinMax, IQ_eq_in); #endif + minMaxProcess(&m_statistics.ddcMinMax, IQ_eq_in); // ----------------------------------------------------- // AGC Blind process samples // @1 x symbolrate // ----------------------------------------------------- if (m_params.agc_mode != agc_mode_disabled) { - AGC_Process(&agcBlind, CpxMagS(IQ_eq_in), m_params.agcMu[m_params.agcMu_index], m_pSymMapper->R2_cma); + if (m_params.agcMu_index == agc_state_acquisition) + { + e_agc = 1.0 - CpxMagS(m_trackers[0]); + AGC_Train(&agcBlind, e_agc, m_params.agcMu[m_params.agcMu_index]); + } + if (m_params.agcMu_index == agc_state_track) + { + e_agc = 1.0 - CpxMagS(m_trackers[0]); + AGC_Train(&agcBlind, e_agc, m_params.agcMu[m_params.agcMu_index]); + } } // ----------------------------------------------------- @@ -620,27 +629,15 @@ void Receiver::processBaseband(CVec const &iq, uint32_t len) // Lock-detector development // @1 x symbolrate // ----------------------------------------------------- - cpx_t winner_diff = Cpx(0,0); - radio_float_t winner_d = 1000; - int winner_i = 0; - for (int i=0; i < 4; i++) - { - cpx_t diff = CpxSubS(IQ_soft, m_trackers_[i]); - radio_float_t distance = CpxMagS(diff); + radio_float_t alpha = 0.002; + radio_float_t beta = 1.0 - alpha; + cpx_t s_min = m_statistics.ddcMinMax.min; + cpx_t s_max = m_statistics.ddcMinMax.max; + m_trackers[0] = CpxAddS(CpxScaleRealS(m_trackers[0], beta), CpxScaleRealS(Cpx(s_max.real, s_min.imag), alpha)); + m_trackers[1] = CpxAddS(CpxScaleRealS(m_trackers[1], beta), CpxScaleRealS(Cpx(s_max.real, s_max.imag), alpha)); + m_trackers[2] = CpxAddS(CpxScaleRealS(m_trackers[2], beta), CpxScaleRealS(Cpx(s_min.real, s_max.imag), alpha)); + m_trackers[3] = CpxAddS(CpxScaleRealS(m_trackers[3], beta), CpxScaleRealS(Cpx(s_min.real, s_min.imag), alpha)); - // Find tracker with smallest distance from current symbol - if (distance < winner_d) - { - winner_d = distance; - winner_i = i; - winner_diff = diff; - } - } - m_trackers_[winner_i] = CpxAddS(m_trackers_[winner_i], CpxScaleRealS(winner_diff, winner_d*TRACKER_MU+TRACKER_EPS)); - for (int i=0; i < 4; i++) - { - m_trackers[i] = CpxAddS(CpxScaleRealS(m_trackers[i], 0.998f), CpxScaleRealS(m_trackers_[i], 0.002f)); - } // Statistics #ifndef DISABLE_UNUSED_STATISTICS