Asking the fleet what it is doing…
monad-knowledge Wi-Fi sensing lab · FIIT STU
Instrument · one minute, from the beginning

How a level is made.

Think of a room with a ticking metronome and nine microphones. In an empty room every tick comes back the same; people walking through make the echo flutter. The occupancy app turns that flutter into one number per minute. This page follows one real minute from the flutter of a single frame to the headcount, one declared step at a time: a scalar per frame, a quarter-second window, a minute, a floor, an octave, a bucket, a fleet, a count. Every step is the reduction's own code or the snapshot's own row.

In plain words Think of a room with a ticking metronome and nine microphones. An empty room returns the same tick every time; people walking through make the echo flutter. This page takes one real minute and shows each step from the flutter of one frame to a headcount with an honest interval around it.

Frames and windows: the committed sample envelope-csiq.zst (monad07_exp-chan-36_20260901-010744, 397 frames in 2.10 s), reduced on this request by lake/ingest.py's own functions. Minute onward: the occupancy snapshot (web/occupancy_atlas.py, schema 4), the row the app shows for 2026-09-06 11:20 library time.

Capture for the frame stages: band-2.4__condition-clean__width-HT20 · band-5__condition-clean__width-HT20 · band-5__condition-quarantined__width-HT20 · band-5__condition-clean__width-HT40+ · band-5__condition-clean__width-80MHz · envelope-csiq · envelope-csiq.zst · writer-modern · writer-legacy · band-6 · Minute: open the day in the app

§1

A frame becomes a number

The reduction never keeps a record's table. From each frame it keeps two scalars: the median over tones of the two-chain ratio's size in decibels, and the circular median of its angle. The first is the envelope observable; the second feeds the motion statistic. Both survive the card's per-frame gain, because both chains share it.

ratio_amp_db = median_k 20·log10 |H₀(k)/H₁(k)|     one per frame, stored in packets
Fig. 1 · the per-frame scalar397 frames
The first forty frames' scalars.
t (s)ratio_amp_dbratio phase (rad)
0.0000.212-0.278
0.0080.225-0.2552
0.0090.235-0.3424
0.0190.243-0.2922
0.0200.232-0.2489
0.0240.167-0.3687
0.0240.178-0.3112
0.0250.198-0.3212
0.0250.234-0.3342
0.0260.25-0.2877
0.0260.181-0.3732
0.0270.175-0.326
0.0380.241-0.3562
0.0430.182-0.3205
0.0440.149-0.2598
0.0470.158-0.301
0.0510.227-0.3552
0.0560.197-0.3719
0.0600.229-0.3705
0.0620.207-0.2901
0.072-0.1-0.4656
0.0720.026-0.3482
0.073-0.084-0.493
0.076-0.093-0.4307
0.0770.143-0.3601
0.0770.217-0.3735
0.0830.242-0.2625
0.089-0.054-0.3237
0.0900.114-0.3168
0.0910.022-0.4843
0.0920.022-0.3573
0.092-0.147-0.4564
0.1020.192-0.2844
0.1100.203-0.2901
0.1210.205-0.2924
0.1270.25-0.2772
0.1280.177-0.349
0.1290.169-0.261
0.135-0.099-0.3738
0.1350.035-0.353
One dot per frame at 189 Hz; the vertical grid is the quarter-second windows the next step scores. A committed sample is a few seconds of a capture, so the figure shows 9 windows where a minute holds 240.lake/ingest.py:_ratio and the scalar path of decode_segment.
§2

A quarter of a second becomes two statistics

Frames are grouped into 0.25 s sub-windows from the segment's first frame. A window with fewer than thirty frames is not scored, which is the 120 Hz floor under every statistic on the site. In a scored window, the standard deviation of the frame scalars is the envelope statistic, and the unnormalised Lomb–Scargle power of the unwrapped, detrended ratio phase in the 20 to 60 Hz band, divided by the frame count, is the walker statistic.

envelope = sd(ratio_amp_db) over the window     doppler_20_60 = ∫ P_LS(f) df / n, f ∈ [20, 60] Hz
Fig. 2 · the sub-windows8 of 9 scored
Every sub-window of the sample: frames, the envelope statistic and the two Doppler band powers. A window under thirty frames is not scored.
WindowFramessd (dB)Doppler 20–60Doppler 5–20Scored
0890.1250.0082510.002765yes
1410.10710.0065460.001194yes
2400.07780.0009740.00048yes
3360.07920.0024670.001512yes
4500.080.0027340.000871yes
5370.09630.009910.005086yes
6380.0950.0007770.00014yes
7430.10310.0017890.000317yes
8230.1054no
Bars are the envelope statistic per window, dots the walker band power. The minute's row in the lake is the standard deviation of the frame scalars over the whole minute and the mean of the scored windows' band powers; the per-window values are what the 2-second motion table keeps.lake/ingest.py:_band_power, SUBWINDOW_SECONDS; measurement-lake skill, "Occupancy and motion are two questions".
§3

A minute becomes an octave

Each receiver's minute is the standard deviation of its frame scalars over the injector's frames. It is divided by that receiver's own floor: the median of its certified-empty night minutes when the day has thirty of them (rule A), else the day's own tenth percentile (rule B), and the rule is stored beside the number. The quotient in base-two logarithm is the level in octaves: one octave means the spread doubled against the empty room.

level = log2( value / floor )     buckets at 0.25, 0.75, 1.5 octaves
Fig. 3 · every receiver's octave, 2026-09-06 11:200 receivers
Per receiver: the minute's raw statistic, its floor and rule, the level and the bucket.
Receivervalue (dB)floor (dB)rulefloor minuteslevel (oct)bucketrate (Hz)
The floors differ threefold between receivers and moved within a morning, while people multiplied them by about two everywhere; that is why the level is a ratio in octaves and not a difference in decibels. No labelled window covers this minute.web/occupancy_atlas.py: floors_for, level_of, EDGES; diary 2026-09-02 §4b.