beasty4ever / AEC

acoustic echo cancellation(floating&fixed point)
0 stars 1 forks source link

sample rate coefficient #1

Open Andyvff opened 1 year ago

Andyvff commented 1 year ago

Hi. What coefficients are needed for speeds of 12800 and 16000? How to calculate them?

beasty4ever commented 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).

Andyvff commented 1 year ago

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 ?

beasty4ever commented 1 year ago

Хорошо, что перешли на русский :)

Еще вопросик уточнение.
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 часов перенести из плавающей точки в фиксированную).

Ну и собственно про код, это не универсальная библиотека для использования кем либо, код выкладывался как пример для прохождения одного из этапов собеседования.

Andyvff commented 1 year ago

Появился еще один вопрос. 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. ;) Спасибо.

beasty4ever commented 1 year ago

Вы правы теперь там две строки уже лишние. Поправил в репе, спасибо.