首页 >后端开发 >C++ >通过将 matlab/octave 算法移植到 C 来实现 AEC 的最佳解决方案

通过将 matlab/octave 算法移植到 C 来实现 AEC 的最佳解决方案

DDD
DDD原创
2024-10-17 18:13:24720浏览

完成!对自己有点印象。

我们的产品需要回声消除功能,确定了三种可能的技术方案,
1)利用MCU检测audio out和audio in的音频信号,编写算法计算两侧声音信号的强度,根据audio out和audio in的强弱在两个通道之间进行可选的切换,实现半双工通话效果,但现在市场上都是全双工通话效果,半双工会让产品竞争力降低

(2) 使用CPU厂商的回声消除算法,实际测试经过各种可调参数的调优以及与厂商多次讨论,回声消除效果不够干净,与预期效果相去甚远。供应商的反馈是改进外壳,使MIC与扬声器尽可能隔离,但由于ID设计、音质和音量要求,没有改变外壳的空间。

(3)从网上下载webrtc、speex等开源回声消除算法,交叉编译后移植到产品中。

4)从专门从事音频算法的公司购买算法,但每个产品都需要额外的成本,这会大大降低产品的竞争力。

权衡之后,我决定深入研究使用开源算法的解决方案;

所以,我从github、gitee等网站下载了一系列回声消除代码,都是C语言和matlab语言的。

以八度音程合成两个声音,生成一段包含近端麦克风捕获语音和远端参考语音的双讲场景。
然后运行在线下载的用于回声消除的代码,分析输出音频并选择其中最有效的算法。

从结果来看,webrtc音频处理的AEC算法不好,回声消除不干净,双讲场景有明显的吞话现象。 webrtc音频处理的AEC3算法干净,但是对双讲另一端的声音抑制非常大,声音断断续续,不自然;

speex有轻微的回声,最好找一个matlab语言实现的aec算法,回声消除得很干净,双讲只有轻微的吞字现象。

然后,我使用Visual Studio编译调试WebRTC AudioProcessing AEC开源代码,参考Matlab上面的AEC算法修改代码,使用在线调试设置断点、单步运行等分析语句的值逐步变化,最终得到的数据与matlab语言的aec算法的结果完全相同最终得到的数据与matlab的aec算法的结果完全相同;

今天编译到产品中,将MIC和SPEAKER增益调整到合理值,然后实际通话测试回声消除的效果,结果出奇的好。

这样就有希望设计出一款能够达到小目标之上销量的产品。

Best solution to AEC by porting matlab/octave algorithm to C

Best solution to AEC by porting matlab/octave algorithm to C

Best solution to AEC by porting matlab/octave algorithm to C

以上是通过将 matlab/octave 算法移植到 C 来实现 AEC 的最佳解决方案的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn