跳转至

TinySysid · ERA — 设计说明

当前实现与参数口径

当前 ERA_SVD_THRESH 为 0.002f,即保留大于主奇异值 0.2% 的分量。这是奇异值幅值比阈值,不是累计能量阈值;能量涉及奇异值平方。下方历史流程图和代码注释中的 0.5% 保留供版本对照,不作为当前默认值。

ERA 的结果取决于相关函数、Hankel 尺寸、信噪比与所选阶数。“最高精度”和固定误差范围需要共同输入、参数及真实运行结果才能成立,不能由使用 SVD 单独推出。

源码 / Source

ERA — Eigensystem Realization Algorithm:基于状态空间实现的 OMA 方法

基于 NExT(自然激励技术)+ Hankel 矩阵 + SVD + 平衡实现。从时域响应中提取状态空间模型,再从中识别模态参数。结果需结合输入质量、模型阶数和残差验证。

算法直觉

ERA 在做什么?

想象你在黑暗中投篮球。你只能看到球(输出),看不到你的手(输入)。你想知道篮筐的"振动特性"(结构模态)。

ERA 的做法: 1.NExT :把随机响应转换成类似"自由衰减"的信号(互相关函数) 2.Hankel 矩阵 :把时间序列排成一个块矩阵——矩阵的行数代表"过去",列数代表"未来" 3.SVD :分解这个矩阵,保留最大的奇异值——去掉噪声,保留系统的主要动态 4.** 平衡实现** :从 SVD 结果重建系统矩阵 \(A\),它的特征值就是系统的极点

ERA 的数值处理思路

  • 使用 大矩阵 (Hankel 75×50)做 SVD,信息量大
  • NExT 预处理提升了信噪比
  • 平衡实现改善尺度处理,稳定性仍需验证
  • Jacobi SVD 在嵌入式平台上收敛快(~15 sweeps)

算法流程

展开历史阈值示意(当前为 0.2%)
1. NExT(自然激励技术)
   └─ 互相关函数 → 类似自由衰减

2. 构建 Hankel 矩阵
   ├─ H₀: [p·n_ch × q·n_ch](默认 p=15, q=10)
   └─ H₁: 延迟 1 步

3. SVD: H₀ = U·Σ·Vᵀ
   └─ 选择阶数 n(σ[k] > 0.5%·σ[0])

4. 平衡实现
   ├─ A = Σ⁻¹/²·Uᵀ·H₁·V·Σ⁻¹/²
   └─ λ = eig(A) → 离散极点

5. 离散 → 连续模态参数
   └─ 频率、阻尼、振型

设计详解

1. Hankel 矩阵构造

#define ERA_P        15    // 块行数
#define ERA_Q        10    // 块列数

Hankel 矩阵 H₀ 大小为 \((p \cdot n\_ch) \times (q \cdot n\_ch)\) = 75 × 50。

为什么 p=15, q=10? - 行列比 75/50 ≈ 1.5 → SVD 时列数决定最大可辨识阶数:\(\min(75, 50) = 50\) - 实际系统阶数远小于 50(5 通道系统最多 10 个模态 = 20 阶),所以选择后截断 - p,q 越大→包含更多时间信息→对噪声更鲁棒→内存更大

替代选项:

下表保留早期估计。矩阵尺寸按 5 通道计算;内存栏主要对应单个 Hankel 矩阵,不包含完整算法工作区。耗时和精度缺少完整构建与试验条件,不作为当前性能保证。 | p,q | Hankel 大小 | 内存 | 弱模态捕捉 | ESP32 耗时 | |-----|------------|------|-----------|-----------| | (10, 5) | 50×25 | 5 KB | 一般 | ~1s | | (15, 10) | 75×50 | 15 KB | 好 | ~2s | | (20, 15) | 100×75 | 30 KB | 更好 | ~3s | | (30, 20) | 150×100 | 60 KB | 最好 | ~5s (PSRAM) |

默认 (15,10) 在 5 通道 3000 点测试中频率误差 < 2%,阻尼误差 < ±2%。

2. Jacobi SVD(完整分解)

static int jacobi_svd(float *A, int m, int n, float *S, float *Vt, int max_iter)

ERA 需要完整 SVD(所有奇异值/向量),因此用 Jacobi 而非幂迭代。

为什么 Jacobi 不是 QR/Householder?

方法 稳定性 收敛速度 嵌入式适用性
Jacobi 最稳定 O(n³),~15-20 sweeps ✓ 无动态分配,浮点友好
QR 需要 Householder O(n³) 依赖外部库
分治 复杂实现 O(n²log n) 递归栈开销大

Jacobi 的优势在于**无额外内存分配**和**秩判断自然**——Givens 旋转逐对清零,收敛过程中可中途停止。

3. 阶数选择

展开历史阈值示意(当前为 0.2%)
// 奇异值比阈值:保留 σ[k] > 0.5%·σ[0] 的所有阶数
#define ERA_SVD_THRESH 0.002f

当前 0.2% 阈值按奇异值幅值比筛选;实际阶数随输入变化,需结合奇异值谱、稳定性和物理模态判断。

4. 平衡实现

// A = Σ⁻¹/² · Uᵀ · H₁ · V · Σ⁻¹/²
// 无需完整实现:直接从 SVD 结果构造 A

ERA 的平衡实现简化为:截断 Hankel 的 SVD → 用 H₁ 构造系统矩阵 A。这是因为 ERA 假设系统是**可控且可观的**,平衡步骤在嵌入式平台上可略去。

关键参数

参数 默认 说明
p (block rows) 15 Hankel 行块数
q (block cols) 10 Hankel 列块数
SVD 方法 Jacobi 全 SVD(非幂迭代)
阶数选择 > 0.2%·S[0] 保留主要动态

何时使用 ERA

  • 需要联合估计频率、阻尼与振型,并可承担 Hankel/SVD 开销
  • 数据 ≥ 20s(推荐 60s)
  • 作为最终确认方法