57 lines
1.2 KiB
C
Executable File
57 lines
1.2 KiB
C
Executable File
// --------------------------------------------------------------
|
|
#include <string.h>
|
|
#include <math.h>
|
|
#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;
|
|
}
|
|
|
|
// --------------------------------------------------------------
|