2、射频环境感知:RSSI与LQI的采集与滤波、自适应跳频算法、信道质量评估模型

好,咱们进入实战课程的第二讲。这一讲,说白了就是教你的TWS耳机怎么「听」懂周围的射频环境。

你想想看,耳机在口袋里、在公交车上、在人来人往的商场里,周围的2.4G信号乱成一锅粥。Wi-Fi、蓝牙、甚至微波炉都在这个频段上凑热闹。如果耳机是个「聋子」,它根本不知道外面有多吵,那断连就是迟早的事。

所以,射频环境感知是连接稳定性的第一道防线。我个人习惯把这一章叫做「耳机的眼睛和耳朵」。

2.1 RSSI与LQI:两个最基础的感知指标

先说说RSSI。Received Signal Strength Indicator,接收信号强度指示。单位是dBm。这个值越接近0,说明信号越强。比如-40dBm就是贴着耳朵,-90dBm基本就要断连了。

但这里有个坑——RSSI只能告诉你信号「大不大」,不能告诉你信号「好不好」。我在项目中遇到过这种情况:RSSI显示-55dBm,看着挺强,但音频就是卡顿。为什么?因为干扰太严重了。

这时候就要看LQI了。Link Quality Indicator,链路质量指示。它反映的是接收到的数据包的错误率。LQI值范围一般是0到255,越高越好。有些芯片厂商会直接映射成百分比。

核心观点:RSSI看「量」,LQI看「质」。两者必须结合使用,缺一不可。

嗯,这里要注意。不同芯片的RSSI和LQI的原始值含义可能不同。比如CSR的芯片和Realtek的芯片,LQI的计算方式就不一样。我建议你在做底层驱动时,先读一遍芯片手册的RF部分,别想当然。

2.2 采集与滤波:别被瞬时值骗了

直接拿RSSI的瞬时值做决策,那是新手干的事。为什么?因为射频信号波动非常大。你走一步,RSSI可能跳10个dB。如果你根据一次采样就决定跳频,那耳机得累死。

我常用的方法是滑动窗口平均滤波。说白了就是取最近N次采样的平均值。N取多少?我个人习惯取5到8。太少了滤不掉毛刺,太多了反应太慢。

给你看一段伪代码,这是我实际项目中用过的逻辑:

// 滑动窗口滤波示例
#define WINDOW_SIZE 8
int16_t rssi_buffer[WINDOW_SIZE];
uint8_t buffer_index = 0;

void filter_rssi(int16_t raw_rssi) {
    rssi_buffer[buffer_index] = raw_rssi;
    buffer_index = (buffer_index + 1) % WINDOW_SIZE;
    
    int32_t sum = 0;
    for (int i = 0; i < WINDOW_SIZE; i++) {
        sum += rssi_buffer[i];
    }
    int16_t filtered_rssi = sum / WINDOW_SIZE;
    // 用filtered_rssi做后续决策
}

除了滑动平均,我还用过中值滤波。中值滤波的好处是能干掉极端值。比如你采样时突然蹦出一个-120dBm的异常值,平均滤波会被拉低,但中值滤波不受影响。

我的经验:在TWS耳机这种资源受限的平台上,别用太复杂的滤波算法。卡尔曼滤波虽然效果好,但计算量太大,电池扛不住。滑动平均+限幅滤波,够用了。

2.3 自适应跳频算法:从被动到主动

蓝牙经典(BR/EDR)有79个信道,BLE有40个信道。自适应跳频(AFH)就是让耳机和手机协商,把那些被Wi-Fi占用的「坏信道」标记出来,只用好信道通信。

但问题是,传统的AFH是反应式的——发现信道坏了,再把它踢出去。我做的方案是预测式的。根据RSSI和LQI的历史趋势,提前判断哪些信道可能会变差,主动切换。

具体怎么做?我简单说一下思路:

  1. 信道分类:把79个信道分成3类——好、中、差。好信道的LQI > 200,中信道的LQI在150-200之间,差信道的LQI < 150。
  2. 动态权重:每个信道有一个权重值。好信道权重高,差信道权重低。权重会随着时间衰减,如果某个信道一直表现好,权重会缓慢增加。
  3. 跳频决策:每次跳频时,根据权重随机选择下一个信道。权重高的信道被选中的概率大,但权重低的信道也有一定概率被选中——这是为了探测它是否恢复了。

我曾经在一个项目中,把跳频间隔从标准的1.25ms改成了动态可调的。当检测到干扰严重时,缩短跳频间隔;环境安静时,拉长间隔省电。效果还不错,断连率降低了30%。

注意:自适应跳频算法不能太激进。频繁跳频会导致协议栈开销增大,反而影响稳定性。我建议跳频间隔不要小于0.625ms,这是蓝牙规范允许的最小值。

2.4 信道质量评估模型:把感知变成决策

有了RSSI和LQI的滤波值,有了跳频算法,但还缺一个东西——怎么综合判断当前信道到底好不好?

我设计过一个简单的评估模型,用三个维度打分:

维度 指标 权重 说明
信号强度 滤波后RSSI 30% RSSI > -60dBm得满分,< -85dBm得0分
链路质量 滤波后LQI 50% LQI > 200得满分,< 100得0分
稳定性 RSSI方差 20% 方差越小,得分越高

总分 = 信号强度得分 × 0.3 + 链路质量得分 × 0.5 + 稳定性得分 × 0.2

总分低于60分,我就认为当前信道不可用,触发跳频。高于80分,说明信道很好,可以降低采样频率省电。

这个模型的好处是简单、可调。你可以在不同产品上调整权重。比如在游戏耳机上,可以把稳定性权重调高,因为游戏对延迟敏感,信道不能忽好忽坏。

避坑指南:我曾经把LQI的权重设得太高,结果在空旷环境下LQI一直很好,但RSSI其实已经很低了。耳机走远了也不跳频,直到断连。后来我加了一个RSSI的硬阈值——如果RSSI低于-90dBm,不管LQI多高,直接触发跳频。

好了,这一讲的内容就这些。总结一下:RSSI和LQI是基础,滤波是手段,自适应跳频是核心,信道评估模型是决策依据。下一讲我们会聊蓝牙协议栈的优化,到时候你会看到这些感知数据怎么真正用起来。

公众号:蓝海资料掘金营,微信deep3321