基于 ESP32-C5 的 Wi-Fi CSI 人体感知

Jul 27, 2026 · 4352 字

在 AdventureX 2026 上,我们基于 ESP32-C5 实现了一套自适应桌垫系统,能够通过 Wi-Fi CSI 被动感知桌前是否有人,并实时估计呼吸频率。桌垫内置的 ESP32-C5 模组不依赖额外传感器,仅解析环境中已有的 Wi-Fi 信号即可完成上述感知任务。

Wi-Fi CSI 感知原理

讨论 Wi-Fi 感知之前,有必要区分 RSSI 和 CSI 这两类信号表征。RSSI 仅反映了接收功率的平均水平,多人、家具、墙体对信道的影响被聚合为单一数值,难以支撑精细的环境感知。

要理解 CSI 的构成,需要回顾 OFDM 调制的基础设计。IEEE 802.11n 及后续标准将 20MHz 信道划分为 64 个正交子载波,每个子载波独立承载数据。CSI 描绘了每个子载波各自经历的衰减与相移,形式上是一组复数向量。与 RSSI 相比,CSI 在频域上保留了完整的信道响应信息,能够捕捉不同频率成分在传播环境中的差异化表现。

人体介入 Wi-Fi 信号的传播路径后,身体的反射、遮挡和吸收会改变各子载波的幅度与相位。这些变化的模式与环境状态密切相关:静止状态下,胸腔随呼吸的周期性起伏会在 CSI 幅值上产生微弱振荡;人体移动时,多径反射持续重组,不同子载波的扰动幅度和方向各异,呈现为跨子载波的空间差异性。

过去十余年间,学术界发表了大量基于 CSI 的感知研究,覆盖了手势识别、跌倒检测、穿墙成像等方向。然而早期的实验方案依赖 Intel 5300 网卡刷写定制固件或 USRP 级 SDR 设备,硬件门槛较高,难以在消费场景中落地。

好消息是,从初代 ESP32 芯片开始,乐鑫在 Wi-Fi 驱动层就开放了 CSI 数据导出能力。开发者无需修改硬件或配备外置 SDR,通过官方 ESP-CSI 库即可获取每个接收帧中子载波的 I/Q 复数向量。

从芯片代际来看,ESP32-C5 格外值得关注,它是乐鑫第一款支持 Wi-Fi 6(802.11ax)和 5GHz 频段的芯片,对 CSI 感知有重要意义。2.4GHz 频段共存设备密集,蓝牙、Zigbee 和微波炉等干扰源使得背景噪声水平较高,CSI 中微弱的信号变化易被淹没。5GHz 频段相对洁净,且 802.11ax 引入了 OFDMA 调度和更精确的信道估计机制,CSI 数据的信噪比和一致性较前代产品有显著提升。

目前 ESP-CSI 已进入 ESP-IDF 官方组件库,支持 ESP32-C2/C3/C5/C6 等多个系列,通过统一 API 配置采集参数。在项目中声明 idf_component.yml 依赖并注册 CSI 回调后,每个接收到的 Wi-Fi 帧即携带对应子载波的 I/Q 数据进入处理管线。需要注意的是,ESP-CSI 仅负责数据采集和导出,不内置信号处理或感知算法,实际应用需自行实现。

桌垫的实现

在桌垫的架构中,ESP32-C5 承担感知前端的角色。ESP32-C5 以 Station 模式连接 2.4GHz 路由器,限于 802.11n HT20 协议,并禁用省电模式以确保持续接收帧。

flowchart TB
    subgraph 环境
        AP[2.4GHz 路由器/AP]
    end
    subgraph ESP32-C5
        WiFi[Wi-Fi Station]
        CSI[CSI 回调]
        PROC[信号处理]
        BLE[BLE 广播]
    end
    subgraph 桌垫控制器
        RECV[BLE 接收]
        FUSION[多传感器融合]
        ACT[自适应调节]
    end

    AP -->|ICMP Echo Reply| WiFi
    WiFi -->|CSI 帧| CSI
    CSI -->|I/Q 数据| PROC
    PROC -->|运动状态/呼吸率| BLE
    BLE -->|通知| RECV
    RECV --> FUSION
    FUSION --> ACT

为维持稳定的 CSI 数据流,设备以 100Hz 频率向默认网关发送 ICMP Echo Request。网关每次回复时在 ESP32 端触发 Wi-Fi 帧接收,CSI 回调随之输出数据。这种方案使单个 ESP32 模组即可独立完成完整的数据采集管线,无需额外发包节点或云端转发。

运动检测

flowchart TD
    A[CSI 帧到达] --> B{子载波筛选}
    B -->|guard/pilot/DC| C[排除]
    B -->|数据子载波| D[40 个候选]
    D --> E[4s 校准: 选 12 个最稳定子载波]
    E --> F[6s 运动基线建立]
    F --> G[计算空间湍流 CV]
    G --> H[Hampel 滤波去毛刺]
    H --> I[100 帧滑动窗口方差]
    I --> J{> P95×1.75?}
    J -->|是| K[三击去抖计数]
    J -->|否| L[三击去抖计数]
    K -->|连续 3 次| M[输出: 有人运动]
    L -->|连续 3 次| N[输出: 无人静止]
    M --> O[3s 抑制期]
    O --> N

CSI 数据到达后先进行子载波筛选。64 个子载波中的 guard、pilot 和 DC 子载波不参与后续处理,剩余的约 40 个数据子载波进入校准流程。前 4 秒内,算法计算每个候选子载波的变异系数(标准差/均值),贪心选择 CV 最小的 12 个、且相互间隔至少 2 个索引的子载波,作为稳定性最优的子载波集。

后续 6 秒用于建立运动基线。对已选的 12 个子载波,将当前帧的幅度除以各自基线幅度得到归一化值,计算这 12 个归一化值的空间变异系数,作为空间湍流度量。人体在传播路径中移动时,多径模式的改变导致各子载波衰减出现差异化响应,湍流值显著升高。该序列经 Hampel 离群值滤波器(窗口大小 7,阈值 5-sigma)去毛刺后,取 100 帧滑动窗口方差作为运动分数。校准期间采集的运动分数取第 95 百分位并乘以 1.75,作为后续判决的动态阈值。

为抑制瞬时干扰导致的误判,运动状态机采用连续三击确认机制:连续三次评估周期均超过阈值方才切换至运动状态,连续三次均低于阈值方才切回静止状态。运动结束后设有 3 秒抑制期,避免坐姿调整等微动作造成的频繁状态翻转。

呼吸频率估计

flowchart TD
    A[CSI 帧到达] --> B[40 个数据子载波]
    B --> C[10Hz 重采样]
    C --> D[256 样本滑动窗口]
    D --> E[去均值 + Hamming 窗]
    E --> F[Goertzel DFT 0.08-0.60Hz]
    F --> G[105 个频率 bin 功率谱]
    G --> H[计算频谱突出度]
    H --> I[加权合成 40 子载波]
    I --> J[搜索全局峰值频率]
    J --> K{峰值/带均值 > 6.0?}
    K -->|是| L[输出呼吸率 bpm]
    K -->|否| M[输出: 无效]
    N[运动期间/运动后 3s] -->|抑制| L
    N -->|抑制| M

与运动检测类似,呼吸检测同样以 CSI 数据为输入源,但信号处理路径独立。呼吸检测使用全部 40 个数据子载波,不经子载波选择。先重采样至 10Hz,截取 256 样本(25.6 秒)滑动窗口。

对每个子载波,减去均值后加 Hamming 窗,在 0.08-0.60 Hz 范围内以 0.005 Hz 步进做 Goertzel 式 DFT,共 105 个频率 bin,覆盖 4.8-36 bpm 的正常呼吸频率区间。选择 Goertzel 算法而非 FFT 的原因在于仅需窄带频谱分析,内存开销更低,适合单核 RISC-V 架构的 ESP32-C5。

然而单子载波的功率谱通常噪声较大,峰值位置未必对应呼吸频率。为抑制低信噪比子载波的干扰,对每个子载波计算频谱突出度(峰值功率/平均功率),将其映射为权重,突出度越高权重越大,对 40 个子载波的功率谱做加权合成。在合成谱中搜索全局峰值频率并转换为 bpm,即为呼吸率估计值。

判定条件方面,合成谱的峰值与带均值之比需超过 6.0 才视为有效。运动期间及运动结束后 3 秒内,呼吸检测输出被强制抑制,因为躯干位移时胸腔起伏与呼吸节律的对应关系不再可靠。

外部数据集验证

除本地测试外,两个检测模块均在公开数据集上做了独立的定量评估。

就运动检测而言,采用 ESPectre 的 ESP32-C5 公开数据集,在 4 组配对基线/运动录音上,召回率 100%,基线误报 0%。长时录音中的连续检测表现与 ESPectre 已发布的结果一致。

呼吸检测方面,采用 pulse-wifi-sensing 的公开数据集,以 6 bpm 节律呼吸录音为输入,估计值 6.00 bpm,稳定段有效率 75.5%。空房间对照组误检率为零。

方案约束

目前我们的方案还仅限于单链路单人感知场景,无法实现多人计数、身份识别或人宠区分,运动状态下亦不输出呼吸估计。ESP32-C5 的 Wi-Fi 6 能力目前仅使用 2.4GHz HT20 模式,5GHz 频段感知的适配有待官方驱动支持的进一步成熟。

一旦环境发生变化,如家具重新布局或路由器位置调整,多径环境随之改变,需重新执行校准流程。传感器的部署位置与路由器的相对几何关系决定了 CSI 的空间敏感度分布,存在感知盲区。不过本方案定位于消费级环境感知,也不应视为医疗用途或生命体征报警设备。

粤ICP备2025414119号 粤公网安备44030002006951号

© 2026 Saurlax · Powered by Astro