您的位置:首页 > 编程语言

aec in speex利用Speex进行AEC(回声抑制)的代码实现

2011-07-29 10:36 561 查看
#include <speex/speex_echo.h>
#include <speex/speex_preprocess.h>

static SpeexEchoState *echo_state = NULL;
static SpeexPreprocessState *denoise_state;
static pthread_mutex_t mutex_aec;
static char* rec_buffer = NULL;
static char* play_buffer = NULL;
static int sampleRate = 8000;

void aec_init(int frame_size)
{
if(echo_state || denoise_state)
return;
rec_buffer = (char*)malloc(frame_size*2);
play_buffer = (char*)malloc(frame_size*2);

echo_state = speex_echo_state_init(frame_size, frame_size*10);
denoise_state = speex_preprocess_state_init(frame_size, sampleRate);
speex_echo_ctl(echo_state, SPEEX_ECHO_SET_SAMPLING_RATE, &sampleRate);
speex_preprocess_ctl(denoise_state, SPEEX_PREPROCESS_SET_ECHO_STATE, echo_state);
pthread_mutex_init(&mutex_aec, NULL);
}

void aec_uninit()
{
if(echo_state)
speex_echo_state_destroy(echo_state);
if(denoise_state)
speex_preprocess_state_destroy(denoise_state);
echo_state = NULL;
denoise_state = NULL;
pthread_mutex_destroy(&mutex_aec);
if(rec_buffer)
free(rec_buffer);
if(play_buffer)
free(play_buffer);
play_buffer = NULL;
rec_buffer = NULL;
}

void aec_record_audio(void* audio_rec_buffer, unsigned int audio_data_len)
{
if(echo_state == NULL || denoise_state == NULL || rec_buffer == NULL)
return;
memset(rec_buffer, 0, audio_data_len);
speex_echo_capture(echo_state, (spx_int16_t*)audio_rec_buffer, (spx_int16_t*)rec_buffer);
speex_preprocess_run(denoise_state, (spx_int16_t*)rec_buffer);
memcpy(audio_rec_buffer, rec_buffer, audio_data_len);
}

void aec_play_audio(void* audio_play_buffer, unsigned int audio_data_len)
{
if(echo_state == NULL || denoise_state == NULL|| play_buffer == NULL)
return;
speex_echo_playback(echo_state, (spx_int16_t*)audio_play_buffer);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: