☰
RuView 物理底线(Physics Floor):用 ToA CRLB 与 Fresnel 前向模型为 WiFi 感知划定物理下界
2026/10/5 16:25:40 网站建设 项目流程

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.pyR120 MHz HT20 @ 20 dB SNR 下 ToA CRLB:单发 41 cm,100× 平均后 4 cm;相位测距在有周跳(cycle-slip)解决的前提下有 238× 优势
r6_fresnel_zone.pyR65 m 链路、2.4 GHz 下第一 Fresnel 包络:中点处宽约 40 cm 的椭球;对 4 种典型散射体场景给出逐子载波相位预测
r6_1_multiscatterer.pyR6.16 散射体人体模型;多散射体惩罚:比理想单散射体差+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 dB10 dB20 dB30 dB40 dB
20 MHz (HT20)4.131.310.410.130.04
40 MHz (HT40)2.070.650.210.070.02
80 MHz (VHT80)1.030.330.100.030.01
160 MHz (VHT160)0.520.160.050.020.01
320 MHz (EHT320)0.260.080.030.010.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 GHz0.170.350.691.733.47
5.0 GHz0.080.170.330.831.67
6.0 GHz0.070.140.280.691.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 m1.73 mm238× 相位优势(JSON 记录 238.17)
100× 平均0.041 m0.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 笔记给出三种消歧方法:

  1. 多子载波宽巷(wide-lane)解卷:802.11n/ac 的 52 个已用子载波跨 20 MHz,几何平均给出约 15 m 的有效宽巷波长,可在典型房间内消歧;实现为相位对子载波索引的 1D 线性拟合,斜率即距离信息;
  2. 粗 ToA 门控:用 41 cm 精度的 ToA 估计(如“目标在 3.2 m ± 0.4 m”)去挑选落进该区间的相位周次;
  3. 差分/跟踪模式:已知起始位置时,对连续帧间的相位变化积分——失去绝对参考,但逐帧积累毫米级精度。

正确的系统是 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 m25.0 cm17.3 cm
5 m39.5 cm27.4 cm
10 m55.9 cm38.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 cm2.5 mzone-10.077°
人走入 Fresnel 区25 cm2.5 mzone-10.477°
散射体在 Fresnel 区外1.5 m2.5 mfar-field15.9°
散射体靠近 Tx5 cm0.5 mzone-10.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):

  1. 单帧多散射体签名:simulate_human对 6 个部位求和,得到 52 维复数 CSI 基线;
  2. 逐部位贡献分解:把每个部位单独仿真,统计幅度均值、相位展布与占总能量的比例(能量占比 = 单部位平方和 / 全体平方和);
  3. 30 秒 50 Hz 呼吸时程:每帧调用breathe(body, ti),对每条子载波幅度序列做 rFFT,按呼吸带(0.15–0.4 Hz)与带外(0.5–3.0 Hz)功率比计算逐子载波呼吸 SNR;
  4. 与 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.5027.6%
头0.101.1%
左臂 / 右臂0.10 / 0.10各 1.1%
左腿 / 右腿0.10 / 0.10各 1.1%
合计(相干和非幂加和,故非 100%)1.033.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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询