Open Andyvff opened 1 year ago
See FloatinPoint branch:
AEC_MU - experimentally while filter convergence
AEC_ORDER - by echo time in propagation environment (ms - samples).
Other coefficientes - (ms - samples).
if it is not a multiple of 8000 , it will not be possible to calculate ALFAS = 5, // 4ms - 32 counts ALFAM = 7, // 16ms - 128 counts ALFAL = 14, // 2048ms - 16384 counts
Which is better? less than the value, or more than the value. (1/12800) 16384 or (1/12800)32768 ?
при не кратной 8000 не получится рассчитать
ALFAS = 5, // 4ms - 32 отсчета
ALFAM = 7, // 16ms - 128 отсчетов
ALFAL = 14, // 2048ms - 16384 отсчетов
Что лучше? меньше значения, или больше значения. (1/12800) 16384 или (1/12800)32768 ?
Хорошо, что перешли на русский :)
Еще вопросик уточнение.
SndPowS = (1.0f - ALFAS)SndPowS + ALFASAbsSnd;
Вы это раскладываете на
SndPowS = SndPowS - (SndPowS>> ALFAS) +AbsSnd;
почему не делите входной сигнал?
SndPowS = SndPowS - (SndPowS>> ALFAS) +AbsSnd>>ALFAS;
Этот прием позволяет не угробить динамический диапазон входного сигнала при расчете с фиксированной точкой:
при не кратной 8000 не получится рассчитать
ALFAS = 5, // 4ms - 32 отсчета
ALFAM = 7, // 16ms - 128 отсчетов
ALFAL = 14, // 2048ms - 16384 отсчетов
Что лучше? меньше значения, или больше значения.
(1/12800) *16384 или (1/12800)*32768 ?
Тут нет понятия лучше, когда переходите на фиксированную точку фильтр моделируется и прогоняется несколько раз на сигнале, снимая каждый раз АЧХ, лучше здесь это: приемлемая АЧХ+отсутсвие переполнения+отсутствие возбуждения фильтра т.к он БИХ фильтр. Просто так изменить частоту дискретизации и немного подкрутить коэффициенты для расчетов с фиксированной точкой не выйдет. Это работа по настройке и моделированию процессов происходящих в фильтре (у меня заняло 6 часов перенести из плавающей точки в фиксированную).
Ну и собственно про код, это не универсальная библиотека для использования кем либо, код выкладывался как пример для прохождения одного из этапов собеседования.
Появился еще один вопрос. if (TrTime > 0) { TrTime = TrTime - 1; if (OutGain > 8192) OutGain = OutGain - RumpDn; Out = (short)((OutGain * aec_e) >> 15); }
Частично понятно, пока не сбросится таймер. усиление загоняем в 0.25. Но Out = (short)((OutGain * aec_e) >> 15); -- это тут не работает. потому что далее еще условия которые выполняются. И Out совсем другой. или этот Out лишний, или не хватает else....., или это надо ниже.
А так, все работает. Пока на ваших wav. ;) Спасибо.
Вы правы теперь там две строки уже лишние. Поправил в репе, спасибо.
Hi. What coefficients are needed for speeds of 12800 and 16000? How to calculate them?