Wi-Fi CSI explained: from channel state information to human sensing
By Wu Jun · Updated 2026-11-02 · 6 min read
Wi-Fi CSI (Channel State Information) is the per-subcarrier, per-antenna complex channel measurement taken by a Wi-Fi receiver. Where RSSI gives you one number (how strong the signal is), CSI gives you amplitude and phase for every subcarrier — which is why it can see motion, not just strength.
Everything on this site comes from a real lab: a GL-MT6000 (MT7986) router, 5 GHz / 80 MHz, 256 subcarriers,
tx 0/1 × rx 0/1/2/3. A 10-minute run captured 57,293 chain records at 95.5 records/s, which collapse to 7,609 grouped measurements, or about 12.68 Hz; the anomaly-filtered analysis uses 12.64 Hz. The daemon used about 5.2 MB resident memory (raw capture published [1]).
A useful mental model
For each measured subcarrier and spatial stream, a simplified receiver model is:
H[k] = Y[k] / X[k]
X[k] is the known training information the receiver can use, Y[k] is what arrived, and H[k] is the estimated
channel response. Its magnitude (|H[k]|) is the CSI amplitude; its angle is the CSI phase. A moving person changes the
paths through which the radio wave travels, so many H[k] values change together over time. That is the measurable
signal behind Wi-Fi sensing [2].
This model also explains the main limitation: CSI is a channel measurement, not a camera frame. It does not contain a room image, a face or a direct body map. Research may estimate coarse activity or pose from a controlled multi-antenna capture, but that is an inference from channel changes, not something visible in a raw CSI record.
Four quantities that are not interchangeable
CSI articles often mix records, values, chains and time samples. Keep these units separate:
| Quantity in this project | What it counts | What it does not mean |
|---|---|---|
| 256 subcarriers | frequency-domain samples within one chain | 256 snapshots over time |
8 chains (2 Tx × 4 Rx) |
spatial measurements associated with one group | 8 independent users or 8 rooms |
| 57,293 chain records | outer records in the 10-minute file | 57,293 independent measurements |
| 7,609 bit-15 groups | measurements after joining chain records | 7,609 fixed 8-chain packets |
| 95.5 chain records/s | payload record throughput | 95.5 independent snapshots/s |
| about 12.68 closed groups/s | independent measurement rate after grouping | the rate of every individual chain value |
| about 12.64 analysis groups/s | rate after the documented anomaly filter (7,583 groups) | a second independent data set |
The 10-minute capture contains both 8-chain and 4-chain groups. Treating all 57,293 records as independent samples, or
blindly dividing them by eight, produces the wrong time axis and can create a spectral peak that is not in the physical
signal. The public parser groups on chain_info bit 15 instead [3].
RSSI vs CSI
| RSSI | CSI | |
|---|---|---|
| Output | one scalar (dBm) | complex I/Q per subcarrier |
| Frequency resolution | none | 256 subcarriers @ 80 MHz |
| Spatial resolution | none | per Tx/Rx chain |
| Typical use | link quality | activity, breathing, gestures, positioning |
What it can and cannot do
Proven directions: presence/occupancy, activity and fall detection, respiration and heart rate (seated, still), gesture recognition, coarse localisation — all surveyed in the field's most-cited review [2].
Where projects fail:
- "Seeing through walls" is over-hyped — you detect channel changes caused by motion, not images.
- Models do not transfer across rooms, furniture or body poses.
- Sampling jitter destroys low-frequency analysis (breathing/heart rate).
- Different chips produce very different CSI — model portability is poor.
Five hardware routes
| Route | Bandwidth / subcarriers | Cost | Coverage |
|---|---|---|---|
| Intel 5300 CSI Tool [4] [5] | 20 MHz / 30 | used NIC | one PC |
| Atheros CSI Tool [6] | 40 MHz / 114 | used NIC | one PC |
| ESP32 (esp-csi / CSI Tool) [7] | 20 MHz / 30–64 | from $3 | single point |
| Nexmon CSI (Pi/phone) [8] | 80 MHz / 256 | from $40 | single point |
| Router (MT7986 + mt76 CSI) | 80 MHz / 256 | one router | whole home |
| Research (PicoScenes / SDR) [9] | any | $1k+ | bench |
For long-running, whole-home sensing the router form factor wins: it is already powered 24/7, sits in the middle of the house and needs no extra hardware.
Pipeline
router (capture) host (analysis)
OpenWrt + mt76 CSI patch --UDP--> parse → buffer → features → detection
mt76-csi-daemon :8888 visualise (heatmap/waterfall/doppler) + storage
Three things are mandatory for CSI to work at all:
- a CSI-capable firmware (MT7986: the 2026-05-15 build),
- the frame-type filter (
frame_type = 0,34) — without it the firmware reports nothing, - the target station's MAC in the MAC filter list.
A 10-minute verification protocol
Before building a classifier, prove that the capture itself is trustworthy:
- Freeze the radio variables. Record router model, driver and Wi-Fi firmware versions, channel, band width, antenna state, country/regulatory setting and the client model.
- Create controllable traffic. Use a LAN host and a repeating transfer or ping workload; do not use an internet speed-test server as the packet clock.
- Capture a known interval. Start with 60 seconds and repeat for 10 minutes. Record the expected start/end time outside the CSI file as well as in it.
- Check record integrity. Parse every outer record, confirm that timestamps are monotonic enough for the format, and look for long gaps, malformed headers and an unread tail.
- Group before resampling. Close a measurement on
chain_infobit 15. Report the counts of 4-chain, 8-chain and incomplete groups separately. - Measure quality, not just volume. Plot group interval, chain completeness, zero-value ratio, RSSI and SNR over time; exclude anomalies only with a documented rule.
- Publish the chain of evidence. Keep the raw capture, parser version, manifest, SHA-256 and negative results. A polished heatmap without those inputs is not independently reproducible [10].
The 10-minute run on this site produced 57,293 outer records, 7,609 complete groups and about 12.68 groups/s. Those three numbers were calculated from the same file but answer different questions; the dataset page exposes the counts and caveats so readers can verify them [3].
How to read a CSI claim
| Claim | First question to ask | Why it matters |
|---|---|---|
| "We captured 256 subcarriers" | per chain, or after undocumented interpolation? | the number of frequency points is not the temporal sample rate |
| "We have 2,048 CSI values" | values, chain records, or independent snapshots? | 256 × 8 describes one grouped measurement, not eight seconds of data |
| "The sample rate is 95 Hz" | record rate or grouped measurement rate? | algorithms use the time axis, not file-row count |
| "Breathing accuracy is 95%" | distance, posture, window length and reference device? | accuracy without a protocol cannot transfer to another room |
| "It works through a wall" | controlled research setup or consumer product? | array geometry, wall material and ground truth dominate the result |
| "The model generalises" | was it tested in a different room, subject and hardware setup? | CSI distributions change with all three |
Failure map
| Symptom | Check first | Do not do this |
|---|---|---|
| CSI enable command succeeds but no records arrive | firmware build, frame-type filter, MAC filter and receive traffic | assume the client is broken |
| Records exist but the group count is wrong | chain_info bit 15 and unread tail bytes |
divide the total record count by eight |
| Groups exist but the time axis has false peaks | packet trigger, power save, group interval and resampling | tune a classifier on the broken axis |
| A detector looks excellent offline | window overlap, subject leakage and same-session train/test split | report the result as real-world accuracy |
| Normal Wi-Fi collapses after CSI is enabled | separate AP interface, rate-control state and client width | keep stacking CSI settings without a rollback |
| The interpretation needs identity or images | the physical quantity actually measured | describe a channel-response experiment as a camera |
Start here
- Get 256-subcarrier CSI from a GL-MT6000 router
- Tools, scripts and the 10-minute raw dataset: tools · dataset
- A measured A/B troubleshooting record: why Wi-Fi can slow down after enabling CSI: troubleshooting
Standards and further reading
- IEEE 802.11bf (WLAN Sensing) is the standardisation effort turning sensing into a first-class WLAN capability [11].
- A university-run hands-on course (Tsinghua WST) is a good structured starting point for the signal-processing side [12].
- Open tools:
esp-csi,CSIKit,csiread,SenseFi,ESPectre; community projects such asRuVieware lead-only (their headline claims are not peer-reviewed) [13].
Please respect local law and ethics: do not use Wi-Fi sensing for non-consensual surveillance. CSI can reveal presence and routines even without images or audio. Obtain consent, minimise retention and publish only anonymised data.
References and data sources
Every external claim carries a source and an evidence grade (grading scheme). Grade E marks first-party, reproducible measurements from this project.
- Grade E · first-party measurement
This project's 10-minute raw capture (57,293 records / 600.0 s, SHA-256 00373f83…95e2)
Router CSI Lab · 2026
okwujun.pw/en/datasets/ · verified: Reassembled chunks verified byte-identical (2026-10-11) · The local raw master has SHA-256 00373f83…95e2; the public de-identified derivative has SHA-256 527466ce…a440. They must not be confused. - Grade A · standard/review
WiFi Sensing with Channel State Information: A Survey
W. Ma, W. Zhou, X. Wang · ACM Computing Surveys · 2019
doi:10.1145/3310194 · citations 857 · verified: CrossRef API, 2026-10-11 · The field's most-cited CSI sensing survey (857 citations, verified via CrossRef). - Grade E · first-party measurement
Router CSI Lab — GL-MT6000 (MT7986) Wi-Fi CSI dataset, 10 s sample + 10 min capture
Router CSI Lab · 2026
doi:10.5281/zenodo.23434789 · verified: CC BY 4.0; SHA-256 published; Zenodo DOI 10.5281/zenodo.23434789 · The dataset has a Zenodo DOI (10.5281/zenodo.23434789) and can be cited directly. - Grade B · peer-reviewed
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 · citations 1713 · verified: CrossRef API, 2026-10-11 · The formal paper for the Intel 5300 CSI Tool (1713 citations) — the widely reproduced starting point for CSI capture. - Grade C · official docs
dhalperi/linux-80211n-csitool-supplementary — Intel 5300 CSI Tool (code)
D. Halperin et al.
github.com/dhalperi/linux-80211n-csitool-supplementary · verified: GitHub API 2026-10-11 (stars 221, last push 2020-05-25) · Code repository for the Intel 5300 tool; its last commit was in 2020, which is the basis for calling it unmaintained. - Grade B · peer-reviewed
Precise Power Delay Profiling with Commodity WiFi (Atheros CSI Tool)
Y. Xie, Z. Li, M. Li · ACM MobiCom 2015 · 2015
doi:10.1145/2789168.2790124 · citations 521 · verified: CrossRef API, 2026-10-11 · The paper behind the Atheros CSI Tool (521 citations); describes CSI / power-delay-profile capture at 40 MHz. - Grade C · official docs
espressif/esp-csi — Applications based on Wi-Fi CSI
Espressif Systems
github.com/espressif/esp-csi · verified: GitHub API 2026-10-29 (stars 1,723; README confirms the complete ESP32 series list and three sender/receiver routes) · The official README states: "All ESP32 series support CSI, including ESP32 / ESP32-S2 / ESP32-C3 / ESP32-S3 / ESP32-C5 / ESP32-C6 / ESP32-C61." - Grade C · official docs
seemoo-lab/nexmon_csi — CSI extraction on various Broadcom Wi-Fi chips
SEEMOO Lab, TU Darmstadt
github.com/seemoo-lab/nexmon_csi · verified: GitHub API 2026-10-29 (stars 479, last push 2026-09-30; README lists bcm43455c0 on Raspberry Pi 3B+/4B/5) - Grade C · official docs
PicoScenes — modern Wi-Fi ISAC research platform
Z. Jiang et al. (PicoScenes project)
ps.zpj.io/ · verified: ps.zpj.io HTTP 200, 2026-10-11 · Official site of a software/hardware platform for Wi-Fi ISAC research (the SDR route). - Grade E · first-party measurement
Router CSI Toolkit — capture/analysis/watchdog scripts (MIT, public repository)
Router CSI Lab · 2026
github.com/jjjwu/router-csi-toolkit · verified: GitHub API verified the public repository, capture-quality preflight, successful CI and the v0.1.3 release on 2026-11-02; the archive SHA-256 is 59f144c0…adea7 · The public repository includes a dependency-free capture preflight; the browser checker uses the same container definition and evidence boundaries. - Grade A · standard/review
IEEE 802.11bf — WLAN Sensing (standard project)
IEEE Standards Association · IEEE 802.11 Working Group · 2020
standards.ieee.org/ieee/802.11bf/10331/ · verified: standards.ieee.org HTTP 200, 2026-10-11 · Official project page for turning sensing into a WLAN standard capability (approved September 2020). - Grade C · official docs
WST — Hands-on Wireless Sensing with Wi-Fi (Tsinghua tutorial)
Tsinghua University TNS group
tns.thss.tsinghua.edu.cn/wst/ · verified: tns.thss.tsinghua.edu.cn HTTP 200, 2026-10-11 · A university-run hands-on Wi-Fi sensing course (slides and datasets); not a peer-reviewed paper. - Grade D · preprint/wiki
ruvnet/RuView — community Wi-Fi spatial-intelligence project
r. u. v. (community maintainer) · 2026
github.com/ruvnet/RuView · verified: GitHub API 2026-10-11 (stars 97,237; created 2025-06-07) · Community project, not peer-reviewed: its marketing claims (real-time “spatial intelligence” / vital signs) have no independent reproduction — treat as a lead, not a conclusion.