Wi-Fi CSI 选 80MHz 还是 40MHz:分辨率、子载波,以及一个真实的坑

2026-10-11 · 约 2 分钟

搭 Wi-Fi CSI 时最重要的一个决定是信道带宽:它决定每次测量能拿到多少频率信息——而且我们踩到的坑证明,它还可能直接把某个客户端搞成不可用。

1. 带宽到底买到了什么

带宽 子载波数(本硬件实测) 距离分辨单元(c/2B) 说明
20MHz 64(HE20)/ ESP32 上 30–64 ≈7.5 m 粗,但稳
40MHz 约为 80MHz 的一半 ≈3.75 m 折中
80MHz 256(实测) ≈1.875 m 分辨率最好,需要干净的频谱

子载波数随芯片与固件而变:请从自己抓包里统计 data_num,不要照抄别人的数字。

带宽不改变的两件事:

2. 很少有人提的取舍:老客户端

我们的 Mac(2013 年的 Broadcom 网卡)只协商 40MHz。把它放进 80MHz 的 BSS,AP 对该客户端的发送速率会周期性塌到 VHT-MCS0 1SS(物理层 13.5Mbps,实际下行 7–10Mbps),而上行一直正常。

同一客户端、同一房间,只改射频带宽(空闲 60 秒后连续 6 次内网下载)——这是 E 级一手证据,原始抓包与脚本均已公开 [1] [2]:

射频设置 下行结果
HE80(客户端以 40MHz 接入 80MHz BSS) 7.4 / 7.3 / 9.3 / 9.5 / 9.6 / 9.6 Mbps
HE40(客户端原生带宽) 384 / 375 / 328 / 416 / 411 / 419 Mbps

这不是信号问题(RSSI 一直在 −40dBm 左右,客户端在"快状态"下能收 400Mbps),而是"窄带客户端在宽带 BSS 内"的速率控制/空口处理缺陷。

3. 怎么两头都要

目标 做法
追求最高 CSI 分辨率 射频跑 80MHz,把只支持 40MHz 的老客户端赶到别的射频/AP
老客户端必须能用 射频跑 40MHz,接受子载波减半
分时使用 用脚本切换(wifi-htmode HE80 ↔ HE40,约 30 秒,不用重启)
同时满足 两块射频/两台 AP:一块 80MHz 做感知,一块 40MHz(或 2.4G)留给老设备

4. 自己复现验证

# 客户端是否卡住?
iw dev <ap> station dump | grep -E "Station|tx bitrate|rx bitrate"
#   tx bitrate = AP→客户端(会塌陷的方向)
#   rx bitrate = 客户端→AP(通常正常)

# 用内网流量测试,不要用公网下载(公网会引入你无法控制的第二个变量)

请同时记录物理层速率和实际吞吐:塌陷期间 12 秒传输移动了 12.4MB,而 AP 发出 12.87MB——几乎没有重传浪费,只是速率极低、空口大量空闲。

相关:mt76 速率控制深度分析 · OpenWrt 空闲后变慢 · 复现教程

参考与数据来源

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

  1. E 级 · 本项目实测 本项目 10 分钟实测抓包(57,293 条 / 600.0 s,SHA-256 00373f83…95e2)
    Router CSI Lab · 2026
    csi.okwujun.pw/zh/datasets/ · 核实: 分片重组逐字节校验通过(2026-10-11)
  2. E 级 · 本项目实测 Router CSI Toolkit — 采集/分析/守护脚本(MIT)
    Router CSI Lab · 2026
    csi.okwujun.pw/zh/tools/ · 核实: 仓库打包含 SHA-256,脚本在真机运行