【ESP32-Korvo测评】(7)回声消除算法测试
[复制链接]
回声消除(AEC)是设备避免自身播放的声音被进行中的录音所记录而采取的处理方法。回声消除的一个典型应用是免提电话:通话对方的讲话是会传入本机的麦克风的,若不作处理对方将听到自己讲话的回音。因此设备以自身播放的音频信号作为参考,试图从采集到的音频信号中减去回声信号,这个回声的估计要用自适应滤波的方法来实现。
ESP-Skainet 音频算法包括了 AEC, 且作为语音信号处理的第一步。在 Korvo 板子的硬件上,ADC四个通道其中有一个就是采集Codec输出的音频用的,作为AEC参考的输入。从 recsrcTask() 任务代码中可以证明这一点。
为了测试 AEC 的效果,我在录音的时候要播放一段音乐。因此我又加了一个 playTask 任务,从 SD 卡读取 PCM 文件,用 i2s_write() 输出给 Codec. 仅作为测试用,声音卡顿的问题就不处理了。附件是 AEC 前的麦克风信号,和 AEC+MASE 处理过的音频信号。因为 AEC 算法出来的声音有问题,暂且给 MASE 处理一下,不然听起来很差。
https://bbs.eeworld.com.cn/forum.php?mod=attachment&aid=NTI2OTQxfDRjOTc1YTUyODIxNTIwZjI0Yjc3NjYwMzc5YWVlOTllfDE3MzcyNDQ2NzA%3D&request=yes&_f=.mp3
我用了一个离得不远的电吉他音箱来放音,从麦克风录进来的音乐声要比我讲话的声音高出许多。在音乐开始后,AEC算法需要一段迭代时间进行滤波器学习,然后,音乐声就得到了抑制。算法的自适应过程仍然不会停止,因为外部声学路径的特性随时可能变化(比如声波反射因周围物体移动而改变)。在除了回声之外有其它声音的时候,自适应学习会受到影响,这一点可以从录音中听出来。
我认为这个 AEC 算法的设计除了有点bug要解决之外,效果是可以的。若要设计有对讲、监听等功能的机器的,需要 AEC 又不打算自己研究实现,那么可以考虑用 ESP32 平台,直接用 ESP-Skainet 里的 AEC 算法,毕竟软件免费。
|