// -------------------------------------------------------------- #include #include #include "agc.h" // -------------------------------------------------------------- // AGC // Scalar version // -------------------------------------------------------------- void AGC_Init(agc_t *pObj, uint32_t windowLength, radio_float_t w_min, radio_float_t w_max) { pObj->w = 1; pObj->w_min = w_min; pObj->w_max = w_max; SlidingMinMaxInit(&pObj->slMax, windowLength, (radio_float_t)1E12, 1); } void AGC_Free(agc_t *pObj) { SlidingMinMaxFree(&pObj->slMax); } void AGC_reset(agc_t *pObj, radio_float_t w_init) { pObj->w = w_init; } void AGC_Process(agc_t *pObj, radio_float_t x, radio_float_t mu, radio_float_t target) { radio_float_t d2; radio_float_t e; d2 = SlidingMinMaxProcess(&pObj->slMax, x); e = target - d2; pObj->w += mu*e*dabs(x); } void AGC_Train(agc_t *pObj, radio_float_t e, radio_float_t mu) { pObj->w += mu*e; if (pObj->w > pObj->w_max) { pObj->w = pObj->w_max; } if (pObj->w < pObj->w_min) { pObj->w = pObj->w_min; } } radio_float_t AGC_GetWeight(agc_t *pObj) { return pObj->w; } // --------------------------------------------------------------