回音抑制

整理笔记
1、speak线程和mic线程不能有顺序的执行,执行比较乱如上面图片的S1、M1的执行顺序
2、speex_echo_state_init(160,1600)的第二个参数是回音路径长,其实就是delay(延时时间)
3、所谓的delay时间就是spear播出时间到mic录到时间的差,这个delay的时间保证在100ms以内


下面的工作路线:
1、首先调整好音频数据的流畅度及队列处理好。
2、保证每帧采样数为160(20ms),这样delay的时间保证在100ms之内。
3、保证没有声音也要往orgdata.data里保存数据,如此不会出现speak数据断层,cancellation找不到对应的speak数据。
4、其实auioplay开始的loop中设置的audio_count数,也决定这speak数据的delay,这样数据也要调整。
5、





很多朋友和我说speex的aec模块的效能并不好,我们先来看一下speex的aec的api调用方式。


SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length);

frame_size 的取值最好是一个编码的frame大小,在低带宽条件下,一般延迟20ms,而大小为160
filter_length,最好是房间内反射时间的1/3
如: 一个房间的反射时延为300ms
    那么这个filter_length就最好是100ms(这个长度又被称为tail length).

而其中filter_length的设定是一个关键。


speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue);

其中:
input_frame: 就是被声卡捕捉到的声音
echo_frame: 是由扬声器播放出的声音,这个声音是需要从 input_frame中抵消的声音.

output_frame 是处理完以后输出的声音

residue是一个可选参数,如果不使用可以将之设置为NULL, 也可以通过preprocessor 来控制

问题的关键是 处理input和echo 之间的关系,
也就是说在捕捉到的信号和播放的信号之间的延迟必须足够的小,才可以提高效率.

writetosndcard(echo_frame, frame_size)
readfromsndcard(input_frame, frame_size)
speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue)
如果你想要尽可能的减小信号中的回音,那么可以将residue这个参数设置为噪音参数.

我相信在大多数情况下,都是因为声音捕捉和声音播放之间的同步问题没有处理好,导致的音频质量下降。


speex_echo_state_destroy(echo_state);

speex_echo_state_reset(echo_state);
不再复述了!





1先初始化 

     speex_echo_state_init(m_nFrameSize, m_nFilterLen); 

 

     m_nFrameSize 是采样的帧长,   一般是  80   , 160  , 320 

     m_nFilterLen 是回音消除的尾长 一般是  80*10 ,160*10,320*10

 

   2 擦除处理

     speex_echo_cancellation(m_pState,( __int16 *) mic, ( __int16 *)ref,( __int16 *) out);

 

     m_pState         是擦除句柄

     mic              是录音录取到的数据

     ref              是放音的数据

     out              是经过擦除后的数据

/*
*创建AEC对象
*/
SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length);

frame_size 的取值最好是一个编码的frame大小, 在低带宽条件下,一般延迟20ms,而大小为160
filter_length,最好是房间内反射时间的1/3
如: 一个房间的反射时延为300ms
    那么这个filter_length就最好是100ms(这个长度又被称为tail length).

而其中filter_length的设定是一个关键。

/*
*执行AEC
*/
speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue);

其中:
input_frame: 就是被声卡捕捉到的声音
echo_frame: 是由扬声器播放出的声音,这个声音是需要从 input_frame中抵消的声音.

output_frame 是处理完以后输出的声音

residue是一个可选参数,如果不使用可以将之设置为NULL, 也可以通过preprocessor 来控制

问题的关键是 处理input和echo 之间的关系,
也就是说在捕捉到的信号和播放的信号之间的延迟必须足够的小,才可以提高效率.

writetosndcard(echo_frame, frame_size)
readfromsndcard(input_frame, frame_size)
speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue)
如果你想要尽可能的减小信号中的回音,那么可以将residue这个参数设置为噪音参数.

我相信在大多数情况下,都是因为声音捕捉和声音播放之间的同步问题没有处理好,导致的音频质量下降。

/*
*销毁和复位
*/
speex_echo_state_destroy(echo_state);

speex_echo_state_reset(echo_state);
不再复述了!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值