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 |
因此有三个直接结论:
- “8 链模式”不等于每一帧都有 8 链。 这份抓包里,约 11.8% 的闭合组只有 4 链。
- RSSI/SNR 不能拿来给单条链排序。 在同一测量组内,它们对 8 条链完全相同,描述的是共享接收上下文。
- “幅度低或波动小”不能直接等于“质量好”。 没有空场基线、已知动作和任务 ground truth(真值)时, 低波动可能是稳定,也可能是迟钝或严重衰减。
- 链排序不能跨 session 继承。 第二段 60 秒数据中 347 个组全部是 8 链,但幅度排序与 10 分钟数据呈负相关,最强链和最低变异链都发生了变化。
2. 完整性与时间波动
下图左侧是每条链在 7,609 个闭合组中的出现率;右侧横轴是组均幅度中位数,纵轴是该链组均幅度的 时间变异系数。右侧只是诊断图,不是“最佳链排行榜”。
图 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。可见同一台路由器、同一家庭环境下的两段数据,
已经足以推翻“某条链永远最好”的静态规则。
因此更可靠的流程是:
- 每次部署或每个新 session 做独立的短标定;
- 将链完整性、RSSI/SNR 上下文、幅度分布和时间 CV 保存为 session 元数据;
- 固定链只在标定 session 内生效,并在新 session 重新验证;
- 最终选链以任务指标决定,不以幅度或 CV 单独决定。
4. 复现方法
分析脚本只使用 Python 标准库与 NumPy,不依赖 SciPy 或 Matplotlib。处理步骤如下:
- 按
<float64 ts><uint16 len><payload>遍历外层记录; - 读取 24 字节 CSI 头,保留
tx、rx、rssi、snr、subcarrier_count与chain_info; - 只在
chain_info的 bit 15 置位时闭合一个测量组; - 仅接受 256 个子载波对、I/Q 非全零的记录;
- 对每个子载波计算
sqrt(I² + Q²),再对该记录的 256 个幅度取均值; - 对同一链的组均值计算时间 CV:
标准差 / 均值; - 分别保存每个 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. 不能从这两份数据得出的结论
- 不能证明
tx0/rx1是物理上或任务上最好的链; - 不能把时间 CV 当成噪声底,因为没有空场基线;
- 不能把
tx0/tx1或rx0到rx3直接映射为机身上的物理天线位置; - 不能把这一台设备、一个客户端、两段抓包的排序迁移到其他固件、房间或新 session;
- 不能据此证明呼吸、跌倒、存在或身份识别准确率。
真正有意义的链选择应报告:完整率、缺失模式、标定方法、跨 session 稳定性,以及最终任务指标。 没有这些证据时,最诚实的结论是“链并不等价,需要显式门控”,而不是“某条链最好”。
8. 下一步
下一步应补三类重复实验:空场噪声基线、已知正弦或机械运动控制,以及不同姿态和距离的人员 session。 每次实验都固定信道、带宽、客户端、发包负载和固件版本,并保留每条链的原始标识。只有这样, “选链”才从经验规则变成可验证的实验决策。
参考与数据来源
本文的每条外部结论都标注来源与证据等级(分级标准);标注 E 级的是本项目可复现的实测数据。
- 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,两者不可混用。 - 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 · 公开版含无第三方依赖的抓包质量预检;网页端检查器使用同一容器定义和边界口径。 - 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)。 - 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 采集被广泛复现的起点。 - 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 能力的补丁正是在这一代码库之上编排。