Skip to content

Case Study Haarlem Loft

Alexander Refsum Jensenius edited this page Jul 18, 2026 · 3 revisions

The field validation behind the v0.3.0 case-study toolbox (states, background.source_fingerprint, schedule.grid_scan, io.export_segment/stereo_preview): an 11.7 h two-session recording of a loft in Haarlem, NL (2026-07-15/16, Zoom H3-VR, AmbiX) — a quiet hi-fi afternoon at a niche position and a full night on the living-room couch under a wall-mounted air-pump drone. The analysis lives as an executable Jupyter report in the Intercontinental database session folder (2026-07-15-Haarlem-loft/analysis/REPORT.ipynb): every number is an ambiscape function call, the interpretation is written around the cells.

What the pipeline found

  • A two-state room (states.state_segments on the 250–1000 Hz machine band): ventilation off = hi-fi afternoon/morning; on = a lo-fi night with band-level SD 0.4 dB over 8.7 h — a machine, not weather. The manual switch-off (button beep at 07:53:54, a 4 kHz band_level spike; collapse one second later) is found by the segmentation to the second.

  • Fridge duty cycle (states.duty_cycle on the 2.4 kHz compressor-whine band): period 24.1 min at ≈ 45 % duty, 7 cycles across the afternoon — the "cyclic-machine detector" the roadmap asked for.

  • Air-pump fingerprint (source_fingerprint, night-on minus morning-off): +14 dB turbulence hump at ~770 Hz carrying tonal lines at 146 / 258 / 650 / 820 Hz that hold 0 cents drift for 7+ hours (tonality.tonal_tracks). A cautionary tale: the original prose report read these as a clean "130 Hz blade comb"; the recomputation supports that only partially. Masking (masking_index): median floor +12.5 dB, 86 % of 250 Hz–8 kHz bands elevated > 6 dB — the "lo-fi" claim as a number.

  • A soundmark's fate (schedule.grid_scan, 900 s grid, bell band 350–800 Hz): the church clock is unambiguous only in the post-switch-off morning (08:00 and 08:15, +26 dB rises), marginal-to-absent through the closed shell in the afternoon, and completely masked all night. The strikes' consistent ~+32 s offset from the nominal quarter measured the recorder-clock drift (→ schedule.clock_offset).

  • Structure-borne night thumps at roughly hourly spacing, sharing the pump-wall bearing (az ≈ +150°, el ≈ +10°), including a −8.6 dBFS double bang at 04:42:51 that was also the night's best reverberation source (ψ = 0.31, the most directional second of the corpus).

  • The European grid, read acoustically (enf.enf_track, v0.4.0): a 50 Hz hum line +17–25 dB above the floor in every minute of 11.7 h, whose frequency (mean 49.996 Hz, SD 21 mHz) hugs the ENTSO-E ±50 mHz band and agrees with the 100 Hz hum to ~1 mHz — a continuous ENF log of the Continental synchronous grid. A second stable line at ~49.8 Hz (SD 356 mHz) is a rotor just under synchronous speed, not the grid — the motivating example for the cross-harmonic authenticity check.

  • Biophony created by a switch-off (biophony, v0.6.0): the bird band (2–11 kHz) is masked all night; within minutes of the 07:53:55 pump-off it lights up with narrowband, bursty (low temporal entropy), elevated, directionally-spread events — the structural signature of a dove chorus, invisible to the whole-session NDSI (negative, dominated by the machine hours). The motivating case for reading biophony as a combination of structural + spatial measures rather than band energy.

Method notes that generalized into the toolbox

  • On/off segmentation needs a bimodal threshold with hysteresis and a minimum duration, and the within-state SD is itself a descriptor (machines are steady; ambience is not).
  • Difference spectra (active minus quiet minutes) are the cheap, robust source fingerprint — computed entirely from the cached per-minute PSDs.
  • Scanning a known civic grid for band energy finds soundmarks the broadband event detector never sees, and doubles as clock calibration.
  • Reports should be executable: converting the prose report to a notebook caught two over-confident readings (the "130 Hz comb", the "~40 s" clock offset) that the original narrative had locked in.

Reproduce

pip install ambiscape          # >= 0.3.0
# open 2026-07-15-Haarlem-loft/analysis/REPORT.ipynb and run all cells

Clone this wiki locally