Автоматическая регулировка уровня (АРУ, AGC)

Все что касается фильтрации
sergboec
Сообщения: 2
Зарегистрирован: 26 фев 2015, 13:40

Автоматическая регулировка уровня (АРУ, AGC)

Сообщение sergboec »

Добрый день.
Пытаюсь реализовать на С++ Desktop алгоритм автоматической регулировки усиления.
Единственные найденные мною алгоритмы для цифрового(дискретного случая) были найдены в книге
RF Architectures & Digital Signal Processing Aspect of Digital Wireless Transreceivers за авторством Mohamed Nezami
Там представлены несколько алгоритмов - линейный, логарифмический и экспоненциальный.
Формула для логарифмического выглядит вот так
Изображение
Собственно вопрос: а правильно ли, что при входе 0 мы не получим ничего потому что у нас будет бесконечность?
Так же интересуют ещё материалы по АРУ(AGC) в дискретном исполнении.
Спасибо.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Автоматическая регулировка уровня (АРУ, AGC)

Сообщение Бахурин Сергей »

не получим ничего ибо ноль умноженный на любое конечное число есть ноль

sergboec
Сообщения: 2
Зарегистрирован: 26 фев 2015, 13:40

Re: Автоматическая регулировка уровня (АРУ, AGC)

Сообщение sergboec »

Бахурин Сергей писал(а):не получим ничего ибо ноль умноженный на любое конечное число есть ноль
Точнее я бы хотел заметить: что в реализации представленной схемы я вижу проблему, которую не могу решить и прошу помощи.

Код: Выделить всё

    double alpha = _logarithmicAGCAlpha;
    double R = 16000; // this is for making whole range 32000
    R = (volume/100)*R; // correcting RANGE value with volume level
    double A = alpha*R;
    for (unsigned int i=0;i<length_pts;i++){
        out[i] = in[i]*A;
        A = exp( log(A) + alpha*(log(R) - log(std::abs ( sqrt (in[i]*A) ) ) );
    }
проблема то в том, что логарифм от нуль - бесконечнсть, следовательно ошибка в подсчёте.
можно ли как-то подкорректировать схему?

Rem
Сообщения: 34
Зарегистрирован: 13 май 2014, 20:20

Re: Автоматическая регулировка уровня (АРУ, AGC)

Сообщение Rem »

Условие не подойдёт?

Код: Выделить всё

if (in[i]!=0) A = exp(....);
else A=0; 

Ответить