CH579 RSSI信号检测优化语音设备位置追踪精度
你是否经历过这样的情况:在会议室里,几个人轮流发言,麦克风总是“认错人”?或者在家里,智能音箱明明离你很近,却听不见你的唤醒词?这些问题可能并不是语音算法本身的缺陷,而是因为设备无法准确判断你在哪儿。
对于没有UWB、GPS或专用ToF传感器的低成本设备,如何让语音终端“感知”空间位置呢?答案可能就在蓝牙广播包中的RSSI信号中。
主角介绍:CH579
今天要介绍的是一款国产低功耗蓝牙SoC——CH579。这款由南京沁恒推出的RISC-V芯片集成了BLE 5.1协议栈,广泛应用于无线麦克风、会议终端、TWS耳机等音频产品。除了支持I2S/PCM音频接口,CH579还能以极低功耗持续监听周围的蓝牙广播包,并为每个接收到的数据包提供一个精确到dBm级别的RSSI值。
这意味着,每一台搭载CH579的设备实际上都是一个被动式信号探测器。无需额外硬件或复杂布线,只需一段精巧的滤波代码,就能从噪声中提取出相对距离的趋势。更重要的是,它能够在边缘端完成处理,响应迅速、延迟低,特别适合动态拾音切换等实时任务。
为什么选择CH579进行位置追踪?
选择CH579作为位置追踪方案的原因有三:
- 成本低廉;
- 功能足够强大;
- 内置“雷达”功能。
通过利用其RSSI检测机制,CH579能够成为一种“隐形的空间感知引擎”,为语音设备提供更智能的位置判断能力。
RSSI能否用于定位?
虽然原始RSSI信号的波动很大,就像心电图一样不稳定,但在实际应用中,我们并不追求厘米级的精度,而是实现可靠的相对位置判断。例如,确定谁离主机最近、哪个设备正在靠近、是否有人突然走到话筒前等。这些信息对于声源选择、自动增益控制、波束成形等方面具有重要价值。
-67, -73, -64, -81, -66, -92, -65, -70 (单位:dBm)
如何提高CH579的RSSI可靠性?
第一步:捕获原始信号
CH579的BLE协议栈会在每次接收到广播包时触发回调函数,这里可以提取RSSI值。需要注意的是,避免过多的日志输出,以免影响中断响应速度和采样稳定性。
void GapAdvertisingReportEvent(gapAdvertisingReport_t *pReport)
{
for (uint8_t i = 0; i < pReport->numReports; i++) {
int8_t rssi = pReport->reports[i].rssi;
uint8_t *addr = pReport->reports[i].devAddr;
// 只关注特定设备
if (is_target_device(addr)) {
process_rssi_sample(rssi);
}
}
}
第二步:预处理——剔除“坏数据”
某些RSSI值天生不可信,如未正确解码、近距离强干扰、突然跳变±15dB以上等情况。建议设置有效范围过滤,并记录时间戳以防止因扫描间隔导致的误判。
-127 dBm
-20 dBm
if (raw_rssi < -100 || raw_rssi > -30) return; // 异常值丢弃
第三步:滤波算法选择——平滑≠迟钝
常用的滤波方法包括滑动平均(Moving Average)和指数加权移动平均(EWMA)。滑动平均方法简单直观,但响应较慢;而EWMA则更适合动态场景,赋予新数据更高的权重。
#define WINDOW_SIZE 10
int8_t window[WINDOW_SIZE];
int index = 0;
bool full = false;
void add_rssi(int8_t rssi) {
window[index++] = rssi;
if (index >= WINDOW_SIZE) {
index = 0;
full = true;
}
}
float get_avg() {
int sum = 0, count = full ? WINDOW_SIZE : index;
for (int i = 0; i < count; i++) sum += window[i];
return (float)sum / count;
}
#define ALPHA 0.3f
float smoothed = -80.0f;
void update_ewma(int8_t raw) {
smoothed = ALPHA * raw + (1 - ALPHA) * smoothed;
}
ALPHA=0.2~0.4
实测结果显示,在人员走动测试中,EWMA比普通平均提前1~2秒捕捉到接近趋势。为了兼顾稳定性和灵敏度,推荐使用EWMA结合动态阈值修正的方法。
// 当变化剧烈时,暂时提高ALPHA加快响应
float delta = fabs(raw_rssi - smoothed);
if (delta > 8) {
temp_alpha = 0.6f; // 快速跟进突变
} else {
temp_alpha = 0.3f;
}
smoothed = temp_alpha * raw_rssi + (1 - temp_alpha) * smoothed;
第四步:建模转换——从dBm到“大概多远”
利用平滑后的RSSI值,可以通过对数距离路径损耗模型来估算相对距离:
$$ d = d_0 \times 10^{\frac{A - \overline{RSSI}}{10n}} $$
其中,$ d_0 = 1\,\text{m} $,$ A $为实测1米处的平均RSSI(例如-60dBm),$ n $为环境衰减指数(空旷环境取2.5,复杂办公室可达3.5)。
实践技巧包括:在部署前进行标定,使用查表法替代浮点运算,以及对于仅需“远/中/近”三级判断的应用,设定两个阈值直接分类。
实际应用场景:智能会议系统如何“听声辨位”?
设想这样一个架构:每支无线麦克风定时广播自己的ID和电量,主机上的CH579模块持续扫描并记录各设备的RSSI。通过比较信号强度,系统能够判断当前谁离得最近、谁正在走向讲台、是否有新人加入讨论,从而实现更加智能的会议管理。
[主机]
↗ ↓ ↖
[麦A] [麦B] [麦C]自动聚焦最强语音源
屏蔽背景噪音输入
动态调节各通道增益
视频摄像头联动跟踪发言者
效果对比:
| 场景 | 传统方案 | 加入RSSI位置感知 |
|---|---|---|
| 多人对话 | 频繁误切 | 准确锁定主讲人 |
| 远距离发言 | 声音微弱 | 自动提升增益 |
| 移动走动 | 断续卡顿 | 平滑过渡 |
工程落地注意事项
不要认为编写完滤波器就一切顺利,实际部署中仍有许多需要注意的地方:
-
天线布局至关重要
PCB天线下方禁止铺设地线,确保至少3mm的净空区;
避免电池、屏幕等金属部件紧贴天线;
在多设备部署时,尽量保持天线方向一致。 -
发射功率必须统一
所有麦克风应设置相同的发射功率(例如0dBm);
否则,强信号设备会显得更近。 -
扫描参数调优
// 推荐配置(平衡功耗与响应) Scan Interval = 80ms Scan Window = 60ms Duty Cycle = 75%
在高密度场景下,可将采样率提高至10Hz;待机模式下降至1Hz以节省能源。 -
引入状态机机制
不要一发现RSSI增强就立即切换主麦克风!建议加入防抖动逻辑:
if (new_rssi > current_rssi + 6dB &&持续2秒) → 判定为主讲人切换 -
支持在线学习校准
首次安装时进入“学习模式”,记录不同物理位置的基准RSSI分布,之后根据这些数据动态调整判断阈值。
总结:以最低成本开启空间感知之门
我们无需追求完美的定位精度,就能使设备变得更加智能。
在多数语音交互场景中,真正需要的并不是“你在哪儿”,而是“谁更近”、“谁正在接近”、“是否需要特别关注”。
而CH579提供了一个几乎零成本的解决方案:
利用现有的蓝牙通信链路,挖掘每帧广播包中的空间信息。
通过合理的滤波策略(如指数加权移动平均)、环境建模与状态判断,完全可以实现:
- 多设备间的相对位置排序
- 动态声源优先级管理
- 无缝的智能拾音切换
这不仅仅是技术的应用,更是产品思维的提升——
将通信能力转变为感知能力,让每个设备都能“耳聪目明”。
未来,随着BLE 5.1 AoA/AoD功能的普及,CH579系列有望支持更高精度的方向检测。但即便现在,仅靠RSSI这一“老技术”,结合一些算法智慧,也能使智能语音系统迈出重要的一步。
所以,下次当你设计一款语音产品时,不妨自问一句:
“我的设备能否‘听出’谁是真正的主角?”


雷达卡


京公网安备 11010802022788号







