传给回声消除器的两个声音信号,必须同步得非常的好。具体过程如下:
1、在B端,接收到A说的话以后,要把这些话音数据传给回声消除器做参考,然后再传给声卡,声卡再通过扬声器放出来,这有一段延时。
2、MIC采集B说话的声音和扬声器的声音,然后传给回声消除器,与A传过来的数据比较,从采集到的数据中把频域和参考数据相同的部分消除掉。
如果传给消除器的两个信号同步得不好,即两个信号找不到频域相同的部分,就没有办法进行消除了。
下面的例子采集的声音都在本地,所以延时非常小,主要是实现从一段声音里面消除掉一部分声音,这部分声音相当于回音,从而模拟VOIP语音通信
的消回音场景。
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "speex/speex_echo.h"
#include "speex/speex_preprocess.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define NN 128
#define TAIL 1024
int main(int argc, char **argv)
{
FILE *echo_fd, *ref_fd, *e_fd;
short echo_buf[NN], ref_buf[NN], e_buf[NN];
SpeexEchoState *st;
SpeexPreprocessState *den;
int sampleRate = 8000;
if (argc != 4)
{
fprintf(stderr, "testecho mic_signal.sw speaker_signal.sw output.sw\n");
exit(1);
}
echo_fd = fopen(argv[2], "rb");//打开参考文件,即要消除的声音
ref_fd = fopen(argv[1], "rb");//打开mic采集到的声音文件,包含回声在里面
e_fd = fopen(argv[3],