Speex中的回声消除默认是按单声道处理的。
那么Speex支持直接对双声道的数据进行回声消除吗?
答案是肯定的,10年前,Speex的作者Jean-Marc Valin已经给出了答案。
Two related news here.
First, I've merged in support for stereo (or more channels) acoustic echo cancellation in mainline. The standard AEC remains the same, but I added a speex_echo_state_init_mc() call that takes the number of speakers and microphones.
作者说可以用speex_echo_state_init_mc
函数来提供对多声道的支持。
speex_echo_state_init_mc
定义如下:
nb_mic表示麦克风(近端数据)的通道数
nb_speakers 表示扬声器(远端数据)的通道数
查看speex_echo_state_init的源码:
/** Creates a new echo canceller state */
EXPORT SpeexEchoState *speex_echo_state_init(int frame_size, int filter_length)
{
return speex_echo_state_init_mc(frame_size, filter_length, 1, 1);
}
可以看出speex_echo_state_init
中实质就是调用了speex_echo_state_init_mc
。
其中nb_mic和nb_speakers默认设置为1,也就是按单声道处理。
frame_size的含义
Speex中通过speex_echo_state_init函数来初始化frame_size和滤波器长度filter_length:
speex_echo_state_init_mc
和speex_echo_state_init
有一个共同的参数。
frame_size
Number of samples to process at one time (should correspond to 10-20 ms)
frame_size代表啥? 对于单声道和双声道有什么区别?
单声道
如果单声道,假设采样率48k,这里取10ms的数据:
frame_size = 48000 * 10 / 1000 = 480
双声道
对于双声道中frame_size的含义,以下是Jean-Marc Valin对一位提问者的回答。
总结成一句话:
Jean-Marc Valin escreveu:
In stereo mode, you need to use the init_mc() call and consider the
number of samples per channel. Also, more than 20 ms frames are a bad idea.
frame_size表示the number of samples per channel,也就是单个声道的采样点数,所以双声道甚至多声道时,frame_size和单声道时一样的。
References:
http://lists.xiph.org/pipermail/speex-dev/2008-June/006760.html
http://speex.sourcearchive.com/documentation/1.2~beta4-2/group__SpeexEchoState_g9a7e6da4baf118ea3dcbe2273ccdea30.html
http://lists.xiph.org/pipermail/speex-dev/2009-March/007151.html