本文介绍了声加算法在BES平台的集成方法, 以BES2500YP为例子, 演示集成声加三麦ENC通话降噪算法的详细步骤, 本文为BES平台声加通话ENC降噪算法集成 (一) 的续篇, 上篇主要介绍了声加算法简单介绍和目录结构, 以及演示了集成算法前的准备工作, 未看过的朋友请先看上篇
算法集成的流程
下面会以2500YP为例, 演示声加双麦通话降噪算法的集成过程
集成前的准备工作
- 检查通话的配置, 可以参考上一篇文章, 配置MIC通道配置、MIC通道数和增益大小
- 先验证BES的原生SDK, 编译, 打开副核SCO_CP_ACCEL, 验证副核能跑起来, 并且没有出现死机的情况(有些BES芯片不是双核芯片, 没有副核, 这步验证就不需要做). 编译完成后还需要在自己所需要的调试的硬件上烧录确认能跑起来, 通话正常、播歌正常没有死机等其他问题. 这一步验证的是原生SDK的好坏, 可避免后续在整合算法后出现问题不知道算法的问题还是原始SDK就出现的问题
添加语音算法通道文件和副核语音处理文件
- 其实就是bt_sco_chain_thirdparty_soundplus.c和bt_sco_chain_cp_soundplus.c这两个文件添加到SDK根目录下的app/audioplayers目录下, 并修改app/audioplayers/makefile文件指定编译声加算法使用上面添加的两个文件. Makefile的修改仅供参考, 根据实际代码修改, 目的是为了通话时跑bt_sco_chain_thirdparty_soundplus.c和bt_sco_chain_cp_soundplus.c里面的代码, 而不是跑的BES自带的bt_sco_chain.c和bt_sco_chain_cp.c
- 修改app/audioplayers/bt_sco_chain_cp.h中的头文件内容如图
因为sco_cp_process是在新添加的bt_sco_chain_cp_soundplus.c代码中重新实现了, 需要的参数不一样了, 所以需要修改接口函数的声明
添加算法soundplus/库文件夹
因为声加的算法库也属于app的一部分, 所以这里是将算法放在了apps/thirdparty_algorithm/路径下
apps/Makefile修改
apps/thirdparty_algorithm路径下也新建了个Makefile文件, 将soundplus/路径加入目标中
apps/audioplayers/Makefile加入修改
以上三个Makefile的修改仅供参考, 需要根据实际代码路径修改, 其目的是为了将通话算法编译进SDK
链接脚本配置
修改脚本文件scripts/link/best1000.lds.S, 默认是这个文件, 具体由target文件夹中的INTSRAM_RUN宏控制
打开best1000.lds.S文件, 并修改指定要加载到SRAM运行的text、data、rodata, 需要将算法库副核运行的函数加载到SRAM运行; RAM不足时, 因BES当前不支持主副核同时访问FLASH, 应该优先将在副核中执行的算法部分链接到RAM中
-
overlay_text0中添加内容
以上是算法库.a文件中需要调用的函数, 需要添加进入, 每个算法库需要调用的函数可能会有差异, 可以使用命令行进行查询. 进入lib目录, 在linux shell命令行中输入以下命令即可, 就会生成库中所需要overlay_text0中添加的内容:
arm-none-eabi-size lib | awk ‘{if (NR>1 && $6!=“AttDNN_Coef_q7.o”)print “*:”$6"(.text*)"}’
需要注意的是命令中的lib需要替换为实际使用的库名, 比如这里是libv3.0alpha_18282f98_bes2600_release.a
上面只会生成lib中所需要链接的函数所在文件列表, 不包含算法适配层所需要的文件, *:Soundplus_adapter_ap.o(.text*)和*:Soundplus_adapter_cp.o(.text*), 需要自行添加 -
overlay_data中添加内容
生成方法与生成.text的方法类似
在算法.a目录下输入以下命令生成:
arm-none-eabi-size lib | awk ‘{if (NR>1 && $6!=“AttDNN_Coef_q7.o”)print “*:”$6"(.data* .rodata*)"}’
-
建议将sndp_license_Api链接到boot空间, 以便于后期授权
Ref的获取
在voicebtpcmplay_sco_dma_snapshot.cpp中的函数process_uplink_bt_voice_frames(), process_downlink_bt_voice_frames()中增加如下图中部分
process_uplink_bt_voice_frames:
process_downlink_bt_voice_frames():
根据项目具体代码修改, 不同SDK这两个函数可能略有不同, 目的是正确拷贝ref_pcm_buf
编译
在编译过程中, 可能会出现缺少以下文件的错误提示arm_add_f32.c, arm_mult_f32.c, arm_sub_f32.c, arm_dot_prod_f32.c, arm_scale_f32.c
需要在platform/cmsis/Makefile中指定算法库依赖的底层dsp接口实现
或者修改platform/cmsis/DSP_Lib/Makefile的文件, 添加缺少对应dsp链接文件如图, 每个算法可能需要用到的math function可能略有不同, 需要根据编译时报错的具体文件来添加缺少的链接文件
以上声加算法就已经集成完成了, 可以用来进行上行降噪效果的测试了, 但算法一般不能直接量产使用, 需要产线授权才能使用(毕竟算法就是靠授权的数量来进行收费的嘛), 一般使用的是USBKEY授权方式. 没有经过授权的设备通话时候会有一定的限制, 比如每隔几分钟会播放杂音提示或只能测试使用一段时间