代码¶
SSI 实现 — 逐对 Toeplitz SVD → 位移不变性 → 跨阶投票
// ── Jacobi SVD(同 ERA,用于 Toeplitz 矩阵)──
static int jacobi_svd(float *A, int m, int n, float *S, float *Vt, int max_iter);
// ── 矩阵乘法辅助 ──
static void mat_mul_f32(const float *A, const float *B, float *C, int m, int k, int n);
// ── SSI 核心逻辑 ──
int tiny_sysid_ssi(const float *data, int n_ch, int n, float fs,
int n_modes, tiny_sysid_result_t *result)
{
// ── Step 1: 互相关 → 块 Toeplitz 矩阵 ──
// T[block_rows * 2 × block_rows * 2] = block Toeplitz
// ── Step 2: Jacobi SVD of T ──
// T = U · S · Vᵀ
// ── Step 3: 对各阶数 n = 2,4,...,16 ──
// O_n = U_n · √S_n (可观矩阵)
// C_n = O_n[0:n_ch, :] (输出矩阵)
// A_n = O_up⁺ · O_dn (系统矩阵 by 位移不变性)
// eig(A_n) → 候选模态
// ── Step 4: 池化 + 聚类投票 ──
// 10% 容差 → 最终模态
}
逐对变体 SSI-PW:每次只跑 2 个通道的 Toeplitz,对所有通道对结果聚类——对弱模态更鲁棒。