RuView 物理底线(Physics Floor):用 ToA CRLB 与 Fresnel 前向模型为 WiFi 感知划定物理下界
【免费下载链接】RuViewπ RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.项目地址: https://gitcode.com/GitHub_Trending/wi/RuView
本篇技术文章基于 RuView 仓库examples/research-sota/01-physics-floor/目录下的研究笔记与三个可运行的 NumPy 脚本,完整讲解 WiFi 感知研究回路中最底层的“物理底线”:如何用 Cramér-Rao 下界(CRLB)计算时间到达(ToA)测距精度极限、如何用 Fresnel 区前向模型预测 CSI 灵敏度包络、以及为什么多散射体人体模型会带来约 4.7 dB 的呼吸检测信噪比惩罚。读完后你将掌握这三个原语背后的公式推导、脚本运行方式与全部关键数值结果,并能理解它们如何界定 RuView 后续所有放置优化、结构检测、生命体征与量子融合研究线程的能力边界。
一、什么是“物理底线”:研究回路中的基岩
RuView 的 SOTA 研究回路(examples/research-sota/)按“从最底层的物理事实,到上层应用”的顺序组织。01-physics-floor/是其中最底层的一层——README 将其定义为“Bedrock physics that bounds everything else in the loop”(约束回路中一切的基岩物理)。该目录包含三个原语(primitive),每个原语对应一个纯 NumPy 脚本加一份机器可读的结果 JSON:
| 脚本 | 研究线程 | 核心结论 |
|---|---|---|
| r1_toa_crlb.py | R1 | 20 MHz HT20 @ 20 dB SNR 下 ToA CRLB:单发 41 cm,100× 平均后 4 cm;相位测距在有周跳(cycle-slip)解决的前提下有 238× 优势 |
| r6_fresnel_zone.py | R6 | 5 m 链路、2.4 GHz 下第一 Fresnel 包络:中点处宽约 40 cm 的椭球;对 4 种典型散射体场景给出逐子载波相位预测 |
| r6_1_multiscatterer.py | R6.1 | 6 散射体人体模型;多散射体惩罚:比理想单散射体差+4.7 dB(与 R13 负结果的 5 dB 缺口吻合到 0.3 dB) |
这三个原语为什么能“约束回路其余部分”?README 给出的答案是:
- R1 CRLB为任何定位特征设定时间分辨率底线(floor);
- R6 Fresnel给出 CSI 灵敏度的空间包络(5 m 链路中点处约 40 cm 宽);
- R6.1 多散射体把 R6 从点散射体推广到现实的人体几何,定量刻画理想物理与现实物理的差距。
三者共同界定后续线程:R6.2 家族(天线放置优化)、R12 家族(结构检测)、R14(生命体征)、R20(量子融合)。换句话说,任何上层功能宣称的精度都不应超出这层基岩给出的物理界限——这正是该目录名 “physics-floor” 的语义。
配套的研究全文笔记位于 R1 笔记、R6 笔记 与 R6.1 笔记,本文以 README 骨架为主、结合脚本源码与结果 JSON 展开。
二、R1:ToA CRLB —— 定位精度的时间分辨率下界
2.1 模型与公式
r1_toa_crlb.py 回答的核心问题是:
在 WiFi 级带宽(20 / 40 / 80 / 160 MHz)下,原始 ToA 能达到的最佳单发测距精度是多少?相比基于相位(phase)的测距又是多少?
脚本实现的 ToA CRLB(Kay 1993, Ch 3)为:
sigma_ToA >= 1 / (2 * pi * beta_rms * sqrt(SNR)) [s] sigma_d = c * sigma_ToA [m]其中beta_rms是有效(RMS)带宽。对带宽为 B 的“砖墙”(brick-wall)脉冲,beta_rms = B / sqrt(3)。对应源码在 r1_toa_crlb.py#L40-L46:
def toa_crlb_seconds(bandwidth_hz: float, snr_db: float) -> float: """ToA CRLB in seconds. Bandwidth is the matched-filter / signal bandwidth, NOT the carrier frequency. The factor of sqrt(3) comes from the brick-wall pulse RMS bandwidth: beta_rms = B / sqrt(3).""" snr_lin = 10 ** (snr_db / 10.0) beta_rms = bandwidth_hz / np.sqrt(3.0) return 1.0 / (2 * np.pi * beta_rms * np.sqrt(snr_lin))注意一个容易踩坑的细节:这里的带宽是信号/匹配滤波带宽,不是载波频率——载波 2.4 GHz 本身不提高 ToA 精度,只有占用带宽才行。
相位测距精度公式(r1_toa_crlb.py#L54-L61):
sigma_d_phi = (c / 2*pi*f_c) * sigma_phi = lambda * sigma_phi / 2pi [m]源码实现中sigma_phi以度为单位输入并转为弧度;注释明确指出这是已解决整数模糊度(周跳)之后的无模糊精度,不是绝对距离:
def range_precision_phase_m(carrier_ghz: float, phase_noise_deg: float) -> float: """Assumes the integer-ambiguity (cycle slips) problem is solved by some other method (e.g. multi-subcarrier-frequency unwrap).""" sigma_phi = np.deg2rad(phase_noise_deg) lam = C / (carrier_ghz * 1e9) return lam * sigma_phi / (2 * np.pi)2.2 完整计算网格与实际数值
脚本扫描 5 档带宽 × 5 档 SNR 的 ToA 网格,以及 3 个载波 × 5 档相位噪声的相位网格(见 r1_toa_crlb.py#L74-L103)。完整结果已固化在 r1_toa_crlb_results.json 中。
ToA 单发测距 CRLB(米,1σ),取自结果 JSON 的bandwidth_grid字段:
| 带宽 | SNR 0 dB | 10 dB | 20 dB | 30 dB | 40 dB |
|---|---|---|---|---|---|
| 20 MHz (HT20) | 4.13 | 1.31 | 0.41 | 0.13 | 0.04 |
| 40 MHz (HT40) | 2.07 | 0.65 | 0.21 | 0.07 | 0.02 |
| 80 MHz (VHT80) | 1.03 | 0.33 | 0.10 | 0.03 | 0.01 |
| 160 MHz (VHT160) | 0.52 | 0.16 | 0.05 | 0.02 | 0.01 |
| 320 MHz (EHT320) | 0.26 | 0.08 | 0.03 | 0.01 | 0.003 |
例如 JSON 中 20 MHz @ 20 dB 一格的原始记录为sigma_toa_ns: 1.378、sigma_range_m: 0.4132,即 σ_ToA ≈ 1.38 ns、测距误差 0.41 m。对 ESP32-S3 + 消费级 AP 的现实组合(20 MHz HT20、20 dB SNR),单发 ToA 精度就是 41 cm;100 次独立样本平均(增益 1/√N)可压到4.1 cm。R1 笔记强调:这是 WiFi 带宽下 ToA 的绝对物理极限,“低于这个底线的定位在物理上是被禁止的”。
相位单载波测距精度(毫米,1σ),取自phase_grid字段:
| 载波 | σφ = 0.5° | 1° | 2° | 5° | 10° |
|---|---|---|---|---|---|
| 2.4 GHz | 0.17 | 0.35 | 0.69 | 1.73 | 3.47 |
| 5.0 GHz | 0.08 | 0.17 | 0.33 | 0.83 | 1.67 |
| 6.0 GHz | 0.07 | 0.14 | 0.28 | 0.69 | 1.39 |
参考的 5° 相位噪声是 LO 频偏校正后 ESP32-S3 的典型水平(R1 笔记的说明);未校正时原始相位噪声在 60–180° 量级,此时相位优势从 238× 收缩到约 5×。
2.3 Headline 对比与多站几何
脚本在 r1_toa_crlb.py#L105-L122 固定了一个“实用场景”:20 MHz HT20、20 dB SNR、100 帧平均。结果 JSON 的headline_practical字段给出:
| 指标 | ToA | 相位 | 比值 |
|---|---|---|---|
| 单发 | 0.413 m | 1.73 mm | 238× 相位优势(JSON 记录 238.17) |
| 100× 平均 | 0.041 m | 0.17 mm | 约 240× |
在 WiFi 带宽下,相位测距比 ToA 精确两个数量级。这正是 WiFi 感知领域转向 CSI/相位而非 ToA 的根本原因——与 802.11mc FTM 在标准 WiFi 硬件上做“粗 ToA 定位 + 精相位”的思路一致。
但相位测距有一个不可回避的前提:整数模糊度(cycle-slip)问题。2.4 GHz 波长 12.5 cm,单个子载波上测得 30° 相位可能对应 1.04 cm、13.54 cm、26.04 cm、38.54 cm……R1 笔记给出三种消歧方法:
- 多子载波宽巷(wide-lane)解卷:802.11n/ac 的 52 个已用子载波跨 20 MHz,几何平均给出约 15 m 的有效宽巷波长,可在典型房间内消歧;实现为相位对子载波索引的 1D 线性拟合,斜率即距离信息;
- 粗 ToA 门控:用 41 cm 精度的 ToA 估计(如“目标在 3.2 m ± 0.4 m”)去挑选落进该区间的相位周次;
- 差分/跟踪模式:已知起始位置时,对连续帧间的相位变化积分——失去绝对参考,但逐帧积累毫米级精度。
正确的系统是 ToA(绝对消歧)与相位(精度)的组合。
多站定位的几何精度(GDOP)扩展在 r1_toa_crlb.py#L124-L138 中按sigma_pos = sigma_range * sqrt(GDOP / N_anchors)估计:4 个锚点围成 5×5 m 房间的紧凑凸包,GDOP ≈ 1.5(对比共线布点的约 3)。结果 JSON 的multistatic_4anchor字段:
| 方法 | 位置精度 |
|---|---|
| ToA(4 锚点,GDOP 1.5) | 0.253 m |
| 相位(4 锚点,GDOP 1.5) | 1.06 mm |
2.4 诚实边界
R1 笔记(R1-toa-crlb.md)列出的局限必须一并继承:CRLB 是下界,真实估计器达不到它,高 SNR 下匹配滤波 ToA 估计器通常在 1–2× 范围内;CRLB 假设已知脉冲与单径主导,而真实卧室有 4–6 个主反射体,超分辨方法(MUSIC/ESPRIT)分离后实际退化 2–5×;WiFi 是机会性使用数据流量而非专用测距脉冲,但占用带宽仍是完整信道带宽,故带宽部分成立。
三、R6:Fresnel 区前向模型 —— 让 CSI 灵敏度可预测
3.1 模型:六行公式
r6_fresnel_zone.py 把仓库 DSP 管道隐式假设的前向模型显式化。对长度为 L 的 Tx-Rx 链路,第一 Fresnel 区是射频能量主要传播的长椭球,其在线路分数位置p ∈ [0,1]处的半径为:
r_1(p) = sqrt(λ · L · p · (1 - p)) [m]点散射体偏离视线路径(LOS)垂直距离 x、距 Tx 为 d1(则 d2 = L − d1)时,引入的路径差:
Δℓ(x) = sqrt(d1² + x²) + sqrt(d2² + x²) − (d1 + d2)第 k 个子载波(中心频率 f_k)上的相移:
φ_k = 2π · f_k · Δℓ / c对应源码:fresnel_radius_m#L47-L53、path_delta_m#L56-L60、csi_phase_shift_rad#L63-L65。脚本注释直言这是“the bedrock forward model that the existingwifi-densepose-signalDSP implicitly assumes”。显式化的意义在于三点(见文件头 docstring r6_fresnel_zone.py#L20-L28):R12 的 PABS 修订路径有了可出发的 Fresnel 几何基;R10 的植被距离估计可用 Fresnel 椭球清空度校验;真实散射体的多子载波干涉图案变得可预测。
3.2 第一 Fresnel 半径包络
脚本对 2 / 5 / 10 m 链路、2.4 与 5 GHz 扫p = [0.1, 0.25, 0.5, 0.75, 0.9](r6_fresnel_zone.py#L121-L141)。半径在 p=0.5(中点)取最大值。README 的样例输出展示了 2.4 GHz @ 5 m 一行的形状:
=== R6 first Fresnel radii (m) === freq lambda link p=0.10 p=0.25 p=0.50 p=0.75 p=0.90 2.4 124.9mm 5.0m 0.237 0.342 0.395 0.342 0.237中点半径汇总(R6 笔记):
| 链路长度 | 2.4 GHz @ 中点 | 5 GHz @ 中点 |
|---|---|---|
| 2 m | 25.0 cm | 17.3 cm |
| 5 m | 39.5 cm | 27.4 cm |
| 10 m | 55.9 cm | 38.7 cm |
这些是可测量的物理包络:典型卧室的 5 m WiFi 链路在 LOS 中心有一条约 40 cm 宽的“最大灵敏通道”,向两端天线收窄。人站进椭球内,整个 CSI 向量都会动;站在椭球外,只扰动边缘子载波。
3.3 四种典型场景的逐子载波相位预测
脚本的 subcarrier_phase_sweep#L86-L113 按 802.11n/ac 20 MHz 信道(52 个已用子载波、312.5 kHz 间隔)预测单散射体的逐子载波相位,并输出路径差、相位极值、相位展布(spread)与 2π 缠绕数。fresnel_zone_classification#L68-L83 则判定散射体落在第几 Fresnel 区。
四种典型场景定义在 r6_fresnel_zone.py#L145-L150(2.4 GHz 下的结果):
| 场景 | 垂直偏移 | 线路位置 | Fresnel 区 | 子载波相位展布 |
|---|---|---|---|---|
| 人站在中点 | 10 cm | 2.5 m | zone-1 | 0.077° |
| 人走入 Fresnel 区 | 25 cm | 2.5 m | zone-1 | 0.477° |
| 散射体在 Fresnel 区外 | 1.5 m | 2.5 m | far-field | 15.9° |
| 散射体靠近 Tx | 5 cm | 0.5 m | zone-1 | 0.053° |
关键洞察:相位展布随 Δℓ 单调增长,而 Δℓ 随偏移 x 二次增长。Fresnel 区内的散射体(<0.5° 展布)在 52 个子载波上近乎均匀——这解释了 R5 显著性分析为何测到“整带分布”的 top 子载波而非紧簇:散射体在 zone-1 内时实际激发了整个频带。反之,远场散射体(15.9° 展布)才是多抽头信道估计表现良好的区制。r6_fresnel_results.json 中保存了全部 4 场景 × 2 频点的完整逐子载波相位数组(52 维)。
对仓库现有模块的含义(R6 笔记的对应表):vital_signs的呼吸/心率检测由此获得底噪 SNR 预测;multistatic的注意力权重有了闭式先验;tomography的前向算子 A 从黑盒变为显式(每体素位置 → 每子载波相位贡献),L1-ISTA 逆问题变得良态;pose_tracker的“肢体位置灵敏度”先验可直接由 Fresnel 几何导出——远端肢体(手、脚)在室内链路中常落在第一 Fresnel 区之外,这解释了为何躯干/头部比四肢更易追踪。
3.4 与结构检测(R12)的衔接
R12(eigenshift)曾给出负结果,其修订路径正是把 R6 用作结构检测先验:
y_predicted = Σ_voxels A(voxel) · reflectivity(voxel) residual = y_observed − y_predicted PABS = norm(residual) # 结构检测信号其中A(voxel)就是 R6 的逐子载波相位预测。R6 提供基,R6.1(下一节)提供多散射体的显式 A——两者结合构成 06-structure-detection/ 线程的前向基础。
四、R6.1:多散射体人体模型 —— 4.7 dB 惩罚的物理来源
4.1 模型:6 点散射体的相干叠加
r6_1_multiscatterer.py 把 R6 的单点模型扩展为分布式人体:头、胸、双臂、双腿共 6 个点散射体,每个带位置、反射率(与体表面积成比例)和运动幅度(胸部呼吸,四肢静态)。合并 CSI 是逐子载波的复数相干和:
csi[k] = Σ_b (refl_b / (d_tx,b · d_rx,b)) · exp(2π·j·f_k·Δℓ_b / c)单散射体贡献的实现见 csi_contribution#L42-L52——幅度正比于refl/(d_tx·d_rx)(双程各 1/r² 的简化路径损耗),相位为2π·f·Δℓ/c。默认人体模型定义在 default_human_body#L70-L80(俯视 2D,胸反射率 0.50,其余各 0.10)。
呼吸调制由 breathe#L83-L89 实现:胸部沿垂直方向做 ±8 mm 的正弦位移,频率 0.25 Hz。
脚本设定 5 m 卧室级链路(Tx 在 (0,0),Rx 在 (5,0),2.4 GHz),主体站在线路中点并偏离 LOS 0.25 m(位于 R6 所述 ~40 cm 的第一 Fresnel 包络内)。源码注释特别强调一个部署要点(r6_1_multiscatterer.py#L103-L106):若主体恰在 LOS 上(y=0),呼吸的 y 方向运动对路径长度只产生二阶影响,是退化敏感配置——真实安装必须让主体偏离 LOS 连线才能观察到呼吸幅度的路径变化。
4.2 计算流程
main()依次做四件事(r6_1_multiscatterer.py#L97-L184):
- 单帧多散射体签名:
simulate_human对 6 个部位求和,得到 52 维复数 CSI 基线; - 逐部位贡献分解:把每个部位单独仿真,统计幅度均值、相位展布与占总能量的比例(能量占比 = 单部位平方和 / 全体平方和);
- 30 秒 50 Hz 呼吸时程:每帧调用
breathe(body, ti),对每条子载波幅度序列做 rFFT,按呼吸带(0.15–0.4 Hz)与带外(0.5–3.0 Hz)功率比计算逐子载波呼吸 SNR; - 与 R6 单散射体基线对比:仅保留胸部散射体重跑同一时程,取其最佳子载波 SNR 作为“理想”参照,两者之差即多散射体惩罚。
4.3 核心结果
r6_1_multiscatterer_results.json 的breathing_band_snr字段给出精确数值:
| 配置 | 最佳子载波呼吸 SNR |
|---|---|
| 单散射体理想(仅胸) | +23.7 dB(23.67) |
| 多散射体现实(6 部位) | +19.0 dB(18.97) |
| 静止肢体的相干和混淆惩罚 | +4.7 dB(4.69) |
README 的样例输出正是这一块的浓缩:
=== R6.1 multi-scatterer penalty === Single-scatterer ideal: +23.7 dB Multi-scatterer (6 body parts): +19.0 dB Penalty: +4.7 dB物理解释:四肢不随呼吸运动,但它们相干地贡献于静态 CSI 电平;当胸部运动调制静态信号时,四肢的贡献稀释了相对调制深度。这个 4.7 dB 缺口正是现实部署相对理想单散射体模型的损失。
逐部位能量贡献(JSON 的per_part_contributions字段):
| 部位 | 反射率 | 占总能量 |
|---|---|---|
| 胸 | 0.50 | 27.6% |
| 头 | 0.10 | 1.1% |
| 左臂 / 右臂 | 0.10 / 0.10 | 各 1.1% |
| 左腿 / 右腿 | 0.10 / 0.10 | 各 1.1% |
| 合计(相干和非幂加和,故非 100%) | 1.0 | 33.6% |
胸部以 5× 反射率主导(表面面积比例)。实践结论:胸就是呼吸信号,四肢是混淆源而非信号源。由此导出两条架构决策:Fresnel 包络应对准胸部而非身体中心(R6.2.3 的放置搜索方向);呼吸检测管道应掩蔽四肢(依赖 ADR-079/ADR-101 的位姿提取,vital_signs.rs目前尚未使用)。
4.4 与 R13 负结果的桥接:5 dB 缺口的物理起源
R13(无接触血压)是负结果:脉波恢复需要+25 dBSNR,实际可得+20 dB,缺口 5 dB,当时归因于“受试者微运动污染 HR 频段”。R6.1 给出新的解释:5 dB 缺口同时也是多散射体惩罚——即使没有微运动,静止身体部件本身就比理想单散射体模型贵 4.7 dB。4.7 与 5 吻合到 0.3 dB。
这构成一条自洽的物理叙事链(R6.1 笔记):
- R6(单散射体)给出上界——理想极限下可能达到的呼吸 SNR;
- R6.1(多散射体)给出下界——现实人体几何实际留下的可用量;
- R13 夹在两者之间——因为下界而比上界短 5 dB。
它也解释了“呼吸速率检测可以工作、而波形轮廓恢复(HRV、血压)物理上不可行”:速率信号带锁恢复对 SNR 的容忍度是 +∞(足够平均后任何 SNR 都能恢复),而轮廓恢复需要理想模型的 +25 dB,多散射体现实永远给不出。这与vital_signs.rs现网行为(时域带通 0.1–0.4 Hz 提取速率)一致:带通在 +4.7 dB 惩罚下依然鲁棒;子载波显著性选择(R5)选出的是更可靠而非更高 SNR 的子载波(R6.1 显示 SNR 跨子载波近乎均匀);逐受试者呼吸速率校准则吸收了随体型变化的 4.7 dB 惩罚波动。
五、如何复现:运行方式与输出
三个脚本都是纯 NumPy(numpy),无绘图依赖,运行前提为仓库根目录下已安装 Python 3 与 NumPy(pip install numpy)。以 R1 为例:
# 默认输出写到 examples/research-sota/ 顶层目录 python examples/research-sota/01-physics-floor/r1_toa_crlb.py # 或用 --out 指定输出位置(三个脚本均支持 --out 参数) python examples/research-sota/01-physics-floor/r1_toa_crlb.py --out /tmp/r1.json参数说明:--out在 r1_toa_crlb.py#L70-L72、r6_fresnel_zone.py#L117-L119、r6_1_multiscatterer.py#L92-L94 中定义,默认值分别为examples/research-sota/r1_toa_crlb_results.json、r6_fresnel_results.json、r6_1_multiscatterer_results.json。脚本运行后会:在控制台打印人类可读的汇总表(如 R1 的 ToA 网格、相位网格、Headline、多站四锚点四张表),并把机器可读 JSON 写入--out路径(父目录不存在时自动创建)。
本目录内已随仓库固化的三份结果 JSON 即为上述脚本在 20 MHz/2.4 GHz/5 m 默认场景下的输出快照,可直接作为回归参照。注意:脚本内部硬编码了研究场景常量(带宽列表、SNR 档位、链路长度、人体模型参数),复现数值无需任何额外配置,但也不提供 CLI 参数来改变这些场景——要改场景需要修改源码中的常量。
六、诚实边界(Honest Scope)
README 对该目录整体声明的局限必须原样继承:
- 所有数值都是最佳情形物理;真实 CSI 还有额外的噪声通道(多径、硬件漂移、多用户干扰);
- 人体模型是 6 个点散射体;真实身体是分布连续的 RCS 体,完整前向模型应是对躯干 RCS 的体积积分,点模型是一阶近似;
- 全部为 2D(俯视)近似;3D 扩展位于 02-placement/ 目录(R6.2 家族)。
叠加 R1 笔记的边界:CRLB 假设单径主导与已知脉冲,实际多径下退化 2–5×;5° 相位噪声前提是完成 LO 频偏校正。引用这些数值时应同时说明“最佳情形、2D、单径”三个前提。
七、小结与延伸阅读
01-physics-floor/用三个小脚本(合计不到 600 行 NumPy 代码)为整个研究回路立起三面物理界碑:ToA 测距的时间分辨率下界(41 cm 单发 / 4 cm 平均,相位方案 238× 优势但有周跳前提)、CSI 灵敏度的空间包络(5 m 链路中点 ~40 cm 第一 Fresnel 椭球)、以及理想与现实人体之间的 4.7 dB 呼吸 SNR 惩罚。任何上层功能——天线放置(02-placement/)、空间智能(03-spatial-intelligence/)、结构检测(06-structure-detection/)、负结果记录(07-negative-results/)、量子融合(09-quantum-fusion/)——都在这三面界碑划定的范围内评估其可行性。
继续深入的仓库入口:
- 研究全文笔记:R1 ToA CRLB、R6 Fresnel 前向模型、R6.1 多散射体前向模型、R13 无接触血压负结果
- 结果数据:r1_toa_crlb_results.json、r6_fresnel_results.json、r6_1_multiscatterer_results.json
- 上层依赖目录:02-placement、06-structure-detection、09-quantum-fusion
【免费下载链接】RuViewπ RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.项目地址: https://gitcode.com/GitHub_Trending/wi/RuView
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考