Speex回声消除收敛条件

Speex回声消除,从刚开始有回声到adapt的时间称为收敛时间。

speex_echo_cancellation中收敛条件如下:

   /* We consider that the filter has had minimal adaptation if the following is true*/
   if (!st->adapted 
       && st->sum_adapt > SHL32(EXTEND32(M),15) 
       && MULT16_32_Q15(st->leak_estimate,Syy) > MULT16_32_Q15(QCONST16(.03f,15),Syy))
   {
      st->adapted = 1;
   }

在Window下SHL32(EXTEND32(M),15)就是M的值。
在Windows下,MULT16_32_Q15(st->leak_estimate,Syy) > MULT16_32_Q15(QCONST16(.03f,15),Syy))实际就是st->leak_estimate大于0.03f。
就是说收敛需要满足的条件是:

1. st->sum_adapt > M
2. st->leak_estimate > 0.03f

其中M在SpeexEchoState *speex_echo_state_init_mc中计算如下:

M = st->M = (filter_length+st->frame_size-1)/frame_size;

M就是filter_length至少需要M个frame_size大小的块才能放下。
M的计算等价于如下代码:

 int nTempM = filter_length / frame_size;
 if (0 != filter_length % frame_size) // 有未被整除的部分
 {
    nTempM++; // 需要多一个块来放置
 }

st->sum_adapt > M

Speex回声消除收敛条件_第1张图片
st->sum_adapt vs SHL32(EXTEND32(M),15)

放大前一小段:


Speex回声消除收敛条件_第2张图片
查看 st->sum_adapt > SHL32(EXTEND32(M),15) 的情况

可以看到在40个次执行speex_echo_cancellation之后,均满足
st->sum_adapt > M的条件。

st->leak_estimate > 0.03f

Speex回声消除收敛条件_第3张图片
st->leak_estimate vs QCONST16(.03f, 15)

放大前段:

放大前半段

可以看到前10几个点满足 st->leak_estimate > 0.03f的条件,但此时 st->sum_adapt > M不满足,所以不收敛。

放大后段:

放大后半段

可以在最后某个时间点出现了 st->leak_estimate > 0.03f的情况,此时两个收敛必须的条件均满足了,所以 st->adapted = 1;.

你可能感兴趣的:(Speex回声消除收敛条件)