Цитата(sigmaN @ Sep 7 2009, 02:48)

Код
unsigned long do_agc(int *input, int len){
//считаем энергию сигнала
agc_currEnergy=my_sqrsum(input,len);
Считать нужно скользящим средним, а не для буфера. Иначе это будет не АРУ а "бла-бла-бла" по звучанию...
Цитата(sigmaN @ Sep 7 2009, 02:48)

Код
if(agc_currEnergy==0)
return agc_currEnergy; //AGC не требуется - на выход
Бесполезнйший участок кода отбирающий ресурсы, и компилятор никогда не догадается, что условие заведомо не выполнимое.
Цитата(sigmaN @ Sep 7 2009, 02:48)

Код
if(agc_currEnergy>=AGC_MINTHRESHOLD && agc_currEnergy<=AGC_MAXTHRESHOLD)
return agc_currEnergy; //AGC не требуется
Жжоте! А я думал у АРУ постоянно действующая петля...
Цитата(sigmaN @ Sep 7 2009, 02:48)

Код
else
if(agc_currEnergy<AGC_MINTHRESHOLD){ //надо бы усилить
agc_multiplier=sqrt((double)AGC_MINTHRESHOLD/(double)agc_currEnergy);
}
Жесть!
Цитата(sigmaN @ Sep 7 2009, 02:48)

Код
else
if(agc_currEnergy>AGC_MAXTHRESHOLD){//придётся сделать немного потише :)
agc_multiplier=sqrt((double)AGC_MAXTHRESHOLD/(double)agc_currEnergy);
}
...и получается у нас ограничитель, и ни разу не АРУ

. Где сокрыта постоянная времени?
На CQHAM я приводил код АРУ в моем ее понимании

. Вобщем она мало чем отличается от аналогового прототипа по сути и от рекомендаций Лайонса так же.
Рабочий код остался у меня на работе которую я покинул 3 года назад, но кое что я "тянул домой", подождите немного я гляну есть ли код.
Работает обычная АРУ так - скользящий измеритель мощности на периоде(в аналоговой технике обычный АМ-детектор) через время задерживающую цепочку (а иначе прощайте слабые звуки, в "аналоге" это RC-цепочка в простейшем случае) управляет через линейный элемент ("аналог" - полевой транзистор без питания - т.е. как управляемое сопротивление - включенный как аттенюатор по схеме обычного делителя напряжения или в цепь ОС) управляет масштабом напряжения сигнала("веса" сэмплов для ЦОС).
Чего у Вас нет - времени срабатывания/отпускания. А это принципиально отличие АРУ от банального ограничителя. Вот с таким кодом как у Вас звук будет похож на работу жесткого (причем нелинейного

) клипера для армейской SSB станции, можно продать код в студию спецэффектов

.
Далее - очень важна сама форма функции срабатывания/нарастания - Лайонс рекомендует простейший случай - экспоненту(переходной процесс в "аналоговом" RC-звене) - но в серьезной аппаратуре(как аудио, так и связной - от армейской до кол-центров) она обычно сложнее, и лучше всего если ее может задавать пользователь...
Цитата(litv @ Sep 7 2009, 08:45)

АРУ - вычисляем мощность, ставим ФНЧ на нее с полосой 50 Гц , корректируем сигнал по мощности раз ,применяем примерно раз 0.1 секунды.
Не совсем понял, но если имеется ввиду коррекция применительно к буферам, то это не верно. АРУ работает непрерывно, обновляясь с частотой дискретизации. ФНЧ тоже не совсем то, фильтр низких частот имеет отклик по природе близкий интегратору, но ФНЧ - не интегратор. Попытка сделать хороший ФНЧ отдалит нас еще больше от искомой цели - получим много ненужных пульсаций в переходном процессе.
Цитата(des00 @ Sep 7 2009, 06:01)

думаю что скажу чушь, т.к. именно со звуком не работал. Но при приеме радиосигналов я делаю ару по средней мощности с учетом запаса на пик-фактор сигнала и использую ПИ-звено регулирования. Использования П звена для быстро изменяющихся сигналов ИМХО не верно.
ПИ - это пропорционально интегрирующее?
А просто П - это пропорциональное?
Тогда Вы конечно же правы! Все верно!
P.S.: Еще добавлю, что если перемудрить с функцией обратной связи и на ней появится участок на котором прирост реакции обратен по знаку приросту воздействия - получится неплохой релаксационный генератор

, как на тунельном диоде...
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...