System Identification¶
TinySysid — Operational Modal Analysis on Edge Devices
Six output-only modal identification methods, all running on ESP32-S3. From fast frequency scanning to high-precision damping estimation, covering the complete OMA workflow.
Architecture¶
-
PP Peak Picking
Averaged PSD → local peaks → mode shapes
Fastest, no matrix operations
Quick frequency scan -
FDD Frequency Domain Decomposition
CPSD per bin → SVD → SV1 spectrum
SVD separates signal/noise subspaces
High-quality frequency + shapes -
EFDD Enhanced FDD
FDD + IFFT + log decrement damping
Adds damping to FDD
When approximate damping is enough -
ITD Ibrahim Time Domain
NExT + per-pair AR model
Catches weak modes SVD methods miss
Weak-mode detection -
ERA Eigensystem Realization
NExT + Hankel SVD + balanced realization
Most accurate overall
Full freq/damping/shapes -
SSI Subspace Identification
Toeplitz SVD + shift invariance + order voting
Best damping (with enough data)
High-quality damping estimation
Processing Pipeline¶
All OMA methods share a common pipeline from raw data to modal parameters, diverging at the time/frequency branch.
┌─ Welch averaged PSD ── peak detection ── freq + sqrt(PSD) shapes ← PP
│
Data → Preproc → FFT ─┼─ Welch averaged CPSD ── per-bin SVD ── SV1 peaks ── freq + SVD shapes ← FDD
│ └── IFFT + log decrement ── damping ← EFDD
│
└─ NExT cross-corr ── system matrix ── eigenvalues ── poles → freq/damping + CPSD shapes ← ITD / ERA / SSI
Design rationale: Frequency-domain methods (PP/FDD/EFDD) are fast and work with short data, but resolution is FFT-limited. Time-domain methods (ITD/ERA/SSI) use cross-correlation to extend effective data length, achieving higher accuracy at greater computational cost. Recommended: frequency-domain scan first, then time-domain refinement.
Use Case Index¶
-
Fast frequency scan
→ PP, ~50 ms for 5ch×3000
-
Frequency + shapes
→ FDD, SVD noise immunity
-
Frequencies with damping
→ EFDD, approximate damping
-
Weak mode detection
→ ITD, per-pair AR catches them
-
Highest overall accuracy
→ ERA, best freq/damping/shapes
-
High-quality damping
→ SSI, cross-order voting
Quick Start¶
#include "tiny_sysid.h"
float data[5 * 1500]; // 5 ch × 1500 samples
float fs = 50.0f;
int n_modes = 4;
tiny_sysid_result_t result;
tiny_sysid_identify(data, 5, 1500, fs, n_modes,
TINY_SYSID_METHOD_FDD, &result);
tiny_sysid_print_result(&result);
Data Length Requirements¶
| Method | Minimum | Recommended |
|---|---|---|
| PP, FDD | 500 (10s) | 1500 (30s) |
| EFDD | 1000 (20s) | 3000 (60s) |
| ITD | 500 (10s) | 1500 (30s) |
| ERA | 1000 (20s) | 3000 (60s) |
| SSI | 3000 (60s) | 6000 (120s) |
Recommended Workflow¶
1. PP → quick frequency scan
2. FDD → confirm frequencies + shapes
3. ERA → refined freq/damping/shapes
4. ITD → cross-validate weak modes
5. Consensus → final modes