CSI x BLE fusion — v2, the critic-hardened result
v1 (session 01KW04F1KY) showed the mechanism but the critic flagged three confounds making the "70.7%" uninterpretable. v2 fixes all three and re-runs on the SAME coupled chain:
- Independent BLE. BLE is now modelled as a device-counter —
ble_count(t) = round(p_detect * N_present(t)) + N(0, sigma), the ble-ground-truth-sufficiency premise (count the phones present, geometry-robust). It is NOT regressed on the target's ground truth, so the v1 leakage is gone. - Matched occupancy. All floors run the identical through-traffic scenario (same crowd size), so the source CSI->count map is applied in-range on the targets — the cross-floor error is geometry drift, not out-of-range extrapolation.
- Multi-seed. 3 seeds/floor; every MAE is mean ± sd over seeds.
Result (leakage-free, matched, 3-seed; source resplan-12439 → targets 1374, 16157):
- CSI-only (source map, transferred): 1.39 ± 0.25 persons — drifts across geometry.
- Fused (CSI + periodic BLE recal): 0.82 ± 0.13 — a 41% drift cut, robust across seeds.
- BLE device-counter alone: 0.77 ± 0.11.
So the mechanism holds cleanly: a geometry-robust absolute anchor bounds the CSI map's geometry drift, now without the v1 leakage and with error bars. The honest new finding is that fused ≈ BLE-only — at these crowd sizes (occ ≤ ~6, matched through-traffic) with a dense BLE counter, CSI's high-rate shape adds little over simply trusting the BLE count. The fusion's genuine value is temporal — the high-rate CSI signal filling the gaps when BLE advertising is sparse (between recal ticks) — which a static per-frame MAE comparison underweights. The honest verdict: periodic BLE recalibration is the load-bearing component (it nearly matches CSI+BLE on its own); CSI's marginal contribution needs a sparse-BLE / higher-density regime to show. This is a much more defensible result than v1's 70.7%.
Still in-silico: the BLE device-counter is a modelled sensor (p_detect + Gaussian miss), not
measured advertising; real BLE MAC/advertising behaviour + the channel gap are IP-106 /
synthetic-csi-sim-to-real-transfer. Next: a sparse-BLE-cadence axis (adv_stride) to expose
where CSI-between-ticks earns its keep, and higher crowd sizes.