[an error occurred while processing this directive]
|
Немного о себе :)
плтформа - ARM9 - пока на Цэ - для теста - а потом напишем как нада.
про NLMS и Q15
в общем то у меня он не такой и длинный - всего 64 тапа
тест простой то
FES - реальный голосовой сигнал
NES искажения сам внес - задержаный (скажем на 8 отсчетов)и ослабленный FES - т.е. совсем простой случай
так вот при длине 16 - NLMS хорошо находит где ему вставить свой нос и 20-25-30 ДБ ERLE выходит быстро и не принужденно секундах на 2-3. Но опять таки от Mu сильно зависит - что бы хорошо сходится любит побольше это Mu.
И по видимому адаптация на участках "без голоса" как то уж сильно плохо действует на фильтр - коэфф "которых нет" упорно сползают в отрицательные значение - причем массовой толпой.
А вот при 64 тапах - все совсем плохо - вроде начинает сходится - но потом коэфф совсем разносит - и опять таки только в отрицательную область.
В общем то дела все спрятаны в вычислениях - возможно в КИХ что Y(n) считает что да и переполняется.
Видимо надо обязательно отключить адаптацию там где "нет FES"
и посмотреть как получше организовать остальное - потому что 40 битного аккумулятора как то нет :). а дальше Q15 лезть не хочется
А может ему Mu надо (2^-9 ...2^-11) и ждать секунд 20 пока он склеиться - этот 64 таповый..
в общем нада поэкспериментировать
вот так
len = aec_context->filter_len;
// --- update FES energy ---
tmp = (aec_context->p_aec_x[-len]*aec_context->p_aec_x[-len]) >> 15;
aec_context->fes_energy = aec_context->fes_energy - tmp; // remove latest
tmp = (aec_context->p_aec_x[0]*aec_context->p_aec_x[0]) >> 15;
aec_context->fes_energy = aec_context->fes_energy + tmp; // add newest// --- calculate adaptation step size ---
aec_context->adapt_step = aec_context->adapt_mu / ((aec_context->fes_energy>>16) + 1); // 0,000030517578125 -div guard// --- update coefficients ---
for(k=0; k < len; k++){
// leakage part - disabled
--> тут могут быть вариации в способах вычисления...
tmp = (aec_context->p_aec_x[-k] * aec_context->adapt_error) >> 15;
tmp = (tmp* aec_context->adapt_step ) >> 15;
aec_context->filter_b[k] += tmp;
} // for(k=0; k < aec_context->filter_len;
E-mail: info@telesys.ru