说明¶
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 的实现选择¶
为什么不用完整的 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 的设计意图¶
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 以上数据可获得良好分辨率