OFDM 蜂窝网络无设备感知复现日志

复现了 Shi 等人 2022 年发在 JSAC 上的一篇通感一体化论文, 内容是让蜂窝网里的基站不发专门的探测波, 直接用 OFDM 业务信号把周围没带设备的人找出来

论文: Device-Free Sensing in OFDM Cellular Network
作者: Q. Shi, L. Liu, S. Zhang, S. Cui
期刊: IEEE JSAC, vol. 40, no. 6, pp. 1838–1853, Jun. 2022
doi: 10.1109/JSAC.2022.3155543
预印本: arXiv:2108.09177

官方代码在 PolyuWirelessCommunicationLab/Data-Association-in-Network-Device-Free-Sensing 的 Device-free Sensing in OFDM Cellular Network/ 目录里

这个官方代码包只有 6 个 .m 文件, 没有 main.m, 也没有信号级的阶段一. 所以这次的工作一半是复现, 一半是自己补

系统设定

系统里有 $M$ 个基站, $K$ 个目标. 基站发 OFDM 导频, 信号打到人身上反射回来, 基站从回波里量出时延, 时延换算成距离

麻烦的地方在于接收端只能拿到一组距离数值, 不知道哪个距离属于哪个人. 比如 4 个基站, 3 个人, 每个基站交上来 3 个距离, 一共 12 个数字, 但谁跟谁是一伙的完全没有标签

论文把这个拆成两段

阶段 工作 输出
阶段一 测距 每个基站独立处理自己的回波, 找出有几个可分辨的时延 $M$ 个大小为 $K$ 的无标签距离集合
阶段二 定位 用各基站距离集合之间的几何约束把距离配对, 解出坐标 $K$ 个目标的位置

官方代码的缺口

归档下来的 6 个文件是这样

文件 作用
model.m 阶段二的蒙特卡洛主驱动
coorest.m 高斯–牛顿位置精修
initial_est.m 三站线性三边定位初值
diffdist.m 估计与真值的匈牙利配对
distsum.m 目标函数辅助
munkres.m 匈牙利算法, Yi Cao 写的

model.m 里有这么一句

1
dist_m(m,k) = ceil(dist_r(m,k)/delta_d)*delta_d - delta_d/2;

这一步把真实距离量化到距离单元中点, 然后直接当作阶段一的输出喂给阶段二. 也就是说阶段一在官方代码里被整体假设掉了, 论文最核心的 OFDM 信道估计那一层根本没跑

所以这次的活分成性质不同的两块

部分 内容 性质
阶段二 鬼影检测, 数据关联, 位置精修 复现论文算法
阶段一 OFDM 信道估计, 抽头检测, 距离换算 实现论文公式, 官方没给代码

环境

Windows 11 (10.0.26100), Python 3.12.10

1
2
3
4
numpy==2.5.4
scipy==1.18.1
matplotlib==3.11.2
pandas==3.0.6

随机种子固定成 20240929, 各实验的网格点按确定性规则从它派生

实验 种子派生式
E1 误差概率随 $K$ default_rng(seed + k)
E2 误差概率随 $B$ default_rng(seed + int(B/1e6))
E3 鬼影概率 default_rng(seed + 100*M + k)
E4 阶段一精度 default_rng(seed + int(B/1e6) + k)
E5 消融 default_rng(seed + int(cross)*7 + int(ple*3))

results/data/manifest.json 里存着全部种子, 每点样本数, 区域尺寸和各库版本, 逐点结果也在里面, 可以直接当运行凭证

阶段一: 信号级测距

基站收到的信号, 本质上是 $K$ 条反射路径的叠加, 每条路径对应一个抽头. 处理流程是: 构造真实信道 → 合成接收信号 → 叠加噪声 → 估计信道 → 检测抽头 → 换算距离

最小二乘

标准做法要求解

$$\hat{h} = (G^H G)^{-1} G^H (\bar{s}^* \odot \bar{y})$$

其中 $G$ 是傅里叶字典, $G[n,l] = e^{-j2\pi(n-1)(l-1)/N}$, 求逆代价 $O(L^2 N)$

但 $G$ 的列向量两两正交, $G^H G = N \cdot I$, 单位阵的逆就是 $1/N$ 倍单位阵, 整个求逆可以约掉

$$\hat{h} = \frac{1}{N\sqrt{p}} G^H (\bar{s}^* \odot \bar{y})$$

这时候计算量降到 $O(NL)$, 相当于一次逆傅里叶变换

这是精确的, 不是近似. 拿它跟显式伪逆逐元素比, $L$ 取 64 / 227 / 512 三种规模, 最大差值都是 0.000e+00

$L=512$ 时实测快约 500 倍. 顺带一提, 那个等式两边在浮点下完全相等, 没有精度损失

抽头检测和距离换算

对每个抽头算能量 $|\hat{h}_l|^2$, 超过阈值判为非零抽头. 阈值取

$$\gamma = \sigma_h^2 \ln(1/p_{fa}), \qquad \sigma_h^2 = \frac{\sigma^2}{N p}$$

这样纯噪声被误判的概率恰好是 $p_{fa}$, 跟噪声强弱无关

检测完如果抽头数超过 $K$, 保留能量最强的 $K$ 个; 一个都没检出就兜底取最强的 $K$ 个

第 $l$ 个抽头对应的单程距离取单元中点

$$\bar{d} = (l-1)\frac{c_0}{2B} + \frac{c_0}{4B}$$

取中点是因为真实距离在单元内均匀分布, 这样最大误差最小. 误差上界就是论文式(8)

$$|\bar{d} - d| \le \Delta_d = \frac{c_0}{4B}$$

整套系统的精度下限就是这个 $\Delta_d$. 100 MHz 时算出来 0.7495 米, 论文写 0.75, 相差 0.07%, 是论文取整造成的

抽头数按带宽自适应 ★★★★★

抽头序号由往返路径长度 $2d$ 决定, 所以 $L$ 个抽头能表示的最大往返距离是 $L c_0 / B$, 换算成单程是

$$d_{max} = \min(L, Q)\cdot \frac{c_0}{2B}$$

论文给了仿真区域 $R = 240$ 米, 但对角线 $R\sqrt{2} \approx 339.41$ 米才是区域内任意两点的最大距离. 如果 $L$ 取得不够大, 远端目标的回波会绕回格子外面混叠进来

混叠之后有个更阴的地方: 混叠后的距离数值可能反而落回 $d_{max}$ 以内, 光看「距离不超过 $d_{max}$」这个条件根本发现不了. 真正的合法性由「抽头序号小于 $L$」保证

所以 $L$ 按带宽自适应取 $\lceil 2 R\sqrt{2} B/c_0 \rceil + 2$

$B$ (MHz) $\Delta_d$ (m) $L$ $Q$ 单程 $d_{max}$ (m) 实际最大抽头序号 覆盖 339.41 m
10 7.4948 64 2048 959.34 23 是
20 3.7474 64 2048 479.67 46 是
50 1.4990 116 2048 347.76 114 是
100 0.7495 229 2048 343.26 227 是
200 0.3747 455 2048 341.01 453 是
400 0.1874 908 2048 340.26 906 是

末两列是关键: 实际最大抽头序号始终小于 $L$ (227 < 229, 453 < 455, 906 < 908), 六档带宽都没有饱和

50 MHz 那档 $L = 116$ 是被无混叠约束顶上去的, 不是受 64 这个下限钳制. 复跑时某一档出现异常远的定位点, 先查抽头序号离 $L$ 还有多远

另外代码里在抽样阶段就加了拦截, 目标距离超过无模糊上限直接抛异常

1
2
3
4
def validate_unambiguous(self, max_distance_m: float) -> None:
limit = min(self.max_paths, self.cp_len) * C0 / (2.0 * self.bandwidth)
if max_distance_m > limit:
raise ValueError(...)

这种错误事后很难从结果里认出来, 拦在抽样阶段最省事

阶段二: 数据关联与定位

位置精修

对应 coorest.m. 从三站线性三边定位的闭式解出发, 按阻尼牛顿方向迭代

$$\beta \leftarrow \beta - \lambda (J^T J)^{-1} J^T r$$

雅可比 $J$ 只有 $2\times 2$, 正规方程用显式闭式求逆, 几何接近降秩时加对角阻尼. 对 $2\times 2$ 系统这跟伪逆等价, 但快, 因为最大似然算法会把它调几百次. $\lambda = 0.2$, 步长范数小于 0.05 米或满 50 次就停

鬼影检测

一个候选关联是一致的, 当且仅当存在一点 $x$ 使该点到各基站的距离恰好等于给定的 $M$ 个距离值. 如果除了真实关联之外还有别的关联也闭合, 且交点不落在任何真实目标上, 那个点就是鬼影

朴素做法是枚举每个基站上 $K$ 个距离的全部排列, 共 $(K!)^{M-1}$ 种. E3 里 $M$ 最大 6, $K$ 最大 6, 这个数量级跑不动

实际用的剪枝策略: 先枚举前三个基站的候选三元组, 对满足一致性的延拓到剩余基站, 每个基站只在 $O(K)$ 时间里检验候选距离是否落在某条路径上

最大似然关联

三步

  1. 前三个基站距离集合上取笛卡尔积, 共 $K^3$ 个候选, 先过三角不等式, 再用高斯–牛顿解位置, 残差和超预算的剔除
  2. 每个目标槽位选一个三元组, 三个基站上用掉的 $K$ 个距离必须恰好等于各自集合. 实现里按第一站距离值分组, 递归时持续检查已用距离仍是各站集合的子多重集
  3. 第 4 到第 $M$ 个基站, 用「目标当前估计位置到该站的距离」与「该站各候选距离」之差的绝对值做代价矩阵, 匈牙利算法配对, 再精修一次

最后按全部 $M$ 个基站的残差总和排序取最小

残差预算 ★★★★

model.m 把距离换成单元中点, 所以就算关联完全正确, 每个基站仍会留下最多 $\Delta_d$ 的残差, 三站合计最多 $3\Delta_d$

论文给的 feasibility_factor = 1.5, 也就是预算 $1.5 M \sigma_d = 1.5 M \Delta_d/2 = 0.75 M \Delta_d$. 这个数比误差模型本身能达到的水平还紧, 会把几乎所有有效候选都排除掉, 而且带宽越大 ($\Delta_d$ 越小) 越严重

现在的做法是保留参数默认值对应论文, 但 max_error 没显式指定时把实际预算取成 $M \Delta_d$, 即 $M \cdot 2\sigma_d$ 再乘 1.5, 让预算跟误差模型量级对上. 想跑论文原始那套过紧规则, 显式传 feasibility_factor=1.5 就行

实验

E1 误差概率随目标个数的变化 ★★★★

$M = 4$, $B = 100$ MHz, 每个点 300 个几何

$K$ P(>1.5 m) P(>2 m) P(>2.5 m) RMSE (m) RMSE 剔除 (m) 中位误差 (m) 灾难性 不可行
2 0.0350 0.0217 0.0167 27.94 0.714 0.507 6/600 2/300
3 0.0367 0.0222 0.0133 19.73 0.711 0.475 5/900 1/300
4 0.0275 0.0142 0.0092 5.38 0.669 0.473 5/1200 0/300
5 0.0460 0.0313 0.0280 39.23 0.736 0.498 24/1500 4/300
6 0.0467 0.0333 0.0267 40.15 0.795 0.482 30/1800 4/300
7 0.0467 0.0310 0.0252 27.84 0.908 0.484 29/2100 2/300

$K$ 从 2 涨到 7, 关联组合空间大了上万倍, 错误概率只从 3.50% 爬到 4.67%, 全程没超过 5%

剔除后的 RMSE 从 0.714 涨到 0.908, 看着像是恶化了 27.2%. 但中位误差几乎没动(0.473 到 0.507, 极差 7%). 两个数对照一下, 恶化来自尾部变厚, 整体精度没降. $K$ 越大错误关联的候选越多, 少数样本被推到更远的地方去了

灾难性率也没随 $K$ 单调恶化, $K=2$ 时 1.00%, $K=4$ 最低 0.42%, $K=5$ 和 $K=6$ 涨到 1.60% 和 1.67%, $K=7$ 又回落 1.38%. 这个指标反映的是尾部事件的抽样波动, 不是「$K$ 大必然出错」

E2 误差概率随带宽的变化 ★★★★★

$M = 4$, $K = 3$, 每点 300 个几何, 900 个目标样本. 论文的核心结论在这一条上

$B$ (MHz) $\Delta_d$ (m) P(>1.5 m) P(>2 m) P(>2.5 m) RMSE (m) RMSE 剔除 (m) 中位误差 (m) P95 (m) 灾难性
10 7.495 0.9411 0.9022 0.8400 42.79 15.77 5.036 36.50 16/900
20 3.747 0.7489 0.6078 0.4789 40.85 4.53 2.419 9.65 16/900
50 1.499 0.1833 0.1022 0.0711 48.53 1.69 0.947 3.37 24/900
100 0.749 0.0356 0.0244 0.0178 29.32 0.87 0.496 1.23 9/900
200 0.375 0.0100 0.0089 0.0089 19.60 0.44 0.278 0.62 4/900
400 0.187 0.0033 0.0022 0.0022 3.78 0.24 0.174 0.35 1/900

错误概率从 94.11% 降到 0.33%, 跨六档带宽下降 282 倍

剔除后的 RMSE 从 15.77 米降到 0.24 米, 降幅 66 倍, 而且是跟着 $\Delta_d$ 一起走的. 从 20 MHz 往上, 每一档的剔除后 RMSE 都压在 $\Delta_d$ 的 1.1 到 1.3 倍之间

精度天花板由量化下限定死, 算法写得再花也压不到 $\Delta_d$ 以下

单调性用程序验过: 错误概率的逐档差分全为非正, 剔除后 RMSE 的逐档差分全为负

中位误差从 5.036 降到 0.174, 降幅 28.9 倍. 这个倍数比带宽的 40 倍小, 因为 10 MHz 那边误差是量化主导($\Delta_d$ 有 7.5 米), 到了 400 MHz 已经进误关联尾部主导的区间, 均值和中位数的差距反而拉大

灾难性计数 16 → 16 → 24 → 9 → 4 → 1, 带宽一提, $\Delta_d$ 变小, 错误关联产生的残差越来越难跟正确关联竞争

E3 鬼影目标存在概率 ★★★★

完美测距条件, 用真实距离的量化结果, 不加噪声

$K=2$ $K=3$ $K=4$ $K=5$ $K=6$
$M=3$ 0/300 0/300 0/300 0/300 0/300
$M=4$ 0/300 0/300 0/300 0/300 0/300
$M=6$ 0/300 0/300 0/300 0/300 0/300

4500 个几何样本一个鬼影都没有. 按 rule of three, 单组 95% 置信上界是 $3/300 = 0.01$

E4 阶段一信号级恢复精度 ★★★★

带宽 20 到 400 MHz, $K$ 取 2 4 6, 各 100 个几何. 指标是距离单元精确命中率

$B$ (MHz) $K=2$ $K=4$ $K=6$
20 1.000 1.000 0.980
50 1.000 1.000 1.000
100 1.000 1.000 1.000
200 1.000 1.000 1.000
400 1.000 1.000 1.000

15 档平均 99.87% (1498/1500)

唯一的失分在 20 MHz 加 $K=6$ 那格, 100 个几何漏了 2 个. 那档 $\Delta_d = 3.75$ 米, 带宽最窄加上六个目标的距离单元最挤, 恒虚警率检测漏检了, 该点的距离 RMSE 直接到 44.50 米, 漏一个抽头就把距离整个推偏一个单元以上

这里有个容易画错的地方: 距离误差只有两档, 命中是 0, 未命中是几十米, 中间没有平滑过渡. 所以 fig4 的右图画的是各带宽下命中与漏检的几何占比, 不是距离 RMSE 随带宽的连续曲线. 硬画成曲线会让人以为误差在平滑恶化

E5 消融 ★★★★★

$B = 100$ MHz, $K = 4$, 每组 100 个几何. 人为违反正交频假设, 再改路径损耗指数

跨站路径入带 路径损耗指数 精确恢复率
否(论文假设) 1 1.00
否 2 0.76
是 1 0.00
是 2 0.00

跨站反射一进来, 阶段一直接归零. 机理是双站路径的等效距离 $(d_u + d_m)/2$ 落在与自路径不同的距离单元上, 等于凭空多出 $M-1$ 倍的抽头. 「每个基站恰好 $K$ 条路径」这个阶段二赖以成立的结构被破坏

论文关于相邻基站用不同频率的那个假设, 对整套框架是必要条件, 不是可有可无的前提

路径损耗指数那个更有意思. 自由空间的 $\alpha = 2$ 看着更"物理", 但同一个基站里近目标的反射强度会比远目标高约 100 倍, 远目标必然掉到任何合理阈值下面, 这反而违反了论文自己「$K$ 条路径可分辨」的假设

所以默认取 $\alpha = 1$, 单站动态范围约 10 到 20 倍, 精确恢复率 1.00. $\alpha = 2$ 放进消融, 恢复率 0.76

论文没给基站与目标之间的反射系数模型, 只要求「$K$ 条路径可分辨」. 这两个数都不是从论文里抄的, 是按那条可分辨性假设反推的

验证

单元级自检, 算法级交叉验证, 统计级正负控制, 三层各管一段

单元级自检

冒烟测试

编号 检查内容 结果
1 波形参数自洽, 距离刻度与论文值比对 100 MHz 得 0.74948 米, 论文 0.75, 相对误差 0.07%
2 无噪单径下最小二乘是否精确 相对误差 1.069e−15
2b 快速估计与显式伪逆是否一致 三种规模最大差均为 0.000e+00
3 抽头序号与距离的往返换算 四个测试点误差均小于 $\Delta_d$
3b 超出无模糊距离被拒绝 正确抛出异常
4 单基站端到端恢复真实距离 20/20 个有效几何精确恢复
5 线性三边定位还原已知点 真值 [30, 40], 估计 [30, 40], 最大残差 1.421e−14
6 完美测距下最大似然关联 15 个几何中 12 个定位误差小于 1 米
7 一致性检验拒绝扰动几何 原始判为一致, 扰动后判为不一致
8 量化测距下关联的稳健性 25 个几何中 23 个定位误差小于 1.5 米

第 6 项 12/15. 完美测距下鬼影也可能存在, 论文的结论是鬼影罕见而并非不可能, 判据定成不少于 80% 通过

枚举剪枝的验证

快速路径把第一个基站的顺序钉死, 理论候选数应该恰好是暴力的 $1/K!$. 实测

$K$ 暴力候选 快速候选 倍数 目标值差 最大点偏差
3 6 1 6.0 0.00e+00 0.000e+00
4 24 1 24.0 0.00e+00 0.000e+00
5 120 1 120.0 0.00e+00 0.000e+00
5 1200 10 120.0 0.00e+00 0.000e+00

目标值差恒为 0, 最大点偏差恒为 0, 快速路径找到的解跟暴力穷举完全相同

还有一例是两边都判不可行

1
K=5 第2例:两者均不可行(暴力 2.91 秒,快速 0.035 秒)

两边都没解的情况也记一致

鬼影检测的验证与正控制

$M$ 从 3 到 6, $K$ 从 2 到 4 的网格上, 快速检测器跟暴力置换枚举的判定完全一致, 每组 8 个样本

暴力法耗时随规模爆得很快. 最早网格里带过 $M=4$, $K=4$ 那格, 8 个样本跑了 278.6 秒, 平均一个样本 35 秒; 快速法同一批 0.34 秒. 后来把这格从常规网格里拿掉了, 留着只适合单独跑

网格现在是 $(M,K)$ 取 (3,2) (3,3) (3,4) (4,2) (4,3), 多基站和多目标两个维度都覆盖到了, 又不会让一次验证变成半小时

E3 报的是 0/4500, 所以还得证明这个检测器不是死的. 两个正控制, 一个负控制

正控制一, 四基站摆成正方形 (0,0) (200,0) (0,200) (200,200), 两个目标放在 (60,70) 和 (140,130). 两目标关于方形中心镜像对称, 交换关联后同样能交汇在 (70,60), 那个点不是任何真实目标. 暴力和快速都正确报出

正控制二, 三个基站摆在半径 150 米的圆周上, 两个目标关于原点对称放在 (40,25) 和 (−40,−25). 交换后同样闭合, 交点落在真实目标位置上. 两种方法都判定存在鬼影

负控制, 30 个随机非对称几何, 两种方法 30/30 一致, 都没误报

两个正控制都报出鬼影, 负控制 30 个几何没误报过

批量脚本按从快到慢的顺序跑, 四项全过

1
2
3
4
5
6
verify_ghost_positive.py   通过      0      4.3 秒
verify_ghost.py 通过 0 19.8 秒
verify_enum_strict.py 通过 0 12.1 秒
verify_enum.py 通过 0 16.5 秒

4 个全过

耗时每次跑差别不小, verify_ghost.py 有一次跑了 88.9 秒, 是机器负载的关系, 判定结果没变

一键复现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt

# 环境自检, 不产生文件
.\.venv\Scripts\python.exe scripts\smoke_test.py
.\.venv\Scripts\python.exe scripts\smoke_test_phase2.py

# 跑全部实验
.\.venv\Scripts\python.exe scripts\run_experiments.py --exp all --trials 300

# 出图
.\.venv\Scripts\python.exe scripts\make_figures.py

# 四项交叉验证
.\.venv\Scripts\python.exe scripts\run_verify_all.py

跑实验那一档实测 513.8 秒, README 里写的「约 9 至 15 分钟」是留了余量的说法

两次从空的 results/data/ 重跑, 五个 CSV 逐字节一致, 只有 manifest.json 里的耗时字段不同

误差来源

按对最终定位精度的贡献排序

来源 量级 性质 主要证据
量化误差 与 $\Delta_d$ 成正比 不可消除, 只能压缩 图 7, E2
关联错误 1%–3% 的样本, 误差数十米 可部分缓解 E1 E2 灾难性计数
不可行几何 0–2% 的几何 属几何本质 E1 的 infeasible 字段
阶段一漏检 0.13% 需自适应阈值 E4 的 20 MHz 加 $K=6$
假设违反 使全部指标失效 属前提条件 E5

第一种是主项且消不掉. 100 MHz 下 $\Delta_d = 0.7495$ 米, 实测剔除后 RMSE 0.87 米, 中位误差 0.50 米, 量级对得上. 图 7 把 RMSE 画在 $\Delta_d$ 的 1:1 参考线上, 两条线几乎平行

第二种是尾部主项, 少数目标被扔到区域另一端, 误差 20 到 300 米. 成因在算法结构: 最大似然的目标函数是残差之和, 两个不同关联的残差接近时会选错, $\Delta_d$ 大时特别容易. 缓解方向是加跨帧的时间一致性约束, 这属于论文之外的扩展

第三种是算法明确报告「找不到合法解」的几何. E1 和 E2 里各出现 0 到 6 例(每 300 个几何). 脚本把它单独计进 infeasible 字段, 既不混进误差统计也不额外赋值. E1 里 $K=5$ 和 $K=6$ 各 4/300, $K=2$ 有 2/300, $K=4$ 是 0/300, 没随 $K$ 单调恶化, 说明主要是几何布局本身的问题, 不是穷举漏解

与论文结论的对照

论文结论 本复现结果 判定
定位精度随带宽提升 RMSE 剔除 15.77 → 0.24 米, 错误概率 94.11% → 0.33%, 单调 吻合
量化界 $\Delta_d = c_0/(4B)$, 100 MHz 为 0.75 米, 400 MHz 为 0.1875 米 得 0.7495 和 0.1874, 相差 0.07% 吻合
鬼影目标存在概率可忽略 0/4500, 95% 上界 0.01, 有正控制 吻合
数据关联非根本性限制 $K \le 7$ 时错误概率恒低于 5% 吻合

对照止于趋势与量级. 参考的是 arXiv v1, IEEE JSAC 正式刊出的版本可能有数值修订, arXiv 版本身也没给 $M=4$, $K$ 取 2 到 7 的完整错误概率表, 逐格比对做不了

局限

噪声方差固定 1e-18(信号级 1e-14), 对应极高的 SNR, 没做信噪比扫描. 真实系统里低信噪比才是主要矛盾, 这次的结论不能直接外推过去

阶段一没有 A/B 对照. 官方就 6 个 MATLAB 文件, 没有信号级阶段一, 自己写的那部分过了单元测试和交叉验证, 但缺少跟原作者实现的对比

信道模型只有直达反射路径(消融里加了跨站路径), 墙面的多径, 目标之间的遮挡, 目标运动带来的多普勒频移都没碰

结果文件

1
2
3
4
5
6
7
8
9
results/data/e1_error_prob_vs_K.csv        E1 逐点指标, 18 列
results/data/e2_error_prob_vs_B.csv E2 逐点指标, 18 列
results/data/e3_ghost_prob_vs_K.csv E3 各网格点的几何数与鬼影数
results/data/e4_phase1_range_error.csv E4 各带宽与目标数的恢复率, 距离误差
results/data/e5_ablations.csv E5 四组消融配置的恢复率
results/data/manifest.json 种子, 版本, 逐点结果, 总耗时

results/figures/fig1..fig7*.png/.pdf 7 张图, PNG 300 dpi 与 PDF 各一份
logs/verify_all_<时间戳>.log 每项验证的开始结束时间与返回码

manifest.json 里每个网格点都带 delta_d_m 和 catastrophic_gate_m, 报告里引用的数字不用去读图, 全能在 CSV 里查到

引用

Q. Shi, L. Liu, S. Zhang, S. Cui, “Device-Free Sensing in OFDM Cellular Network,” IEEE Journal on Selected Areas in Communications, vol. 40, no. 6, pp. 1838–1853, Jun. 2022, doi: 10.1109/JSAC.2022.3155543

预印本 arXiv:2108.09177

官方代码: PolyuWirelessCommunicationLab/Data-Association-in-Network-Device-Free-Sensing

本复现代码: kanwuqing/isac-dfs-repro