Speex回聲消除娜扇,從剛開始有回聲到adapt的時(shí)間稱為收斂時(shí)間昔字。
在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))
實(shí)際就是st->leak_estimate大于0.03f腺晾。
就是說收斂需要滿足的條件是:
1. st->sum_adapt > M
2. st->leak_estimate > 0.03f
其中M在SpeexEchoState *speex_echo_state_init_mc
中計(jì)算如下:
M = st->M = (filter_length+st->frame_size-1)/frame_size;
M就是filter_length至少需要M個(gè)frame_size大小的塊才能放下麦向。
M的計(jì)算等價(jià)于如下代碼:
int nTempM = filter_length / frame_size;
if (0 != filter_length % frame_size) // 有未被整除的部分
{
nTempM++; // 需要多一個(gè)塊來放置
}
st->sum_adapt > M
st->sum_adapt vs SHL32(EXTEND32(M),15)
放大前一小段:
查看 st->sum_adapt > SHL32(EXTEND32(M),15) 的情況
可以看到在40個(gè)次執(zhí)行speex_echo_cancellation
之后瘟裸,均滿足
st->sum_adapt > M
的條件。
st->leak_estimate > 0.03f
st->leak_estimate vs QCONST16(.03f, 15)
放大前段:
放大前半段
可以看到前10幾個(gè)點(diǎn)滿足
st->leak_estimate > 0.03f
的條件诵竭,但此時(shí)st->sum_adapt > M
不滿足话告,所以不收斂。
放大后段:
放大后半段
可以在最后某個(gè)時(shí)間點(diǎn)出現(xiàn)了
st->leak_estimate > 0.03f
的情況卵慰,此時(shí)兩個(gè)收斂必須的條件均滿足了沙郭,所以st->adapted = 1;
.