耳机抗干扰问题排查和优化
📎 原始文档:https://www.kdocs.cn/l/cfWTfaZTtMpj 耳机抗干扰问题排查和优化
关于蓝牙播歌卡顿问题
纯粹的蓝牙卡顿,都是丢包导致的,而导致丢包的原因一般有以下几种:
- 蓝牙设备本身信号不好,这里蓝牙设备不仅包含蓝牙音频设备(如耳机、音箱),还包含手机、电脑等主设备,只要有一方信号差,都会概率导致丢包,进而导致卡顿
- 环境干扰源大(如WiFi设备多),导致蓝牙通信差,手机发出的包耳机没有收到,或者耳机的回复手机没有收到,进而导致卡顿
- 软件原因,如通信窗口分配不合理,或者蓝牙同时要与多个设备通信(如EDR一拖二、TWS、BLE多连),或者同时工作于多种状态(如播歌+BLE广播+page+page scan等)。因为蓝牙的收发模块都只有一个,因此蓝牙同一时间只能和一个设备通信,如果手机发包过来的时候,耳机正在和对耳通信,或者正在发BLE广播,或者正在处于page/page scan状态,那么耳机就无法收到手机发出的包,或者无法回复手机的包,进而导致卡顿 针对以上几种原因,一般优化方案如下:
- 蓝牙设备本身信号不好,通过RF测试或者对比测试一般都能排除出来,需要优化硬件RF参数,包括但不限于重新layout、更换天线、调整匹配、整改结构等
- 环境干扰源大,参考软件优化方案
- 软件原因:修改软件配置,修改通信窗口配置,关闭一拖二、加大BLE广播间隔(如500ms),避免播歌过程中频繁开启page、page scan、inquiry scan等(可通过打印查看)
常见问题
测试和排查方法
进行以下测试时,先按照上文软件原因优化方案排除软件问题
- 实测干扰环境下rssi强度情况 查看耳机信号强度的手机APP:JL_RSSI_Test-V1.3.0-rssi-debug.rar
耳机软件需要添加代码或打开宏,以700N系列SDK为例,修改宏:
#define TCFG_USER_RSSI_TEST_EN 1 //通过spp获取耳机RSSI值,需要使能USER_SUPPORT_PROFILE_SPP
#define APP_ONLINE_DEBUG 0//这个要关掉
其他系列SDK同理参考700N系列。
耳机先连接手机,再打开APP,连上APP
工具界面
常见参数情况:
- 左或右耳跟手机的rssi偏差,需要优化单耳RF
- 左右耳之间的rssi偏差,需要优化RF穿头效果
软件优化方案
- 调整音频码率 应用场景:单耳测试抗干扰也差,且RF已无优化空间。
AAC码率,单位bit/s,越大越容易卡。
SBC码率:1 bitpool = 6~7 kbit/s,越大越容易卡。
- 加大延时 应用场景:单耳测试抗干扰也差,且RF已无优化空间。延时越小越容易卡。
加大普通延时:修改了CONFIG_A2DP_DELAY_TIME之后,上面的CACHE也要对应修改,保证CACHE不能大于CONFIG_A2DP_DELAY_TIME,且LOW要小于HI,如截图。
加大动态延时:(700N系列非138版本的,建议升级到138版本,有更好的延时调整流程)
700N V136及以下版本修改如下,将450改到550,不要超过550(建议升级到138版本)
已经是700N V138版本的则无需修改
- 调整收发包策略 应用场景:单耳测试抗干扰OK,但对耳测试抗干扰差,排查到是对耳穿头效果差且RF已无优化空间。
添加下面的函数到代码中,底层会自行调用(目前700N系列可用)。
针对近身测试抗干扰:
当tws_rssi比较好时,如果per_v较大,说明主机信号已经变差,此时一般主从都会卡,需要优化耳机与手机的RF距离;
如果是单边卡顿,且tws_rssi比较差,那基本都是从机卡,此时需要优化主从之间的穿头效果;
如果RF也没啥可以优化,只能适当加大extws_nack_limit,最差的情况就是要关掉adjust_extws_en,同时将CONFIG_EXTWS_NACK_LIMIT_INT_CNT改为63,此改法可能会导致拉距变短。
//调整附加包的函数
//tws_rssi:主从间信号强度
//per_v:错包率,等于FF时表示无错包,77的话就是77%
//num:当前缓存音频包数
//extws_nack_limit:TWS不回应附加包限制,最大63,越大越接近纯监听效果(允许从机不回应主机),越容易出现主从一起卡顿的情况
//return adjust_extws_en:是否自动调整附加包
u8 get_extws_nack_adjust(char tws_rssi, u8 per_v, u8 num, u8 *extws_nack_limit)
{
u8 adjust_extws_en = 0;
/* printf("[%d,%d]\n",tws_rssi,num ); */
int max_num = CONFIG_A2DP_DELAY_TIME / 24;
if (num > 4 && num < (max_num / 2 + 2)) {
putchar('a');
*extws_nack_limit = CONFIG_EXTWS_NACK_LIMIT_INT_CNT - 1;
adjust_extws_en = 1;
} else if (num >= 3 && num < 4) {
putchar('b');
*extws_nack_limit = CONFIG_EXTWS_NACK_LIMIT_INT_CNT - 1 - 1;
adjust_extws_en = 1;
} else if (num >= 2 && num < 3) {
putchar('c');
*extws_nack_limit = 0;
adjust_extws_en = 1;
} else if (num < 2) {
putchar('d');
*extws_nack_limit = 0;
adjust_extws_en = 1;
}
/* if(adjust_extws_en&&tws_rssi>-70) */
/* if (adjust_extws_en && (per_v < 50)&&(per_v!=0xff)) { */
if (adjust_extws_en && ((per_v < 40) || (per_v == 0xff))) {
if (*extws_nack_limit < (CONFIG_EXTWS_NACK_LIMIT_INT_CNT - 1)) {
*extws_nack_limit = CONFIG_EXTWS_NACK_LIMIT_INT_CNT - 1;
putchar('L');
}
}
return adjust_extws_en;
}