用 Wi-Fi CSI 测呼吸与心率:原理、可行做法与真实局限

2026-10-11 · 约 2 分钟

呼吸与心率检测的原理很简单:胸腔起伏会周期性改变无线多径,这种变化体现在 CSI 的幅度/相位上(综述见 [1])。 但工程上它比"检测有没有人"难得多,因为你要从噪声里提取 0.1–0.5 Hz(呼吸) 与 0.8–2.0 Hz(心率) 的微弱周期成分。

1. 采样率够不够

本项目实测约 95 条记录/秒(8 条链),远高于心率上限(2 Hz)所需的采样率。 所以瓶颈不是采样率,而是:

  1. 相位噪声(CFO/SFO、硬件漂移);
  2. 人体其他动作(说话、翻身)淹没微动;
  3. 观察窗口太短,频谱分辨率不足。

2. 可运行的估计流程

import numpy as np
from numpy.fft import rfft, rfftfreq

FS = 95.0            # 实测帧率(条/秒);务必用时间戳重采样,不要假设恒定
WINDOW_S = 30        # 呼吸 20–30s;心率建议 15–30s

def bandpass(x, fs, lo, hi):
    n = len(x)
    X = rfft(x - x.mean())
    f = rfftfreq(n, 1 / fs)
    X[(f < lo) | (f > hi)] = 0
    return np.fft.irfft(X, n)

def estimate(signal, fs=FS, band=(0.1, 0.5)):
    n = len(signal)
    x = bandpass(signal, fs, *band)
    spec = np.abs(rfft(x * np.hanning(n)))
    freqs = rfftfreq(n, 1 / fs)
    mask = (freqs >= band[0]) & (freqs <= band[1])
    peak = freqs[mask][np.argmax(spec[mask])]
    return peak * 60.0        # bpm

# signal 建议用「相邻子载波的相位差」或幅度,先做去趋势
# breath_bpm = estimate(phase_diff, band=(0.1, 0.5))
# hr_bpm     = estimate(phase_diff, band=(0.8, 2.0))

关键处理顺序:去卷绕 → 去 CFO/SFO 线性漂移 → 带通 → 窗函数 → 谱峰——用相位差做体征监测的代表性工作是 PhaseBeat [3]。

3. 什么条件下才可能准

条件 说明
受试者静坐/静卧 运动幅度远大于呼吸,必须门控
有人-AP 之间有稳定反射路径 直视或稳定多径;金属遮挡会失效
窗口 ≥ 20 s 30 s 窗口频率分辨率 ≈0.033 Hz(约 2 bpm)
帧率稳定且按时间戳重采样 帧率抖动会污染频谱、产生假峰
单目标 多人时相位叠加,谱峰会混在一起

4. 必须承认的局限

  1. 不是医疗设备:不能用于诊断,也不应给出医疗承诺;
  2. 心率比呼吸难得多(幅度更小、更容易被呼吸谐波干扰);
  3. 换房间/换姿势后参数需要重新标定;
  4. 我们的平台里"呼吸/心率"模块默认是门控状态(未满足静止/信噪比条件时输出 Unavailable),这比强行输出一个数字更诚实。

已发表工作同样报告了距离与环境依赖:FarSense 用两天线的 CSI ratio 把呼吸检测距离上限进一步推远 [2], 说明"能测到"与"在任何房间都能测到"是两回事。

5. 参考实现与数据

参考与数据来源

本文的每条外部结论都标注来源与证据等级(分级标准);标注 E 级的是本项目可复现的实测数据。

  1. A 级 · 标准/综述 WiFi Sensing with Channel State Information: A Survey
    W. Ma, W. Zhou, X. Wang · ACM Computing Surveys · 2019
    doi:10.1145/3310194 · 被引 857 · 核实: CrossRef API, 2026-10-11 · 领域内最常被引用的 CSI 感知综述(被引 857 次,核实于 CrossRef)。
  2. B 级 · 同行评审 FarSense: Pushing the Range Limit of WiFi-based Respiration Sensing with CSI Ratio of Two Antennas
    Y. Zeng, D. Wu, J. Xiong, et al. · Proceedings of the ACM on Interactive, Mobile, Wearable and Ubiquitous Technologies (IMWUT) · 2019
    doi:10.1145/3351279 · 被引 461 · 核实: CrossRef API, 2026-10-11 · 呼吸感知的距离上限与 CSI ratio 方法(被引 461 次)。
  3. B 级 · 同行评审 PhaseBeat: Exploiting CSI Phase Data for Vital Sign Monitoring with Commodity WiFi Devices
    X. Wang, C. Yang, S. Mao · IEEE ICDCS 2017 · 2017
    doi:10.1109/icdcs.2017.206 · 被引 325 · 核实: CrossRef API, 2026-10-11 · 用 CSI 相位做呼吸/心率监测的代表性工作(被引 325 次)。