跳转至

代码

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,对所有通道对结果聚类——对弱模态更鲁棒。