一 前言
最近比较忙,昨天更新了EQ 调试模块,今天就趁热打铁把ANC部分也写下。
主要说一些基于恒玄平台2500的ANC 环境搭配 软件设置 和 常见问题分析,个人见解,有不足之处,敬请锤教。
二 环境搭配 (此处引用BES 原厂ANC调试指南)
确保腔体的密闭性,前后腔部分需要用胶水密封,耳塞的尺寸要适宜人工耳佩戴。电声 测试使用粉噪或者 20Hz~20KHz 的扫频信号。准备好 ANC 调试开发板,正确连接耳机(注 意单端和差分的差异)测试场地为具有一定吸音效果的吸音房。
ANC mic频响曲线 逻辑示意图
实物测试
前馈耳机头:
MIC:
对于前馈耳机头的 mic 的选择,芯片对于硅麦(MEMS)和驻极体麦克风(ECM)都 是支持的,外围电路有差异,从调试的角度考虑硅麦和电容 mic 都可以,没有本质区别, ECM 在信噪比方面要优于 MEMS,但从生产的角度考虑,硅麦一致性更好。而前馈的降噪 的生产对一致性要求非常高。所以前馈的降噪方式推荐硅麦,尤其是入耳式的耳机,对降噪 量要求较高(典型 20dB 以上)。对于头戴式,由于被动降噪曲线,speaker 曲线随着人的佩 戴变化量较大,对降噪量要求不会太高(典型 10dB 左右),所以如果对电容 mic 频响稍加 控制,头戴式也可以用电容 mic。以下从幅度、相位、灵敏度、信噪比、隔离度来说明相关 要求。
① 幅度:要求降噪频段(典型 50Hz->3kHz)平滑即可,低频(100Hz 以内)不能衰减的 太多。 ② 相位:没有要求
③ 灵敏度:-38dB 以下,太高的灵敏度容易饱和。灵敏度在小于-38db 的前提下,越大越 好。
④ 信噪比:信噪比越高越好。(推荐 60dB 以上)。
⑤ 隔离度:跟 speaker 的隔离度越高越好。(这个还没有具体的数据,只是对比成熟的音 腔测试)。
⑥ 一致性:一致性要求较高,要求幅度差别 1dB 以内,相位差别 5 度以内,以保证 20dB 的降噪量。这里的幅度差别指的是趋势,频响曲线平行的幅度差别大的话没有问题,可 以用增益补偿回来。这里的指标指的是和 speaker 加起来的差别总和。如果降噪量要求 不那么高,可以适当放宽要求(如果降噪主要在 1K 之内,幅度波动要求只需在 1K 内 符合。如果降噪主要在 2K 之内,幅度波动要求则需在 2K 内)。
SPEAKER:
单前馈的耳机头,照着音质最好的频响曲线去做就行。主要是降噪频段的幅度 平滑就行。
① 幅度:要求降噪频段(典型 50Hz->3kHz)平滑即可,低频不能衰减的太多。 BES_ANC 参考指南 V1.3 2 / 10
② 相位:没有要求
③ 灵敏度:越高越好(降噪频段)。
④ 隔离度:跟 mic 的隔离度越高越好。
⑤ 一致性:一致性要求和 MIC 一样。
⑥ 被动降噪曲线:被动降噪曲线越平滑越好,(低频不宜降噪量过大)。另外就是佩戴起来 越稳定越好。也就是每次佩戴都差不多,而不是每次佩戴差别都很大。
反馈耳机头:
MIC:
由于反馈的方式的降噪量对 mic 的频响不太敏感。所有对 mic 的类型没有特殊要求。 幅度:低频不能衰减的太多;
① 相位:没有要求
② 灵敏度: 可以略高于前馈
③ 隔离度:和 sperker 隔离度越低越好,也就是 mic 和 speaker 的距离应该尽量靠近; SPEAKER:
反馈的耳机头,低频能量越多越好(100Hz 以内的)。一是有利于降噪量的增加; 二是反馈降噪会影响低频的音乐,如果低频能量较高,这样降噪后的音乐播放仍然具有较好 的低频,这样会降低 EQ 的补偿。
① 幅度:低频能量越大越好
② 相位:没有要求
③ 灵敏度:越高越好
④ 隔离度:和 mic 隔离度越低越好,也就是 mic 和 speaker 的距离应该尽量靠近。
ANC 调试主要分为以下几大步骤:
a、测试空场信号 不佩戴耳机的状态下直接测试粉噪(或扫频)的 MIC(仪器)回馈
b、测试被动曲线 在耳机不通电的情况下,将腔体佩戴在人工耳上,测试粉噪(或扫频) 的 MIC(仪器)回馈。
c、调试降噪性能 利用 ANC 调试工具,调整 ANC 参数,直至达到最佳。
d、佩戴验证效果 试听 ANC 效果的实际听感(注意是否有杂音、底噪、啸叫、高频反 升)
三 ANC工具配置连接和使用
a.有线调试
在此模式下,可以通过连接整机直接调试 ,无需烧录软件,跑的是ANC最小的bin文件。
如我调试2500IH使用的 “uart_1305_20201214_v0.bin”,在调试工具的cfg文件夹中,由原厂给出
工具配置调试方式为UART
"programmer_file_path": "D:\\software_development_tools\BES\ALL_IN_ONE_BES_Designer_Tool_v1.0.3\cfg\1305\\uart_1305_20201214_v0.bin", ”
影响工具在线调试和实际写入系数一致性,在如下的代码位置和工具,有几个影响因素:
代码Target.mk 文件下:
基础配置:
1)
export ANC_FF_ENABLED ?= 1
export ANC_FB_ENABLED ?= 1
分别表示前馈和反馈是否开启,根据项目来填写; 1=开启 0=关闭
2)
export AUD_SECTION_STRUCT_VERSION ?= 1
2000I系列,这里写1;
2300/2500系列,这里写2;
3)
export AUDIO_SECTION_SUPPT ?= 1
表示音频区读取,1=读取音频区;0=不读取音频区;
工具写入anc系数在固定音频区,因此这里需要写1;(非常重要)
4)
export AUDIO_ANC_FB_MC_HW ?= 1
TWS后馈使用这个 立体声耳机后馈使用 export AUDIO_ANC_FB_MC ?= 1
5)
AUDIO_RESAMPLE ?= 1
对于2000i 系列的芯片而言:
单前馈或单反馈的配置时,这里写1;
混合降噪配置时,这里写0;
AUDIO_RESAMPLE的值要和anc工具里面的AUDIO_RESAMPLE变量对应起来:
代码Tgt_hardware.h 文件中:
#define ANC_FF_MIC_CH_L AUD_CHANNEL_MAP_CH0
#define ANC_FF_MIC_CH_R AUD_CHANNEL_MAP_CH1
#define ANC_FB_MIC_CH_L AUD_CHANNEL_MAP_CH2
#define ANC_FB_MIC_CH_R AUD_CHANNEL_MAP_CH3
表示mic的通道配置,根据具体项目来填写channel;
硬件的通道MIC1,2,3,4,5 对应软件配置的CH0,1,2,3,4;
备注:这个通道配置要和anc工具中的配置一样,否则工具调试和实际运行会不一致;
上图是工具json文件中通道的配置;
注意:针对2300Y的mic5 作为通话mic
如果软件里面配置了mic5作为通话,那么工具里面也必须配置mic5作为通话
在ANC Designer(bes2300)_v2.0.19版本及以上版本中:
0表示:mic5不作为通话mic
1表示:mic5作为通话mic
如果软件配置了(或没配置)mic5为通话mic,而工具里面没有配置(或配置)mic5,则工具测试和写入测试不一致。Gain值相差1.1db
注意:mic5的这个问题,仅用于2300, 2000i 系列不需要这样处理
6)
Mic电压配置:
Mic 可以由vmic1和vmic2(2300可以提供vmic3和vmic4)提供,根据具体项目原理图来配置电压输出;
在代码tgt_hardware.h里面加一句定义
#define CFG_HW_AUD_INPUT_PATH_ANC_DEV (AUD_VMIC_MAP_VMIC1| AUD_VMIC_MAP_VMIC2)
如上:表示开启vmic1和vmic2,同理配置vmic3,vmic4
BES代码默认是仅开启vmic1,客户根据具体项目去配置vmic2,vmic3,vmic4;
BES ANC工具是默认将所有vmic都开启的;
注意:2000I 系列只有VMIC1和VMIC2, 2300系列才有VMIC3和VMIC4 !!!
7)
Flash大小配置:
各个系列的芯片flash大小有不同,因此工具中的flash大小配置要对应实际代码:
实际flash配置的大小可以从trace中看到:
开机的前几行log就有flash大小配置;如图是0x400000; 则表示flash配置32Mb
如果是0x100000,则是8Mb; 0x200000,则是16Mb;
或者在代码中搜索FLASH_SIZE 也可以看到定义的大小;
在工具中的json文件对应如下:
这个FLASH_SIZE 大小配置要和代码中大小一样;否则会将系数写入错误的flash区域;
附注:
多模式的选择:
Anc工具中支持多模式,在选框中有mod1, mod2,mod3,mod4的选择
同样,在代码中也可以支持多模式,
tgt_hardware.h中:
#define ANC_COEF_NUM (1)
1 表示mod1; 2 表示支持mod1和mod2双模式, 同理3,4表示3模式和4模式;
默认代码是1;
默认的调用逻辑是:按一下降噪按键,递增调用模式,
以双模式为例说明:开机以后,按一下降噪按键 调用mod1,再按一下 调用mod2, 再按一下 关闭。
b.无线调试tws 说明文档:
滤波器设计工具:ANC Designer(bes2300)_v2.0.18 版本及以上版本支持无线调试ANC
需要的设备:美格信提供的dongle,电源上电即可,驱动会自动安装
驱动成功安装后,在设备管理里面出现如上端口
工具里的json文件
Conmmunication: tcspp;
Spp_dev_name:待测耳机的蓝牙名称的部分关键字;
比如蓝牙名称为:BES2500_TWS
则Spp_dev_name可以写 ANC_TEST或TCSPP等
同时注意FLASH_SIZE, AUDIO_RESAMPLE等的配置正确
代码的更改:
Target.mk 文件下:
APP_ANC_TEST ?= 1
TEST_OVER_THE_AIR ?= 1
这两个宏写1;
然后在代码中:
根据项目配置FF 或FB(前文中有叙述,此处不做重复)
根据项目配置ANC MIC的通道(前文中有叙述,此处不做重复)
根据项目配置VMIC开启(前文中有叙述,此处不做重复)
配置AUDIO_SECTION(前文中有叙述,此处不做重复)
配置AUDIO_RESAMPLE(前文中有叙述,此处不做重复)
编译后,下载到耳机中
开启工具,选择SPP端口号,点击connect;此时待测耳机开机(按键开机或touch开机等),使其进入paring状态(各个客户用自己的UI进入paring状态),同时待测耳机要离dongle比较近,约30cm,正常情况下15s以内可以和dongle连接成功,工具状态显示success。到这一步后,可以正常调试滤波器了。
c.调试工具说明:
工具版本众多,UI 界面及配置会略有差异,以下界面以 2500 工具为例。
1.cfg 配置文件夹说明
productline_cfg.json | 文件中存放工具的相应配置 |
communication | 芯片与工具的通讯方式,分有”uart” 、”usb” 、”spp”和 ”tcspp” (BT_ANC 配置”uart”,USB_ANC 配置”usb”,FWS 耳机无线连接配置”spp”,FWS 耳机通过第三方 dongle 做无线透传连接配置”tcspp”) |
flash_size | 芯片的 flash 大小,分有”8Mb”和”32Mb”(根据芯片 flash 大小而动, 默认为 8Mb,烧录数据的地址以此做参考) |
vCodec | Codec 的供电电压,分有”1_6V”和”1_8V”和”2_5V”,(BT_ANC 常用 1_6V 或 1_8V,USB_ANC 使用 2_5V。如果用 1.6v,则 vana 必须要和 vcodec 在电路上连接起来,如果用 2.5v,则 vana 必须和 vcodec 在电路上断开连接,2000i 默认使用 1_6V,2300 默认使用 1_95V) |
aud_channel_cfg | 麦克风的通道位置,对应有左前、右前、左后、右后(物理通道 1/2/3/4/5 分别对应代表软件通道 0/1/2/3/4,通道配置错误可能无声)。 |
coef_length 代表滤波器长度,默认无需改动
Diff 喇叭差分输出为 true,喇叭单端输出为 false,依据实际电路原理来定
Audio_resample 代表重采样的开关,分别对应”true”和”false”(BT_ANC 需开重采样, USB_ANC 关闭重采样,和软件中的 audio resample 宏配置对应,软件如果打开 resample,则写 true,否则写 false)
Feedback 代表反馈通路的开关,分别对应”true”和”false”(纯前馈 ANC 需关闭此项)
Feedforward 代表前馈通路的开关,分别对应”true”和”false”
2.coef 文件夹 coef 文件下存放 ANC 相应的滤波器数据,最多可支持 4 个模式,每个模式下分有 44.1K、 48K、50.7K 采样率(采样率的选择与 AUDIO_RESAMPLE 存在关联)。确定好最终滤波器数据后,需要将此 coef 文件夹拷贝到产线 ANC 校准工具下覆盖原有的 coef 文件夹。注:工具每次重新启动都会将滤波器数据清空
3.ANC 调试工具界面介绍
界面左边为功能区和数据区,右边黑底为图形区,其中右上半部分为增益—频率图,右下部分为相位—频率图。
功能区按钮解释:
Anc switch off 勾选则关闭当前 ANC 效果,不勾则开启 ANC 效果
Anc Mode ANC 调试模式,最大支持 4 个模式,从 mode1 开始
Dump 将芯片内部 flash 区 ANC 数据回读,数据可在后端控制台查看
Burn 将调试数据烧录到芯片内部 flash 指定分区(掉电不丢失)
Preview 单击则执行一次 ANC 数据在线调试,每改动一次界面数据需单击一次此按钮方有效(数据掉电丢失)
Connect 执行连接命令
Check ports 选择当前设备端口
Save 保存界面数据到文件(不可出现中文路径和特殊字符)
Load 导入界面数据文件(不可出现中文路径和特殊字符)
ANC 数据区按钮解释:
Get config data from ff-right 将 ANC 数据从右拷贝到左(或从左到右)
ANC OFF 勾选则关闭当前侧 ANC 效果
TotalGain 总增益(-6~6)
Reverse 勾选则喇叭极性取反
IIR_by_pass 勾选则关闭 IIR 数据效果
DAC_Gain DAC 增益,默认为 0
ADC_Gain ADC 增益(0/6/12/18/24,0/6 为负增益,18/24 为正增益),此处 2300 芯片与 2000i 芯片有所不同
4.滤波器使用介绍
ANC 调试目前使用的是无限长单位脉冲响应(IIR)滤波器,目前提供有
Peak/Notch、LowShelf、HighShelf、LowPass、HighPass 滤波器,滤波器原理不一阐述。
ANC 调试:
① 单前馈:
第一步:先确定整体的大致增益,调整 Reference_Gain(该值通常为负值),调整过程中,电声测试仪测试到的曲线会整体下移,低频段最低则为当前最佳值。
第二步:添加滤波器,滤波器遵循分频段调试,首先调制低频(~200Hz),通常在低频频点
20Hz 左右加入 LowShelf 类型,Gain 值为正值,Q 值小于 1 的滤波器。
第三步:抑制高频(1000Hz~)反升,在相应频点附近加入 Gain 值为负值,Q 值在 1 左右的 HighShelf 滤波器,用于抑制高频部分的整体反升。如果只有高频区间小部分反升,则考虑使用 Gain 值为负值的 Peak 滤波器。
第四步:在处理了低频和高频之后,中频部分降噪量会有所损失,在相应位置加入 Peak/Notch 滤波器,Gain 值不宜过大,正负视具体而定。
第五步:由于滤波器中引入了增益,之前的 Reference_Gain 值不一定为最佳,此时需要对
Reference_Gain 进行微调,以达到最佳。下图为某款已上市入耳式耳机的调试降噪曲线图。
- 单反馈:反馈系统因 MIC 离喇叭位置较近,极易产生声音回路引起啸叫。
第一步:在高频位置加入值为负的 HighShelf 滤波器或者值为负的 Peak 滤波器用于抑制高频的反升。
第二步:调整反馈 Reference_Gain 值,增益过大会引起啸叫。
第三步:在低频位置 100Hz 附近加入正值 Peak 滤波器,Gain 不宜过大。
- 混合式混合式降噪系统的处理实际上为单前馈和单反馈的结合,要注意的是,混合式降噪系统中要注意反馈的抑制量,过大仍然会引起啸叫。
关于降噪量:降噪效果的主要表现在两个方面,一是最大降噪深度,即主动降噪所能达到的最大降噪量,前馈入耳式耳机通常为 25db 左右,混合入耳式耳机通常为 35db 左右,最大降噪深度一般体现在 100-200Hz 这个频段;二是降噪宽度,通常指的是主动降噪跟被动降噪在曲线上的交叉频点,一般情况下为 1000-2000Hz 附近。下图为 BOSE QC20 耳机头搭载 BES2300 系列芯片的混合降噪效果与 QC20 的对比曲线。
四 常见问题分析解决
1. UART工具连接不上的问题
确定上面介绍的配置设定是没有问题的
如果你电脑是第一次使用,可能是缺少驱动 库 需要安装“libusb-win32-devel-filter-1.2.6.0.exe”
微云链接:文件分享
.TWS耳机 SPP方式连接 :
a.首先需要进入配对模式,一般来说ANC 都是单个调试的
可以在SDK apps.cpp app_init 上修改源代码:
app_ibrt_ui_event_entry(IBRT_FREEMAN_PAIRING_EVENT);
b. 可能美格信 工具的SPP channel 配置不对 恒玄代码中使用的RF channel 是12
连接之前使用串口指令修改 美格信 donggle SPP channel
修改指令 :SPP_CH_SET=12
2.ANC降噪开启时,会对音乐的音质有所影响。
需要通过添加EQ进行声音补偿,默认的代码中只有正常模式的EQ参数,而且增益全0,那如何添加ANC开启的EQ参数呢?
1)添加ANC模式的EQ数组:
2) ANC EQ 参数的使用和更新
3. BES ANC /TT 也有产线校准机制 ,如果 AUDIO_SECTION 有数据 ,在上电开机会导入烧录的数据,并且覆盖代码默认的ANC 参数 。
3.1 默认代码ANC 参数类型修改:
tgthardware.c
如 我在项目中修改的 :
ANC 参数生效需要参数导入修改滤波器,BES 实现函数如下:“app_anc_switch_coef”
3.2 SPP ANC 产线校准后参数生效原理:
3.2.1 AUDIO_SECTION 数据导入:
根据芯片不同 分配的Flash起始地址也有差异,默认分配大小为64K (0x10000). 在上电开机初始化会有打印
如1305(2500IU/IZ/IH) 系类起始地址为:
1501系类(2500ZP/2500Z/2500YP/2600YP)如下:
这个数据区域可以是SPP 工具校验写入:(代码中的函数接口在aud_section.c中)
int audio_section_store_cfg(uint32_t device, uint8_t *cfg, uint32_t len)
数据的搽除是无法在OTA升级的时候搽除的,如果想要搽除 ,可以通过烧录工具或者自行编写一段代码:
对于整机或者不支持 单线升级接口的耳机 可以如下修改代码 :
extern uint32_t __aud_start[] ;
void app_eaebud_auido_section_clear(void){
enum HAL_NORFLASH_RET_T flash_opt_res;
uint32_t flag = int_lock();
flash_opt_res = hal_norflash_erase(HAL_FLASH_ID_0, (uint32_t)__aud_start ,AUD_SECTION_SIZE);
int_unlock(flag);
if (flash_opt_res){
TRACE(2,"[%s] ERROR: erase flash res = %d", __func__, flash_opt_res);
}
else{
TRACE(1,"[%s] : erase audio flash successfully", __func__);
}
}
重启后AUDIO_SECTION数据就会被清空
3.2.3 ANC fade in/out
默认代码是没有开启ANC fade in /out 功能的,需要在app_anc.c中 注释掉“ANC_MODE_SWITCH_WITHOUT_FADE” anc淡入淡出使用函数接口如下:
3.2.4. ANC 相关软件设置不当导致的noise
a. 重采样问题 :anc系数加载由44.1k采样率转换到48k采样率(或48k转44.1k),系数切换有轻微pop,解决方案是系数 不切换 (详细修改见下4 代码附)
b. fade in/out 设置问题,需要使用低优先级任务的线程处理fadein out,这样来保证fadein过程不会有杂音出现
3.2.5. ANC ON的底噪
a. 一般由滤波器参数产生的底噪是由fb参数设计带入的,fb 滤波器peak点越靠近高频,底噪越大,因此最好是在200hz内 做peak,300hz后peak的增益不要太大,5db内即可
b. 选取snr高的mic 有利于底噪
4.BES 开启ANC后,播放音乐时切换播放提示音带有POP音
BES开启ANC后,我们在听音乐过程中,进行暂停/上下曲等UI操作伴有提示音时,就会发现有pop音带出。这是因为在codec_int_stream_setup里ANC模块同步变更采样率导致。
通常的解决方式就是 在可以在这里加个判断,如果播放的stream为media ,ANC的采样率不做变更。
// Always config sample rate, for the pll setting might have been changed by the other stream
CODEC_TRACE(2,"[sample_rate]old=%d new=%d", codec_int_cfg.stream_cfg[stream].codec_cfg.sample_rate, cfg->sample_rate);
if (codec_int_cfg.user_map & CODEC_USER_ANC) {
// Check ANC sample rate
if (stream != AUD_STREAM_PLAYBACK){ // add here for Solve POP sound caused by sampling rate conversion.
if (codec_anc_handler) {
enum AUD_SAMPRATE_T cfg_rate;
enum AUD_SAMPRATE_T old_rate;
cfg_rate = hal_codec_anc_convert_rate(cfg->sample_rate);
if (cfg_rate != codec_anc_samp_rate) {
old_rate = codec_anc_samp_rate;
codec_anc_handler(stream, cfg_rate, NULL, NULL);
codec_anc_samp_rate = cfg_rate;
TRACE(5,"%s: ANC sample rate changes from %u to %u due to stream=%d
samp_rate=%u",__func__, old_rate, codec_anc_samp_rate, stream,
cfg->sample_rate);
}
}
}
}
ANC 这一块的我所了解的大概就这么多了 ,后续再更新IBRT对耳通讯 ENC调试 等章节