微处理器(STM32 wifi芯片)实现音频回声消除

一.什么是回声消除(AEC)

在回答回声消除之前,我们看这幅图片,如下图所示:

当远端Far-end有说话者讲话时,声音会传到近端(Near-end)的扬声器,然后声音通过空间延时和传输延时重新回到了远端。这样就造成了声学回声。近端到远端的流程也有同样声学回声,在此仅仅描述近端的流程.

你可能问:我们手机为什么没有这个现象。因为我们手机安卓系统已经实现了回声消除的算法。

二.回声消除算法

我们本次讲解的芯片平台,主要是比较低端,频率比较低的芯片。比如SMT32 esp8266.比较高端的芯片绝大部分原厂已经实现了回声消除的功能。回声消除算法也是比较消耗CPU的,所以我们对于低端的芯片,需要去选择一个好的回声消除算法尤其重要。

常见的speex webrtc 都自带回声消除的功能

实际效果对比:如果样本非线性不严重,两者的效果都不错;对于非线性speex效果就很差,webrtc的效果好;双讲时,webrtc出来的音质就很差,有吃音现象。

所以本次我们主要讲解WEBRTC的回声消除算法,对于WEBRTC它有三个三种回音消除算法(aec aec3 aecm)。其中aec ,aec3 主要是给手机使用的,我们安卓系统就是用了这个2个。我们低端芯片可能就跑不动了,本次我们主要使用webrtc的aecm

三.aecm的使用

总体思路:喇叭播放音频数据时,先存储起来,存储在循环FIFO内,作为回声消除的Farend数据,建立一个aec线程,线程的主要工作流程:读取麦克风声音,读取喇叭存储的循环FIFO ,进行回声消除。

  1. 应用程序调用audio_capture_snddev_raw_pcm_read函数读取cap_ring_buff这个FIFO的数据,里面的音频数据是被回声消除过的干净的声音

  1. 应用调用audio_play_snddev_raw_pcm_write去播放音频数据,这个接口同时会把"播放的音频数据"放到 play_ring_buff 这个FIFO 作为回声消除的依据参数

  1. aec_thread 这个线程主要做回声消除算法。 从硬件的麦克风读取杂乱,含有回声的音频数据,然后从play_ring_buff读取音频数据。根据这两个数据,进行回声消除算法处理。处理好的干净的数据放到cap_ring_buff

四.aecm效果

可以满足基本的使用,CPU需要占用40%(芯片主频192M),内存需要20k

觉得对看官有用的,看的高兴可以给个打赏,谢谢!

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值