CSI 链路选择与 8 链健康审计:10 分钟与 60 秒双抓包

作者 Wu Jun · 更新于 2026-11-02 · Wi-Fi CSI, 链选择, GL-MT6000, MT7986, 数据质量 · 约 6 分钟

“2 Tx × 4 Rx,共 8 条链”很容易被理解成一台 8 路、彼此等价的传感器。真实抓包没有这么整齐: 链路是否出现、采集组是否完整、幅度尺度和时间波动都可能不同。若解析器默认“一定有 8 条”, 后续算法就会把缺链、重复链或错误回退混入训练数据。

本文用本项目两段公开 GL-MT6000 抓包做一次窄范围审计:10 分钟主数据和 60 秒对照数据。 问题是:8 条链是否同样完整,RSSI/SNR 能否用于选链,以及能否仅凭幅度或波动率宣布某条链最好。 数据、脚本、CSV、SVG 图和校验值均可复现 [1] [2]。

1. 结论先说

检查项 实测
闭合测量组 7,609
含 8 条 tx/rx 记录的组 6,714,占 88.238%
仅含 tx0 四条链的组 895,占 11.762%
完整 256 子载波、非零 I/Q 的组 7,608
组内 RSSI 对全部链相同 7,609 / 7,609
组内 SNR 对全部链相同 7,609 / 7,609
各链时间变异系数范围 0.104 至 0.623

因此有三个直接结论:

  1. “8 链模式”不等于每一帧都有 8 链。 这份抓包里,约 11.8% 的闭合组只有 4 链。
  2. RSSI/SNR 不能拿来给单条链排序。 在同一测量组内,它们对 8 条链完全相同,描述的是共享接收上下文。
  3. “幅度低或波动小”不能直接等于“质量好”。 没有空场基线、已知动作和任务 ground truth(真值)时, 低波动可能是稳定,也可能是迟钝或严重衰减。
  4. 链排序不能跨 session 继承。 第二段 60 秒数据中 347 个组全部是 8 链,但幅度排序与 10 分钟数据呈负相关,最强链和最低变异链都发生了变化。

2. 完整性与时间波动

下图左侧是每条链在 7,609 个闭合组中的出现率;右侧横轴是组均幅度中位数,纵轴是该链组均幅度的 时间变异系数。右侧只是诊断图,不是“最佳链排行榜”。

GL-MT6000 八条 CSI 链的组出现率和组均幅度对时间变异系数散点图;tx0 四链出现在全部 7609 组,tx1 四链只出现在 6714 组。

图 1:链出现率与组均幅度时间变异。颜色区分全部出现和间歇出现的链;图不声称低变异链是物理最佳链。

链 组出现数 组均幅度中位数 时间 CV
tx0/rx0 7,609 945.632 0.149077
tx0/rx1 7,609 1,346.556 0.104246
tx0/rx2 7,609 1,000.199 0.191578
tx0/rx3 7,609 716.449 0.273735
tx1/rx0 6,714 313.300 0.622773
tx1/rx1 6,714 502.511 0.396518
tx1/rx2 6,714 1,147.028 0.172088
tx1/rx3 6,714 1,099.939 0.143339

tx0/rx1 的时间 CV 最低,tx1/rx0 最高;两者相差约 6 倍。但这不是“前者质量高 6 倍”的证据。 如果抓包期间存在运动,CV 高可能意味着该链对变化更敏感;如果某些子载波接近零陷,CV 也可能被 小分母放大。幅度本身还受自动增益控制、射频前端和 CSI 提取路径影响。

3. 第二段会话推翻了“固定最佳链”

项目还公开一段 60 秒脱敏演示数据,SHA-256 为 41c35d9d23e5c03ddd34ae97617e772fecdb55e8545156181828b060605a87a6。用完全相同的脚本分析后:

指标 10 分钟数据 60 秒数据
闭合组 7,609 347
8 链组 6,714 347
4 链组 895 0
组均幅度最高的链 tx0/rx1 tx1/rx1
时间 CV 最低的链 tx0/rx1 tx0/rx0
两段逐链幅度相关 -0.415472
两段逐链时间 CV 相关 -0.225449

这不是小的排名漂移:tx1/rx0 在 10 分钟数据里幅度排第 8,在 60 秒数据里排第 2。 RSSI 中位数也从 -31 dBm 变为 -39 dBm。可见同一台路由器、同一家庭环境下的两段数据, 已经足以推翻“某条链永远最好”的静态规则。

因此更可靠的流程是:

  1. 每次部署或每个新 session 做独立的短标定;
  2. 将链完整性、RSSI/SNR 上下文、幅度分布和时间 CV 保存为 session 元数据;
  3. 固定链只在标定 session 内生效,并在新 session 重新验证;
  4. 最终选链以任务指标决定,不以幅度或 CV 单独决定。

4. 复现方法

分析脚本只使用 Python 标准库与 NumPy,不依赖 SciPy 或 Matplotlib。处理步骤如下:

  1. 按 <float64 ts><uint16 len><payload> 遍历外层记录;
  2. 读取 24 字节 CSI 头,保留 tx、rx、rssi、snr、subcarrier_count 与 chain_info;
  3. 只在 chain_info 的 bit 15 置位时闭合一个测量组;
  4. 仅接受 256 个子载波对、I/Q 非全零的记录;
  5. 对每个子载波计算 sqrt(I² + Q²),再对该记录的 256 个幅度取均值;
  6. 对同一链的组均值计算时间 CV:标准差 / 均值;
  7. 分别保存每个 tx/rx 链的完整性、幅度分布和时间波动。

运行:

python3 analyze_csi_chain_health.py csi-10m.anon.bin \
  --summary summary.json \
  --csv chain_metrics.csv \
  --img csi-chain-health.svg

下载:

源文件 SHA-256 为 527466ceb8b5f835e55ff348f02808736b947db39e7baac1f34e375de146a440。

5. 一个不会偷偷改变链身份的选链流程

更适合实际系统的做法不是一个固定的“链 0”,而是显式门控:

for each closed group:
    verify expected chain records are unique
    reject incomplete 256-subcarrier records
    preserve raw chain IDs
    compute per-chain health metrics on a calibration window
    if task requires a fixed chain:
        select it from calibration, not from the test window
    else:
        expose chain-specific features and missingness
    if no chain passes the gate:
        return unavailable

关键点是标定窗口和测试窗口分开。如果先用整段测试数据挑选“看起来最稳”的链,再用同一段数据 报告准确率,就会产生数据泄漏。正确做法是使用空场、静止人或已知动作的独立 session 做标定, 再在未见 session 上评估。

对于这份抓包,如果只保留 8 链完整的组,会损失 895 个闭合组。不能默默用 tx0/rx0 填补缺失的 tx1 链,否则不同时间点的特征含义会变化。系统应明确记录“八链组”和“四链组”,或者在下游模型中 把链缺失作为可见状态。

6. RSSI/SNR 为什么没有帮助我们选链

本抓包的 RSSI/SNR 在每个闭合组内对全部链相同。它们可以描述该次接收的整体信号环境,却不能回答 “八条链里哪一条更干净”。这并不意味着所有厂商的 CSI 元数据都如此,但复现者必须先验证字段语义, 不能看到每行都有 rssi 就假定它是按链独立测量。

这也解释了为何仅凭某个 CSV 列的相似性做链筛选不可靠。先验证字段是否随链变化,再讨论统计选链。

7. 不能从这两份数据得出的结论

真正有意义的链选择应报告:完整率、缺失模式、标定方法、跨 session 稳定性,以及最终任务指标。 没有这些证据时,最诚实的结论是“链并不等价,需要显式门控”,而不是“某条链最好”。

8. 下一步

下一步应补三类重复实验:空场噪声基线、已知正弦或机械运动控制,以及不同姿态和距离的人员 session。 每次实验都固定信道、带宽、客户端、发包负载和固件版本,并保留每条链的原始标识。只有这样, “选链”才从经验规则变成可验证的实验决策。

参考与数据来源

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

  1. E 级 · 本项目实测 本项目 10 分钟实测抓包(57,293 条 / 600.0 s,SHA-256 00373f83…95e2)
    Router CSI Lab · 2026
    okwujun.pw/zh/datasets/ · 核实: 分片重组逐字节校验通过(2026-10-11) · 本地原始母片 SHA-256 为 00373f83…95e2;公开下载的是去标识派生文件,SHA-256 为 527466ce…a440,两者不可混用。
  2. E 级 · 本项目实测 Router CSI Toolkit — 采集/分析/守护脚本(MIT,公开仓库)
    Router CSI Lab · 2026
    github.com/jjjwu/router-csi-toolkit · 核实: GitHub API 于 2026-11-02 核实公开仓库、抓包质量预检、成功 CI 与 v0.1.3 Release;归档 SHA-256 为 59f144c0…adea7 · 公开版含无第三方依赖的抓包质量预检;网页端检查器使用同一容器定义和边界口径。
  3. 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)。
  4. B 级 · 同行评审 Tool release: gathering 802.11n traces with channel state information
    D. Halperin, W. Hu, A. Sheth, D. Wetherall · ACM SIGCOMM Computer Communication Review · 2011
    doi:10.1145/1925861.1925870 · 被引 1713 · 核实: CrossRef API, 2026-10-11 · Intel 5300 CSI Tool 的正式论文(被引 1713 次),是 CSI 采集被广泛复现的起点。
  5. C 级 · 官方资料 openwrt/mt76 — mac80211 driver for MediaTek Wi-Fi chipsets
    OpenWrt project / MediaTek
    github.com/openwrt/mt76 · 核实: GitHub API 2026-10-11 (stars 890, last push 2026-10-08) · 本项目使用的开源 mt76 驱动上游;CSI 能力的补丁正是在这一代码库之上编排。