SpeexDsp回音消除的一些理解

发布时间 2023-09-14 18:00:59作者: 阿风小子

1.speexdsp的变量定义:

SpeexEchoState *echo_state = NULL;//回声消除变量
SpeexPreprocessState *pre_state = NULL;//噪声抑制变量
int sampleRate = 16000;//16k采样率

2. speexdsp的初始化:

echo_state = speex_echo_state_init(256, 2048);//回音消除初始化
参数说明:256为每次算法处理的一帧数据的大小(此时的数据格式为short),2048为尾音长度(一般为256*8)

pre_state = speex_preprocess_state_init(256, sampleRate);//噪声抑制初始化
参数说明:256与以上的256对应即可, sampleRate为以上定义的采样率变量

speex_echo_ctl(echo_state, SPEEX_ECHO_SET_SAMPLING_RATE, &sampleRate);//回音消除参数设置
参数说明:echo_state为以上定义的变量,SPEEX_ECHO_SET_SAMPLING_RATE默认即可不用管,sampleRate为设置的采样率变量

speex_preprocess_ctl(pre_state, SPEEX_PREPROCESS_SET_ECHO_STATE, echo_state);//噪声抑制参数设置
参数说明:pre_state为以上定义的变量,SPEEX_PREPROCESS_SET_ECHO_STATE默认即可不用管,echo_state为以上定义的变量


3. speexdsp的使用:

speex_echo_cancellation(echo_state, (short *)voice_capture_buf, (short *)voice_play_buf, (short *)end_buf);//实现回音消除
参数说明:echo_state为以上定义的变量,
voice_capture_buf为从麦克风采集的语音数据(如果是char需要强转,如果是short则不用),
voice_play_buf为从网络接收到的语音数据(如果是char需要强转,如果是short则不用),
end_buf为处理后的语音数据,此时的数据已去除回音

 

speex_preprocess_run(pre_state, (short *)end_buf);//实现噪声抑制
参数说明:pre_state为以上定义的变量,end_buf为回音消除后得到的数据


4. 注意事项:
用speex_echo_cancellation实现回音消除时,voice_capture_buf与voice_play_buf有顺序关系,voice_play_buf在前(正在播放),
voice_capture_buf在后,这样才可以实现将采集的数据中去除掉正在播放的回音数据,我是放在同一个线程中处理的,具体怎么做随意,实现效果就行