Live demo: playback of a real 256-subcarrier CSI heatmap
2026-10-11 · 2 min read
This playback uses a real capture (GL-MT6000 / MT7986, 5 GHz HE80, 256 subcarriers, 60 s), downsampled in the browser (348 frames x 64 subcarriers) so it plays smoothly. The raw data and capture method are published [1] [2].
time →vertical axis: subcarriers (low at bottom)
green: per-measurement motion metricblue: playback position
How to read it
Amplitude view (default)
- Time on the horizontal axis, subcarriers on the vertical; brighter means a larger amplitude for that subcarrier;
- a person walking produces vertical bright/dark bands (multipath disturbed); an empty still room flattens out;
- colours are normalised per subcarrier, so absolute values are not comparable across environments.
Doppler / time-frequency view
- the same data run through a short-time Fourier transform: vertical axis is Doppler 0 → Nyquist, brighter means more energy at that frequency;
- the Doppler colours are relative energy: a per-frequency stationary background is removed, then the result is percentile-normalised, so the view highlights energy that changes over time, not absolute power;
- motion energy concentrates at low frequencies (slow body sway, respiration-driven channel fluctuation), and idle stretches go dark overall;
- important limitation: this capture's CSI measurement rate is only about 5.8 measurements/s, so the observable Doppler range is only 0–2.87 Hz (Nyquist = rate / 2). That is enough for respiration and slow motion, but it is not a walking-Doppler spectrum — seeing walking-speed Doppler needs a much higher measurement rate or dedicated radar.
The green curve below is shown in both views: it is the motion metric (mean absolute change between consecutive measurements), a cheap "is anything moving?" signal.
Ad slot (AdSense/Ezoic once live)
Where this data comes from
| Item | Value |
|---|---|
| Capture device | GL.iNet GL-MT6000 (MT7986A + MT7976), OpenWrt + mt76 CSI |
| Band / width | 5 GHz / HE80 / ch44 |
| Subcarriers / chains | 256 / 2 Tx x 4 Rx |
| Measurement rate | ≈5.8 /s (→ Doppler observable up to 0–2.87 Hz) |
| Raw data | 60 s capture (see the dataset page) |
| In the browser | amplitude 348 frames x 64 subcarriers; Doppler 348 frames x 32 frequency bins (same timeline, background-subtracted + percentile-normalised) |
Reproduce it yourself: router CSI guide · Python pipeline
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
csi.okwujun.pw/zh/datasets/ · verified: Reassembled chunks verified byte-identical (2026-10-11) - 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