代码¶
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\)
- 多对峰取平均提高阻尼估计的稳定性