Последняя версия АРУ
Код:
[Выделить]void AGC_do_digi(void) {
//main circle
for (int i = 0; i < FRAME_SIZE; i +=

{
float32_t a = fabsf(saiRxBank[saiRxBankNowNumber][i]); // модуль замера
//сильный
if (a * agcd.val > agcd.max) {//сюда если сигнал превысил максималку
agcd.delayNow = 0;
agcd.delay = 5; //мин задержка отката сразу
agcd.val = agcd.max / a; //расчет нового множителя
//переменный степ от 250...100 шагов назад
uint16_t steps = 100;
steps = (uint16_t) ((float32_t) steps * agcd.oldVal / agcd.val);
if (steps > 250)steps = 250;
float32_t step = (agcd.oldVal - agcd.val) / (float32_t) (steps);//шаг изменения амплитуды
uint8_t nn = saiTxBankNowNumber ? 0 : 1;//выбор банки которая уже отдана дма
uint16_t vv = 0;
for (int loc = 1; loc < steps; loc++) {
int32_t ii = i - loc * 8;
if (ii >= 0) {//если еще не вышли за текущий блок приема
saiRxBank[saiRxBankNowNumber][ii] /= agcd.oldVal;//сперва вернем старое значение
saiRxBank[saiRxBankNowNumber][ii] *= (agcd.val + step * (float32_t) loc);//а теперь умножим на новый множитель
} else {//сюда зашли если уже вышли с текущего блока и зашли в старый блок
uint16_t x = (FRAME_SIZE -

- vv * 8;//адрес в слотах
float32_t tx = (float32_t) saiTxBank[nn][x] / 0x1p24f;//специфика адау 1647
vv++;
tx /= agcd.oldVal;////сперва вернем старое значение
tx *= (agcd.val + step * (float32_t) loc);//а теперь умножим на новый множитель
saiTxBank[nn][x] = (int32_t) (tx * 0x1p24f);//особенность адау
SCB_CleanDCache_by_Addr((uint32_t *) &saiTxBank[nn][x], 4); //сброс кэша в память
}
}
} else {//сюда если сигнал меньше чем максималка (начало алгоритма отката)
//антипитченг
//если задержка не достигла максимального
if (agcd.delay < agcd.delayMax) agcd.delay += agcd.speedPitchingRise;// добавим приращение к задержки
if (!agcd.delayNow) { //если счетчик задержки закончился и нужно возвращать усиление
if (a * agcd.val * agcd.speed <= agcd.max) //если можем еще поднять усиление
agcd.val *= agcd.speed; //то подымаем
else agcd.val = agcd.max / a;//если не можем понять то берем максимально возможное усиление
}
}
saiRxBank[saiRxBankNowNumber][i] *= agcd.val;// фиксируем усиление в каждой ячейки блока
//ворота
//если сигнал не падает то отодвигаем задержку
if (saiRxBank[saiRxBankNowNumber][i] >= agcd.max / agcd.gate) {//продолжаем задержку
agcd.delayNow = agcd.delay>2.0f?(uint16_t) agcd.delay:2;
}
agcd.oldVal = agcd.val; //сохраним старый коэфф
}
if (agcd.delayNow)agcd.delayNow--; //уменьшим счетчик задержки если он не пустой
}