CSI dataset: 10-second sample (256 subcarriers) + the full 10-minute capture
2026-10-11 · Wi-Fi CSI, channel state information, Wi-Fi sensing, dataset, MT7986, OpenWrt · 2 min read
Downloadable, verifiable CSI data: the 10-second sample gets your parser working, the full 10-minute capture is for algorithm prototyping. All of it comes from the same reproducible setup (GL-MT6000 / MT7986 + OpenWrt + mt76 CSI) [1], and the capture/analysis scripts are open source [3].
1. Download
| File | Size | Notes |
|---|---|---|
| csi_sample_10s.bin | 322 KB | 10 s raw capture (312 chain records) |
| csi_sample_amplitude.csv | 16 KB | amplitude of the first 200 records (first 8 subcarriers) |
| Full 10-minute dataset | 58 MB | 57,293 records; hosted on object storage / GitHub Release, see the tools page |
2. Capture setup (reproducible)
| Item | Value |
|---|---|
| Router | GL.iNet GL-MT6000 (MT7986A + MT7976) |
| OS / firmware | OpenWrt SNAPSHOT (Linux 6.18) + mt7986_wm.bin 2026-05-15 |
| Band / width / channel | 5 GHz / HE80 / ch44 |
| Subcarriers / chains | 256 / tx 0–1 × rx 0–3 (8 chains) |
| Sample statistics | 312 records / 10.3 s / 256 subcarriers / RSSI ≈ −39 dBm / SNR ≈ 54 dB |
| Full capture | 10 minutes, 57,293 records, mean 95.5 records/s [2] |
3. Format (capture file)
per record: double ts(8) + uint16 len(2) + payload(len)
payload : 24-byte header + interleaved int16 I/Q (little endian)
ts is in microseconds; data_num = 256; chain_info bit15 marks the last chain of a measurement
Parser example (Python, no third-party libraries):
import struct
REC = struct.Struct("<dH")
HDR = struct.Struct("<I6sbBBBBBHHHH")
with open("csi_sample_10s.bin", "rb") as f:
while (head := f.read(REC.size)):
if len(head) < REC.size:
break
_file_ts, length = REC.unpack(head)
payload = f.read(length)
ts, ta, rssi, snr, bw, ch, mode, _pad, n, tx, rx, chain = HDR.unpack_from(payload)
iq = struct.unpack_from(f"<{n*2}h", payload, HDR.size)
# iq[0::2] = I, iq[1::2] = Q
4. Licence and citation
The data is released under CC BY 4.0 (research and commercial use allowed, attribution required):
Source: Router CSI Lab — GL-MT6000 (MT7986) Wi-Fi CSI dataset — https://csi.okwujun.pw/
Disclaimer: the data comes from a single measurement in a real environment and only reflects the channel conditions at that time.
Privacy note: the sample capture served here has its transmitter MAC anonymised (rewritten to
02:00:00:00:00:01). Timestamps, RSSI and I/Q data are unchanged, so it still validates your parser.
The anonymiser is scripts/anonymize_csi_mac.py; run it on any capture before publishing it.
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
Router CSI Lab — GL-MT6000 (MT7986) Wi-Fi CSI dataset, 10 s sample + 10 min capture
Router CSI Lab · 2026
csi.okwujun.pw/zh/datasets/ · verified: CC BY 4.0, SHA-256 published; DOI (Zenodo) pending - 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
csi.okwujun.pw/zh/datasets/ · verified: Reassembled chunks verified byte-identical (2026-10-11) - Grade E · first-party measurement
Router CSI Toolkit — capture/analysis/watchdog scripts (MIT)
Router CSI Lab · 2026
csi.okwujun.pw/zh/tools/ · verified: Repository bundle has a SHA-256; scripts run on real hardware