Asking the fleet what it is doing…
monad-knowledge Wi-Fi sensing lab · FIIT STU
Toolbox · 10 live instruments · 2 designed

Pages you operate, not pages you read.

Every page here puts one of this project's own data products in front of you with the controls to move through it: a byte of a capture, a minute of a day, a ladder of transmission rates. Nothing here reaches a live store while you look; each tile says what it reads and what to know before trusting a number on it.

If you are new here, the whole lab in four sentences

One small transmitter in a university library sends a short radio frame many times a second, and nine listening radios on the shelves write down how that frame arrived: how loud on each of fifty-two tones, and how late. An empty room returns almost the same answer every time. People walking, sitting and breathing change the echoes, and the change is what the fleet measures. Everything in this Toolbox is a way of looking at those answers, from one raw frame to a headcount with an honest interval.

  1. 1Three bands, one room
  2. 2One record
  3. 3How a level is made
  4. 4A count with a confidence
  5. 5The models, side by side
  6. 6Occupancy
  7. 7Episodes
  8. 8Corpus
1

Start from the beginning

Six essays that take one real capture from a radio wave to a headcount with its confidence, in the order the physics happens. Each has a figure you drag and a table of the same numbers underneath. If you have never met Wi-Fi sensing, read them top to bottom; each one hands you the vocabulary the next one uses.

Live on real data declared physics · real bytes

Three bands, one room

What changes when the same room is listened to on 2.4, 5 and 6 GHz, and what does not?

A Wi-Fi channel is a note the radio sings. The three bands are three octaves: the higher the note, the shorter its wave, and the wavelength is the ruler the room is measured with. A person is a large object at twelve centimetres and a larger one at five. This essay changes only that one quantity and follows what moves with it.

What it shows, what it reads, and the one thing to know first
On the page
Nine figures, one per step: the wavelength each channel gives on a 50 cm ruler, the Doppler shift a walker writes on it, the path loss between a transmitter and a listener, the three channel plans to scale with the fleet's hours on them, the tone grids the records carry, the same room seen through each band on real captures, and what the fleet has actually measured on each.
Where the numbers come from
Declared physics with its source printed beside every constant; the corpus snapshot for the measured census; and one committed capture per band decoded on the request path, the way Format decodes its bytes. No request reaches S3, the lake or the vault.
Read this first
The corpus is silent on 6 GHz sensing and on ranking channels within a band. The fleet's 6 GHz record is one pilot hour, and every cross-band number on the page carries the validity rung it earns.
Open
Live on real data real bytes

One record

What is inside one channel measurement, and what does each number mean?

Every few milliseconds a Wi-Fi card writes down how the room changed a frame on its way in: one number per tone per antenna, like a piano tuner noting how loud and how late each key came back. This page opens one such note from a real capture and lets you turn its numbers back into a picture of the echoes.

What it shows, what it reads, and the one thing to know first
On the page
The table a Wi-Fi card hands you, on a real capture: tones by chains, size and angle, the two-chain ratio in which the radio's own offsets cancel, the delay profile the inverse FFT recovers with the tones you keep, and the four ways the hardware colours the table. Drag the record, keep fewer tones and watch the picture blur.
Where the numbers come from
The committed sample catalogue, decoded on the request path by the same reader the Format tool uses; the delay profile by the project's own CIR routine. No store is consulted.
Read this first
Sizes are on the card's integer grid after its per-frame gain, so the level is not comparable across records; the shape is. The strongest tap sits off zero delay because the card's detection offset moves it.
Open
Live on real data real bytes · lake snapshot

How a level is made

How does one minute of radio measurements become a number of people?

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.

What it shows, what it reads, and the one thing to know first
On the page
One real minute followed from its frames to the headcount: the scalar per frame, the quarter-second windows and their two statistics, the minute, the receiver's floor, the octave, the bucket, the fleet median with its bootstrap, and the count map. Pick another minute and the chain recomputes from the snapshot's own rows.
Where the numbers come from
The frame and window stages run the lake reduction's own functions on a committed sample; the minute, fleet and count stages are the occupancy snapshot's rows for the minute you pick. No request reaches S3 or the lake.
Read this first
A committed sample is a few seconds of a capture, so the window figure shows a handful of the 240 windows a minute holds. Every later stage is the snapshot's own number, recomputed nowhere.
Open
Live on real data lake snapshot · labels

A count with a confidence

How many people can the instrument tell apart, and with what confidence?

A bathroom scale that says 'about 70' is more useful if it can add 'between 68 and 72, nine times in ten'. This page asks that of the headcount: for every number of people the labels can speak for, how likely is it given one minute's reading, and how wide must a bucket be before the instrument can place a minute inside it with a stated confidence.

What it shows, what it reads, and the one thing to know first
On the page
The level law through the labelled anchors, the resolution ladder (the bucket width the instrument needs at each count, from the piecewise slope and from the saturating law once two labels exist), one minute's posterior over the count with its nested sets at 50, 80, 90 and 95 % and two bucket families (fives and doublings), and the check of the sets against the labelled minutes themselves.
Where the numbers come from
The occupancy snapshot's anchors, fleet rows and labelled windows, on the request path. Nothing is rebuilt; no request reaches S3, the lake or the vault.
Read this first
One labelled count above zero today, so the saturating law cannot be fitted, every count above three shares one state, and a bucket of five is one open bucket. The check is in-sample: it can refute a set and cannot confirm one.
Open
Live on real data declared · public corpora · fleet

The models, side by side

Which counting models has this project built, what does each assume, and where does each break?

Ten ways of turning radio wobble into a headcount have been built here, each for one question: a detector for tonight's floor, a law for the shape of the curve, a way to carry a map into a new room, an interval that keeps a promise, a floor no estimator can beat, and a filter that beats the floor by using time. This page puts them in one table and lets you move each one's constants.

What it shows, what it reads, and the one thing to know first
On the page
One comparison table over eleven models on five axes, then one section per model: the question, the idea, the equations, the measured numbers with their sources, the strengths, the weaknesses, and a playground where the model has a closed form to move (the saturating law and its ladder, the posterior, empirical-Bayes shrinkage, conformal coverage under shift, the BBP threshold, the Cramér–Rao floors, the Kalman gain between anchors).
Where the numbers come from
Declared records in web/models.py: every number is copied from a hypothesis note, a results JSON, a paper abstract or the occupancy snapshot, with the source printed beside it. No request reaches a store.
Read this first
The playground curves are the closed forms with constants you move; they are not refits on data. The measured dots and lines are copied from the sources named in each caption.
Open
Live on real data real bytes

The capture format

What do the bytes of a capture file mean, byte by byte?

A capture is a binary file, and a binary file is readable exactly when you can put a finger on a byte and be told what it is. This is that finger: a real file from the archive on the left, its bytes in the middle, and the meaning of what you point at on the right. Point your own reader at the same file and compare.

What it shows, what it reads, and the one thing to know first
On the page
The capture format, decoded in front of you: the structure of one real capture on the left, its bytes in the middle, what the selected bytes mean on the right. Selecting a field lights its bytes; clicking a byte selects the field that owns it. Every sample is downloadable with its expected decode.
Where the numbers come from
Eleven byte-preserving slices of real captures, committed to this repository, decoded on the request path by the same reader the specification documents. No store is consulted.
Read this first
MAC addresses in the samples are relabelled into the RFC 7042 documentation range; everything else is the archive's own bytes.
Open
2

Watch the room

What nine listening radios read on the library floor, minute by minute, for every measured day, and the experiments that push the instrument until it stops working. Every page here reads a snapshot built from the measurement lake overnight; nothing asks the fleet a question while you look.

Live on real data lake snapshot

Occupancy

How many people were on the library floor, minute by minute, on any measured day?

Like a thermostat's chart for a house, but for people: a calendar of the days the fleet listened, a twenty-four-hour curve for the day you pick, and a headcount for each minute with the range the instrument can honestly give. A gap in the curve is a gap; nobody fills it with a zero.

What it shows, what it reads, and the one thing to know first
On the page
A month calendar of measured days, a seven-day strip, a twenty-four-hour chart of the chosen day and a headcount per minute with its interval. Arrow keys move a day. The machinery behind every number is one click away on the instrument view.
Where the numbers come from
A snapshot built offline from the measurement lake's per-minute statistics of the paced capture arm and the labelled windows in the vault, rebuilt after each decode. The site reads a local copy; no request reaches the lake or S3.
Read this first
The count map rests on the labelled minutes printed on the page. Two and three people share one interval today, and above the top labelled count the interval is open. A gap is a gap, never a zero.
Open
Live on real data lake snapshot

Episodes

When was the floor occupied, as visits rather than as minutes?

A visitor does not arrive one minute at a time. This page joins the occupied minutes into events, the way a shop's door counter turns a stream of clicks into 'someone came in at ten past nine and left at half past'. A detection rate is counted over events, and this is the list of them.

What it shows, what it reads, and the one thing to know first
On the page
Every occupied event: when it started and ended, how high it went, how many receivers agreed at the peak, which methods saw it, whether the transmitter's delivered rate collapsed inside it, and which labelled windows it overlaps. Pick one to see the fleet's view of it minute by minute.
Where the numbers come from
The same occupancy snapshot as the app: a run of fleet minutes whose most likely bucket is occupied or above, held open through low, closed by two empty minutes or a gap in scoring. The rule is declared once, offline, and printed on the page.
Read this first
An episode is a detector output, not a visit. A closing rule that is too tight splits one visit into fragments; the falsifier is a day the researcher was there and his own record of it.
Open
Inside the Occupancy instrument lake snapshot · labels

Count against level

Does the instrument's reading keep rising with the number of people, or does it saturate?

Add one candle to a dark room and it gets much brighter; add one to a bright room and you barely notice. The question here is whether people scatter radio the same way. Every labelled window with a known headcount is a point on this curve, and the curve is what the headcount map is built from.

Waiting on: a crowd day with a declared count per step (`crowd-day-48`).

What it shows, what it reads, and the one thing to know first
On the page
The calibration panel of the instrument view: the anchors with their spread, the piecewise map the app reads, and the saturating law fitted to the same anchors as the hypothesis a crowd day will test, never as the estimator. Until a crowd day runs it holds the two labelled counts the fleet has.
Where the numbers come from
The occupancy snapshot's anchors: labelled windows in the vault joined to the fleet minutes inside them.
Read this first
Two labelled counts do not make a curve. The page says so, and shows the two-state calibration alone until a staircase of known counts has been walked in front of the fleet.
Open the panel
Page up, main figure waiting lake snapshot

The rate ladder

How fast can the transmitter tick before the room stops delivering its ticks, and is day worse than night?

Imagine a metronome in a hall and nine people counting its beats. Speed it up and at some point they start to miss beats; fill the hall with other conversations and they miss more. The fleet runs exactly that: the transmitter steps through a ladder of rates while every receiver counts what arrives.

Waiting on: the lake's rebuild pass reducing the ladder segments to minutes (they are decoded to the frame today).

What it shows, what it reads, and the one thing to know first
On the page
Every ladder the fleet has run, per channel: the schedule of commanded rates as a staircase, then delivered hertz against commanded hertz per receiver with night and day ladders on one axis, and what the envelope and the Doppler band do at each step when the rate is the only thing that moved.
Where the numbers come from
A snapshot built offline from the lake: the illuminator's own step sessions for the commanded rates and their windows, and the observers' per-minute injector frame counts from the reduced minutes. The site reads a local copy; no request reaches the lake or S3.
Read this first
Delivered rate is plotted in hertz against hertz, never as a percentage, because a miss and a deferral look the same in a ratio. A ladder's day and night runs are one draw of the channel each.
Open
3

Keep the books

Whether the numbers above can be trusted. What the fleet captured and what the lake actually decoded, who else was talking on the channel, and whether a flagged minute was the room or the clock. Ledgers rather than detectors: a row missing here is a fact, and it is the one nobody reads in a status counter.

Live on real data lake snapshot · vault

Corpus

What did the fleet capture, what did the lake decode, and which experiment owns each session?

A library keeps three lists: what was delivered, what was catalogued, and who checked it out. A measurement corpus needs the same three, and a gap between them is a fact about the pipeline, not about the room. This is the ledger, per day and receiver, with every session as a row you can open.

What it shows, what it reads, and the one thing to know first
On the page
Per day and node: captured, sealed, decoded, projected, claimed and quarantined. Per capture profile: the yield and record-class census with the two-clause rule printed. Every session as a filterable row with its own page.
Where the numbers come from
A snapshot built offline from the lake's session tables and the vault's capture notes and experiment cards, rebuilt nightly. Ownership is declared on a card, never inferred from a profile name. The site reads a local copy; no request reaches the lake, S3 or the vault.
Read this first
Quote useful_yield, not capture_yield: an all-zero record counts as delivered in the second. A low capture_yield on 2.4 GHz is DSSS/CCK traffic, not a quiet channel. Both ratios divide two independent counters and exceed one on some sessions; the counts are exact, the ratios are not.
Open
Designed, not built lake, one scan

Transmitter census

Who else was talking on the channel, hour by hour, and how much of a reading is radios rather than people?

A microphone in a café hears the espresso machine as well as the customers. On a shared Wi-Fi channel the building's own radios are the espresso machine. This census would count them per hour and put that beside the occupancy curve, so the two are never confused again.

Needs first: a frame-table scan per session, one host per call, run beside the decode on the backfill host.

What it shows, what it reads, and the one thing to know first
On the page
Per hour: our transmitter's rate, the ambient rate, the number of distinct sources and the share each class of source holds, overlaid with the fleet level from the explorer.
Where the numbers come from
A per-session scan of the frame table's source field, classified into injector, fill, fleet node, infrastructure and other. The address itself never reaches a response; the snapshot carries a class.
Read this first
The source field goes dark ten minutes into every current capture, so a census can only be trusted on the first ten minutes of a session or on our own transmitter. That is a property of the firmware, and the page would have to say so on every hour.
Designed, not built lake, one reduction

Clock and seam

Was a flagged minute the room, or was it the clock?

If your watch jumps five minutes, every diary entry around the jump looks strange. Each receiver carries two clocks, a wall clock and a radio clock, and a step between them can look exactly like a person walking in. This inspector would mark every seam so a flag on one receiver can be checked against it.

Needs first: a per-segment reduction of the time-transfer table (842 M rows) in the backfill.

What it shows, what it reads, and the one thing to know first
On the page
Per segment: the residual between wall clock and baseband ticks, the steps it takes, and the phase transient over the first twenty minutes after a restart. A minute the explorer flags inside a seam or a transient gets a marker.
Where the numbers come from
A one-pass reduction of the time-transfer table to one row per segment, carried by the backfill.
Read this first
A flagged minute on one receiver at a seam is the clock. The same minute on nine receivers with no seam is the room.

Why every tile states its source. A public page that asked the fleet a question on your behalf would slow a running capture and could leak a number nobody has checked. So every instrument here reads either bytes committed to the repository or a snapshot the pipeline built overnight, and the snapshot's own date is printed on the page. A tile marked designed is a page that does not exist yet; it is listed so the plan is visible, and it names the one thing that has to happen before it can be built.