DSPRelated.com
Forums

Writing an echo canceller

Started by Duane April 27, 2005
Hey everyone,

I started writing an echo canceller as a side project, but am already
hitting a few snags.. I have a few research papers on the floor here
I've been playing with.

My first problem is with the NLMS algorithm.. Dispite implementing
several versions of them, I still always seem to have a problem with it
going unstable.. I'm not even sure if it's unstable or not, but it can
get into states where the filter taps grow quite large, eventually
saturating the output signal..  Based on the NLMS algorithm, it kind of
looks like it should be the case -- the NLMS algorithm, you use the
e(t) term with is v(t) - d(t), where v(t) is the echo estimate, and
d(t) is the desired echo signal.. Unfortunately, there are cases when
this number is really quite large (i.e. if v(t) is 30000, but d(t) is
-30000, then e(t) is 60000.  Is it really going unstable, or is the
filter just adapting to some weird data, thinking it looks more like a
differentiator?

Also, the double talk detector is giving me some grief..  It seems
whenever I misclasify the data, the echo algorithm diverges quickly and
completely ruins the sound..  Does anyone have any suggestions on a
good way to implement a double talk detector?

Thanks,
Duane

Hi Duane,

You are learning an important truth: adaptive filters are conceptually 
simple, but hard to make robust :-)

It sounds like you are simply applying too big a percentage of the error 
signal when adapting the filter. Scale down the error after the 
normalisation and try again. Try scaling it down a lot and work up. Then 
should start to get a feel for the way these things behave. Depending 
how you approach things, you might need some leakage in the adaption. 
Where the echo signal is very small, the coefficients can wander a lot 
during adaption. When multiplied by a small signal, even the wildest 
coefficents still don't amount to much. The snags are they can wander 
beyond the ability of the adaption process to drag them back, and if the 
signal changes you can suddenly get awful noises.

What are you using for double talk detection? There are lots of exotic 
approachs, but the simple Geigel approach shouldn't be too flaky. The 
real problems come not from double talk, but from trying to tolerate 
narrow band signals.

One trick that works pretty well to minimise the divergence that may 
occur before double talk, narrow band, or other nasty stuff is detected 
is to snapshot the coefficients. If you snapshot the coefficients when 
you are sure things are OK, you can step back to the last trusted set 
when double talk or whatever is detected.

To make an echo canceller which will pass a modern spec, like G.168, 
requires a number of tricks to work around real world problems.

Regards,
Steve


Duane wrote:

>Hey everyone, > >I started writing an echo canceller as a side project, but am already >hitting a few snags.. I have a few research papers on the floor here >I've been playing with. > >My first problem is with the NLMS algorithm.. Dispite implementing >several versions of them, I still always seem to have a problem with it >going unstable.. I'm not even sure if it's unstable or not, but it can >get into states where the filter taps grow quite large, eventually >saturating the output signal.. Based on the NLMS algorithm, it kind of >looks like it should be the case -- the NLMS algorithm, you use the >e(t) term with is v(t) - d(t), where v(t) is the echo estimate, and >d(t) is the desired echo signal.. Unfortunately, there are cases when >this number is really quite large (i.e. if v(t) is 30000, but d(t) is >-30000, then e(t) is 60000. Is it really going unstable, or is the >filter just adapting to some weird data, thinking it looks more like a >differentiator? > >Also, the double talk detector is giving me some grief.. It seems >whenever I misclasify the data, the echo algorithm diverges quickly and >completely ruins the sound.. Does anyone have any suggestions on a >good way to implement a double talk detector? > >Thanks, >Duane > > >
Your best bet for a great Acoustic Echo Canceler is probably at:
http://www.Compandent.com/products_echokiller.htm
http://www.Compandent.com/EchoKillerFactSheet.pdf

Duane wrote:
> Hey everyone, > > I started writing an echo canceller as a side project, but am already > hitting a few snags.. I have a few research papers on the floor here > I've been playing with. > > My first problem is with the NLMS algorithm.. Dispite implementing > several versions of them, I still always seem to have a problem with it > going unstable.. I'm not even sure if it's unstable or not, but it can > get into states where the filter taps grow quite large, eventually > saturating the output signal.. Based on the NLMS algorithm, it kind of > looks like it should be the case -- the NLMS algorithm, you use the > e(t) term with is v(t) - d(t), where v(t) is the echo estimate, and > d(t) is the desired echo signal.. Unfortunately, there are cases when > this number is really quite large (i.e. if v(t) is 30000, but d(t) is > -30000, then e(t) is 60000. Is it really going unstable, or is the > filter just adapting to some weird data, thinking it looks more like a > differentiator? > > Also, the double talk detector is giving me some grief.. It seems > whenever I misclasify the data, the echo algorithm diverges quickly and > completely ruins the sound.. Does anyone have any suggestions on a > good way to implement a double talk detector? > > Thanks, > Duane >