跳转至

代码

EFDD 实现 — FDD + IFFT + 对数衰减阻尼

// ── 对数衰减法阻尼估计(EFDD 的核心增补)──
static int estimate_damping(const float *corr, int n_pts, float fs,
                             float freq, float *damping)
{
    // 在 IFFT 后的时域信号中找正峰值
    int n_peaks = 0, peak_indices[50];
    for (int i = 2; i < n_pts - 1 && n_peaks < 50; i++)
        if (corr[i] > corr[i-1] && corr[i] >= corr[i+1] && corr[i] > 0)
            peak_indices[n_peaks++] = i;

    // 最少 3 个峰才能估计阻尼
    if (n_peaks < 3) { *damping = 0.0f; return -2; }

    // 按周期隔离选取(> 0.3 倍周期间距)
    float T = 1.0f / freq;
    float min_sep = T * fs * 0.3f;

    // 选 2-5 个峰,相邻峰对数比 → ζ
    for (int i = 0; i < n_selected - 1; i++) {
        float ratio = peaks[i] / peaks[i + 1];
        if (ratio > 1.001f) {                    // 必须有衰减
            double delta = log((double)ratio);
            double zeta = delta / (2.0 * M_PI);
            if (zeta > 0.0 && zeta < 0.2)        // 小阻尼近似有效范围
                sum_damping += zeta;
        }
    }
    *damping = (float)(sum_damping / n_pairs);
}

// ── EFDD 主入口 ──
int tiny_sysid_efdd(...) {
    // 1. 同 FDD:CPSD → SVD → SV1 谱 → 峰值检测 → 频率/振型
    // 2. 对每个模态:
    //    a. 截取 SV1[peak-3 : peak+3]
    //    b. 构造双边频谱 → IFFT → 时域 SDOF 自相关
    //    c. estimate_damping() → 阻尼比
    // 3. MAC > 0.9 去重
}

关键设计

  • 阻尼估计仅适用于模态分离良好(> 3 bins)的情况
  • 小阻尼近似 \(\zeta = \delta / (2\pi)\) 要求 \(\zeta < 0.2\)
  • 多对峰取平均提高阻尼估计的稳定性