跳转至

说明

FDD — Frequency Domain Decomposition:用 SVD 从噪声中分离模态

在各频率点构建互功率谱密度(CPSD)矩阵,做 SVD。第一奇异值(SV1)谱的峰值对应模态频率,对应的左奇异向量即为振型。

算法直觉

SVD 为什么能分离模态?

在固有频率处,结构的响应主要由这个模态主导,各通道间的互谱矩阵近似为 秩 1 矩阵

\[ G(f) \approx \sigma_1 \cdot \mathbf{u}_1 \mathbf{u}_1^T \]
  • \(\sigma_1\) = 第一奇异值 → 模态的"能量" → SV1 谱
  • \(\mathbf{u}_1\) = 第一奇异向量 → 振型

SVD 自动将信号和噪声分离到不同子空间,这是 FDD 比 PP 更抗噪的根本原因。

FDD vs PP

PP FDD
频率来源 平均 auto-PSD SV1 谱(CPSD 的 SVD)
振型 sqrt(PSD[ch]) SVD 左奇异向量
抗噪性 一般 强(SVD 分离信号/噪声)
密集模态 无法区分 可通过高次奇异值

算法流程

1. Welch 平均 CPSD 矩阵 G[:,:,k]
   ├─ 分段 FFT → 各段互谱 → 平均
   └─ G[bin * n_ch² + ri * n_ch + rj]

2. 对每个频点 k:
   ├─ SVD(G[:,:,k]) → σ₁, u₁
   ├─ SV1[k] = σ₁
   └─ mode_shape[:, k] = u₁

3. SV1 谱峰值检测(同 PP)

4. 在峰值处提取振型 → 归一化 → 去重

设计详解

1. CPSD 矩阵 vs 独立 PSD

FDD 的核心创新是使用功率谱密度矩阵而非功率谱:

// PP: 每通道独立 PSD → 平均 → 峰值检测
tiny_sysid_psd_welch(data, n_ch, n, seg_len, fft_len, fs, psd, &n_bins);
// FDD: 所有通道互谱 → CPSD 矩阵 → SVD
tiny_sysid_cpsd_welch(data, n_ch, n, seg_len, fft_len, fs, G, &n_bins);

在固有频率处,CPSD 矩阵近似为秩 1:

\[ G(f) \approx \sigma_1 \cdot u_1 u_1^T + \underbrace{\sum_{i=2}^{n} \sigma_i \cdot u_i u_i^T}_{噪声} \]

SVD 将信号能量压缩到第一奇异值,噪声分散到高阶奇异值——这是 FDD 比 PP 抗噪的数学根源。

2. 幂迭代 SVD 的实现选择

int tiny_sysid_svd_dominant(const float *G, int n, float *sigma, float *u)

为什么不用完整的 Jacobi SVD?

方案 每频点复杂度 n=5 时耗时 适用场景
幂迭代 \(O(k \cdot n^2)\),k≈15 ~375 FLOP n_ch < 10,只需主奇异值
Jacobi SVD \(O(n^3)\) ~500 FLOP 需要全部分解(ERA/SSI)

FDD 只需第一奇异值/向量,幂迭代是更优选择。

收敛加速技巧

// 初始向量使用全 1(非随机)
for (int i = 0; i < n; i++) u[i] = 1.0f;
// Rayleigh 商加速:λ = vᵀ·G·v / vᵀ·v
float lam = num / den;  // 比单纯用 ||v_next|| 估计快 2-3×
// 相对收敛判据
fabsf(lam - lam_prev) < 1e-6f * fmaxf(fabsf(lam), 1.0f)

全 1 初始向量对结构振型信号(各通道近似同相)足够好。Rayleigh 商使得 15 次迭代可达 1e-6 精度。

3. seg_len=1024 的设计意图

int seg_len = 1024;
while (seg_len > n && seg_len > 32) seg_len >>= 1;

PP 用 seg_len=n/3(≤512),FDD 用 1024。为什么?

  • PP 需要足够的段数(≥3)来稳定 PSD 估计,因为独立 PSD 方差大
  • FDD 用 CPSD,段间互谱的方差更小,允许用更少段数(~2 段)和更长的 seg_len
  • 更长 seg_len → 更高频率分辨率:0.049 Hz vs 0.098 Hz

4. 内存 & 计算

  • CPSD 缓冲区:n_bins × n_ch² = 1024 × 25 = 25600 float ≈ 100 KB
  • 5 通道 CPSD 对 ESP32-S3 的 512KB SRAM 可以接受,但接近边界
  • 若 n_ch=10,CPSD 需要 400 KB → 建议使用 PSRAM

关键参数

参数 默认 说明
seg_len min(N/3, 512) Welch 分段长
SVD 方法 幂迭代 只求主奇异值/向量
SVD 容差 1e-6 幂迭代收敛判据

何时使用 FDD

  • 需要比 PP 更可靠的频率和振型
  • 数据有噪声(SVD 自动降噪)
  • 30s 以上数据可获得良好分辨率