> 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
>
Reply by Steve Underwood●April 27, 20052005-04-27
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
>
>
>
Reply by Duane●April 27, 20052005-04-27
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