Files
radio/agc.c
T
jens a68283618d - AGC: added boundaries
- Tracker: forget max at each process for all rackers

git-svn-id: http://moon:8086/svn/software/trunk/libsrc/radio@1048 b431acfa-c32f-4a4a-93f1-934dc6c82436
2022-06-21 17:38:55 +00:00

52 lines
1.1 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_init)
{
pObj->w = w_init;
pObj->w_max = 4;
pObj->w_min = 0;
SlidingMinMaxInit(&pObj->slMax, windowLength, (radio_float_t)1E12, 1);
}
void AGC_Free(agc_t *pObj)
{
SlidingMinMaxFree(&pObj->slMax);
}
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;
}
// --------------------------------------------------------------