Your recorded signal
Synchronized signals
Breathing, snoring, oxygen, heart rate and movement
Scroll over the waveform to move · Pinch to zoom at the pointer · ← / → move 10% of the window · Shift + arrow moves 1% · Time axis: h:mm:ss
Apnea · Hypopnea · EMAY-recorded events, approximate placement
Time is inferred from your sample-rate assumption. Chunks are concatenated for navigation; dashed lines mark boundaries, not verified continuity. No wall-clock sample timestamps are invented.
Recorded respiratory events
Types inferred from matching EMAY summary counts and durations (code 2: hypopnea; code 3: apnea). Placement uses stored event times and proportional position within minute chunks; exact sample alignment is unverified. These are saved device flags, not newly detected events.
| Event | Recorded time | Elapsed h:mm:ss | Duration | Alignment |
|---|
Position records
Preserved from SDK bodyposition; matching app body_position values are checked.
| Minute label as stored | SDK code | App code | Label | Agreement |
|---|
Signal assumptions
UNCONFIRMEDFull chunks contain 602–605 samples per labeled minute, suggesting roughly 10 Hz. This is not a measured clock.
Analysis uses (sample − baseline) × multiplier × direction. This does not calibrate the signal. The waveform above stays unchanged.
Linear interpolation to 25 Hz adapts input timing only; it cannot restore missing detail or validate EMAY against ResMed.
Glasgow research panel
Candidate shapes under the assumptions at left.
*The original code’s overall calculation omits “top heavy.” We preserve that calculation and separately show all nine. Neither is a validated EMAY Glasgow Index or a diagnostic result.
Assumption sensitivity
The same recording scored with different direction and amplitude assumptions. A changing result shows why calibration matters.
| Direction | Multiplier | Candidates | Nine-component mean |
|---|
Candidate inspiration details
Select a row to inspect its waveform. Candidates near chunk boundaries and early rolling metrics may be incomplete.
| Candidate | Chunk label | Approx. position | Components flagged | Flags / 9 |
|---|
Data provenance & what we still need
Snoring shows the stored snore signal, not calibrated loudness; dense views preserve each pixel’s minimum and maximum. Sample placement within EMAY chunks and ring alignment are approximate. Ring imports are saved locally. Positive clock offset moves ring data later. Ring ranges use the full recording; HR ceiling uses its 99th percentile plus padding.
Position is stored once per minute chunk. Code 1 is tentatively upright. Codes 4 (back), 6 (right), and 5 (left) are mapped from your position test; blocks do not establish the exact time of a posture change.
The extractor checks whether SDK TempLine matches the app’s breathe_line. Sample values do not establish calibrated physical airflow or sleep state.
- Confirm inhale direction: make a short controlled recording and note which way the live graph moves during an inhale.
- Confirm sensor details: ask EMAY for sample rate, signal units, sensor type, filtering, and whether the exported signal represents flow, pressure, or temperature.
- Record overnight: keep the monitor connected to the app, then use an incremental backup and the extractor to update this viewer.
- Interpretation: awake breathing, movement and sensor response can change waveform shape. Scores here should not guide treatment settings.
The original algorithm uses fixed amplitude thresholds, assumes positive inspiration, and is designed for ResMed flow. Each EMAY chunk is analyzed separately to avoid creating breaths across unverified boundaries. Rolling metrics retain the original code’s edge behavior.
Original Glasgow Index source · Pinned source version · GPL license · Project guide