[Speex-dev] mdf -- better adaption of W?

Jean-Marc Valin Jean-Marc.Valin at USherbrooke.ca
Tue Dec 13 01:32:58 PST 2005


> Err. Ok, as I got it, 'bin 0' has it's amplitude in W[0], bin 1 to N-1 has 
> it's real part in W[i*2-1] and it's imag in W[i*2], and finally the 
> nyquist amplitude is in W[N-1]

Not quite, it's packet "real, real, imag, real, imag, ...".

> I took this from how power_spectrum() computes, so I might be off :)

But power_spectrum() handles that fine, you're right.

> > If you hold that in you're hand, you're probably making it harder than
> > for a real scenario because any movement causes the echo path to change.
> 
> Actually, with maximum volume (which I used to make sure the echo really 
> dominated over the noise), it's quite loud, so I left it in the corner.

That fine then... as long as the max volume doesn't cause too much
distortion (the AEC models only linear effects).

> I'll need to add support for saving audio to my program, so I can give you 
> the "actual" sampled loudspeaker and mic files, and I'll also need to get 
> hold of a test person again. (I had a friend with a friend who has an 
> exceptionally clear voice. My own "aaaaaa" is far too muddy to cause 
> this). I'll try to get this done this week, but it might be delayed 'till 
> after christmas.

Let me know if you have files that cause the problem. Otherwise, it's
pretty much impossible to debug.

> >> This can happen quite frequently, so it would be nice if the echo
> >> canceller could deal with this situation without a complete reset.
> >
> > That can be predicted from the code. It's sort of hard to fix without
> > hurting accuracy for the general case. I'll have to think about it.
> 
> An idea might be to enable the noise cancellation to "feed back" into the 
> echo cancellator. If, after noise cancellation, there's nothing left at 
> all, then stop adapting the echo cancellator.

There's always "something" left after the echo cancellation, if only the
input noise. And even then it wouldn't fix the problem.

> Well, from what I can see in this testcase, it's only "random" where there 
> is no correlation. For example, in the 20ms-40ms timeslot, the amplitude 
> can spike a bit (such as on those "aaaaaa"), but the phase is still 
> random, whereas in the '0-20ms' slot, it's very regular. My thought was to 
> use the "regularity" of the phase shift as an indication for a good match. 

No. All the regularity means is that you have a dominant pulse in the
transfer function. That's expected for the first section of the filter
(because of the direct sound path), but not the others (that are really
just a lot of incoherent stuff).

> So, if arg(W[i+1])-arg(W[i])==arg(W[i])-arg(W[i-1]), we know it's a steady 
> increase, so it's probably a good match. It's quite hackish, and probably 
> not based in any kind of good scientific basis, but it's an idea for 
> dealing better with the specific kind of echo I see here.

What good would it really tell you anyway?

> Then again, it will likely fail horribly if you have 2 echos; one delayed 
> by 5ms with equal amplitude, and another delayed by 15ms with a much lower 
> amplitude. 

That's actually common if you have a wall (or the floor) not too far
from the mic or the speaker.

> I have no idea what the "phase diagram" will look like then.

Messy and dependent on the amplitudes too.

	Jean-Marc


More information about the Speex-dev mailing list