[Speex-dev] Speech switching in speakerphone?

Johan Nilsson han at svep.se
Fri Jun 26 02:58:21 PDT 2009

> > My impression when simulating in matlab is that the noise estimate which is
> > based on the residual echo is correlating well with the far-end activity.
> Not sure what you mean here.

I mean that the echo_noise (based on residual echo) is showing a distinct response
when fare end is talking. This in contrast to the SNR which is not always showing
distinct response when near end is talking (due to the weak signal). 

> > The idea would be to use your estimation of the residual echo and noise
> > But to modify the calculation of the gain2. This would probably offer 
> > a more robust solution since we do not have to rely on the SNR. However 
> > we would lose the noise suppression functionality I guess (which probably 
> > is ok).
> Actually, if you remove the noise suppression, then it will sound
> strange when you remove echo, because the noise will suddenly go away at
> the same time. This is a bit annoying.

Yes you are right about this but unfortunately we might be forced to accept this 
or we have to insert synthetic noise during suppression. 

> > Are you familiar with any other RES-algorithm that might be more robust
> > to weak near-end signals?
> Not really. This isn't something I have studied too much to be honest.

After some thinking I realized that the algorithm I was looking for actually could
be realized with your preprocessor if I set both echo_suppress_active and
noise_suppress to 0 dB and echo_suppression to some appropriate damping.

I tried this out but it did not work initially. I tried to set all three suppress
parameters to 0dB which should give a gain_floor of 0dB, but it did not.
I had to take a closer look on the fixed point version of the compute_gain_floor 
function. It turned out that the addition of "1" you have in the denominator 
had to be removed in order to make it work as I expected it to do. I also
hade to change the gain_ratio multiplication command to MULT16_32_P15. I do 
not know if this is to consider as a bug or if I was pushing the function too far.

The equation I use now looks like this:
gain_floor[i] = MULT16_16_Q15(noise_gain,spx_sqrt(SHL32(EXTEND32(DIV32_16_Q15(PSHR32(noise[i],NOISE_SHIFT) + MULT16_32_P15(gain_ratio,echo[i]),(0+PSHR32(noise[i],NOISE_SHIFT) + echo[i]) )),15)));  

Now the preprocessor behaves like the algorithm I was looking for!
Is there any reason you have the addition of 1 in the denominator?

Best Regards


More information about the Speex-dev mailing list