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.

  1. 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
  2. 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)
  3. 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