流媒体

Speex 双声道回声消除中frame_size的含义

2018-04-19  本文已影响29人  FlyingPenguin

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定义如下:

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

speex_echo_state_init_mcspeex_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对一位提问者的回答。

1
2
3
4

总结成一句话:

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

上一篇 下一篇

猜你喜欢

热点阅读