Frequency Domain Decomposition (FDD) / Enhanced FDD (EFDD)¶
This page expands 2.5 FDD / EFDD from the SHM roadmap: decompose the output power spectral density matrix via SVD to extract mode shapes and frequencies; EFDD refines damping estimates by single-mode fitting in frequency bands.
Concept¶
Core idea — For output-only data (ambient excitation), the power spectral density (PSD) matrix of the responses contains modal information. At each frequency, perform singular value decomposition (SVD) of the PSD matrix; the dominant singular vector (first left singular vector) approximates the mode shape, and the first singular value (largest) peaks at natural frequencies. EFDD improves damping estimates by fitting a single-mode model to the singular value curve around each peak. So FDD is: estimate PSD matrix → SVD at each frequency → extract mode shapes and frequencies → (EFDD) fit damping.
Why it works — Under white or broadband ambient excitation, the output PSD matrix \(\mathbf{S}_{yy}(\omega)\) can be decomposed as
Notation for (1):
-
\(\mathbf{S}_{yy}(\omega) \in \mathbb{C}^{n \times n}\): output PSD matrix at frequency \(\omega\) (\(n\) = number of sensors).
-
\(N_m\): number of modes.
-
\(\mathbf{\phi}_r \in \mathbb{C}^n\): mode shape vector for mode \(r\).
-
\(\omega_r, \zeta_r\): undamped natural frequency and damping ratio of mode \(r\).
-
\(d_r\): modal participation factor (depends on excitation and mode).
-
\(\mathbf{S}_n(\omega)\): noise PSD matrix.
-
\((\cdot)^H\): Hermitian transpose.
At a natural frequency \(\omega \approx \omega_r\), the \(r\)-th mode dominates, so the first singular vector of \(\mathbf{S}_{yy}(\omega)\) approximates \(\mathbf{\phi}_r\), and the first singular value is large. FDD exploits this by doing SVD at each frequency line.
FDD vs EFDD — FDD gives frequencies (from peaks of the first singular value curve) and mode shapes (from the first singular vector at each peak), but no damping. EFDD adds a step: around each peak, fit a single-degree-of-freedom (SDOF) model to the singular value curve to extract damping ratio \(\zeta_r\).
Detailed algorithm and implementation¶
Step 1: Data preparation and PSD estimation¶
Input: Multi-channel output time series \(\{y_i[k]\}\), \(i = 1, \ldots, n\), \(k = 1, \ldots, N\), sampled at rate \(f_s\).
PSD estimation (Welch method):
1.1 Segment the data: Divide each channel into overlapping segments (e.g. 50% overlap). Typical segment length: 1024–4096 samples (adjust for desired frequency resolution \(\Delta f = f_s / N_{\text{seg}}\)).
1.2 Window each segment: Apply a window (e.g. Hanning, Hamming) to reduce spectral leakage. For segment \(m\) of channel \(i\): [y_{i,m}^{\text{win}}[k] = w[k] \cdot y_{i,m}[k],] where \(w[k]\) is the window function.
1.3 Compute FFT: For each windowed segment, compute the FFT: [Y_{i,m}(\omega_k) = \text{FFT}{y_{i,m}^{\text{win}}[k]},] where \(\omega_k = 2\pi k f_s / N_{\text{seg}}\), \(k = 0, \ldots, N_{\text{seg}}/2\).
1.4 Estimate PSD matrix: At each frequency line \(\omega_k\), form the PSD matrix: [\mathbf{S}{yy}(\omega_k) = \frac{1}{M} \sum^{M} \mathbf{Y}_m(\omega_k) \mathbf{Y}_m^H(\omega_k), \tag{2}] where \(\mathbf{Y}_m(\omega_k) = [Y_{1,m}(\omega_k), \ldots, Y_{n,m}(\omega_k)]^T\) is the vector of FFT values at frequency \(\omega_k\) for segment \(m\), and \(M\) is the number of segments.
Practical notes:
-
Segment length: Longer segments → better frequency resolution but fewer averages (higher variance). Typical: 2048 samples at \(f_s = 100\) Hz gives \(\Delta f \approx 0.05\) Hz.
-
Overlap: 50% overlap is common; 75% gives more averages but more computation.
-
Window: Hanning is standard; use flat-top for amplitude accuracy, rectangular for transient signals.
-
Number of averages: \(M \geq 20\) is recommended for stable estimates; more averages reduce variance but require longer data.
Step 2: SVD at each frequency line¶
For each frequency \(\omega_k\) in the range of interest:
2.1 Extract PSD matrix: Get \(\mathbf{S}_{yy}(\omega_k) \in \mathbb{C}^{n \times n}\) (or \(\mathbb{R}^{n \times n}\) if using one-sided PSD).
2.2 Perform SVD: [\mathbf{S}_{yy}(\omega_k) = \mathbf{U}_k \mathbf{\Sigma}_k \mathbf{V}_k^H, \tag{3}] where:
-
\(\mathbf{U}_k = [\mathbf{u}_{1,k}, \ldots, \mathbf{u}_{n,k}]\): left singular vectors (columns).
-
\(\mathbf{\Sigma}_k = \text{diag}(\sigma_{1,k}, \ldots, \sigma_{n,k})\): singular values (\(\sigma_{1,k} \geq \sigma_{2,k} \geq \cdots \geq \sigma_{n,k} \geq 0\)).
-
\(\mathbf{V}_k\): right singular vectors (not needed for FDD).
2.3 Store results:
-
First singular value: \(\sigma_{1,k}\) (used to find frequency peaks).
-
First singular vector: \(\mathbf{u}_{1,k}\) (approximates mode shape at \(\omega_k\)).
Implementation notes:
-
Use economy SVD (compute only the first few singular vectors) if only the first mode is of interest.
-
For real PSD matrices (one-sided), use real SVD; for complex (two-sided), use complex SVD.
-
Numerical stability: If \(\mathbf{S}_{yy}(\omega_k)\) is ill-conditioned (e.g. near noise floor), the first singular vector may be unreliable; check condition number or use regularization.
Step 3: Extract frequencies and mode shapes (FDD)¶
Frequency extraction:
3.1 Plot the first singular value curve: \(\sigma_1(\omega_k)\) vs \(\omega_k\) (or \(f_k = \omega_k / (2\pi)\)).
3.2 Identify peaks: Find local maxima in \(\sigma_1(\omega_k)\). Use peak detection:
-
Simple: Find bins where \(\sigma_{1,k} > \sigma_{1,k-1}\) and \(\sigma_{1,k} > \sigma_{1,k+1}\).
-
Robust: Use peak prominence (minimum height above neighbors) to reject noise.
-
Sub-bin accuracy: Fit a parabola around each peak to get sub-bin frequency estimate.
3.3 Record peak frequencies: For each peak \(r\), record the frequency \(\omega_r\) (or \(f_r\)).
Mode shape extraction:
3.4 At each peak frequency \(\omega_r\):
-
Extract the first singular vector: \(\mathbf{\phi}_r \approx \mathbf{u}_{1,k_r}\), where \(k_r\) is the frequency bin index of peak \(r\).
-
Normalize: Typically normalize to unit norm or set the largest component to 1: [\mathbf{\phi}r \leftarrow \frac{\mathbf{\phi}_r}{|\mathbf{\phi}_r|} \quad \text{or} \quad \mathbf{\phi}_r \leftarrow \frac{\mathbf{\phi}_r}{\max_i |\phi|}.]
3.5 Handle complex mode shapes: If \(\mathbf{\phi}_r\) is complex (from complex SVD), you can:
-
Use the magnitude \(|\mathbf{\phi}_r|\) for real mode shapes (common for lightly damped structures).
-
Use the real part \(\text{Re}(\mathbf{\phi}_r)\) if the structure is real-valued.
-
Keep complex if the structure has complex modes (e.g. gyroscopic effects, non-proportional damping).
Practical notes:
-
Peak selection: Only select peaks that are clearly above the noise floor. A rule of thumb: \(\sigma_{1,\text{peak}} > 2 \cdot \sigma_{1,\text{noise}}\), where \(\sigma_{1,\text{noise}}\) is the average of \(\sigma_1\) in non-resonant regions.
-
Close modes: If two peaks are very close (within a few frequency bins), the first singular vector may mix both modes. Use the second singular vector or apply EFDD/SSI for better separation.
-
Mode shape consistency: Check that mode shapes at nearby frequencies (within the same peak region) are similar; large variations indicate noise or mode mixing.
Step 4: Damping estimation (EFDD)¶
EFDD adds damping estimation by fitting a single-mode model around each peak.
For each identified peak at frequency \(\omega_r\):
4.1 Select frequency band: Choose a frequency band around \(\omega_r\): \([\omega_r - \Delta\omega, \omega_r + \Delta\omega]\), where \(\Delta\omega\) is typically 2–5 times the expected bandwidth (e.g. \(\Delta\omega \approx 5 \zeta_r \omega_r\) if damping is known approximately).
4.2 Extract singular value curve: In this band, extract \(\sigma_1(\omega_k)\) for all frequency bins \(k\) in the band.
4.3 Fit SDOF model: Fit the theoretical SDOF response to the singular value curve. The model is: [\sigma_1(\omega) \approx \frac{A}{(\omega_r^2 - \omega2)2 + (2\zeta_r \omega_r \omega)^2}, \tag{4}] where \(A\) is an amplitude factor.
4.4 Optimization: Minimize the error between measured \(\sigma_1(\omega_k)\) and model (4) w.r.t. \(\omega_r\) and \(\zeta_r\) (and optionally \(A\)). Use nonlinear optimization (e.g. Levenberg–Marquardt, Gauss–Newton): [\min_{\omega_r, \zeta_r, A} \sum_{k \in \text{band}} \left| \sigma_1(\omega_k) - \frac{A}{(\omega_r^2 - \omega_k2)2 + (2\zeta_r \omega_r \omega_k)^2} \right|^2. \tag{5}]
4.5 Extract damping: The optimized \(\zeta_r\) is the damping ratio estimate.
Practical notes:
-
Initial guess: Use the peak frequency from Step 3 as initial \(\omega_r\); use a typical damping (e.g. \(\zeta = 0.01\) for civil structures, \(0.05\) for mechanical systems) as initial \(\zeta_r\).
-
Bandwidth selection: Too narrow → insufficient data; too wide → includes neighboring modes. Start with \(\Delta\omega \approx 3 \zeta_r \omega_r\) and adjust.
-
Convergence: If optimization fails to converge, the mode may be too close to another mode or too lightly damped; try a narrower band or use FDD frequency only (no damping).
-
Validation: Check that the fitted curve matches the measured \(\sigma_1\) visually; large residuals indicate poor fit (possibly due to mode mixing or noise).
Complete procedure (step-by-step)¶
Input: Multi-channel time series \(\{y_i[k]\}\), \(i = 1, \ldots, n\), \(k = 1, \ldots, N\), sampling rate \(f_s\).
Step 1: Preprocessing
1.1 Remove DC offset: \(y_i[k] \leftarrow y_i[k] - \text{mean}(y_i)\).
1.2 (Optional) Detrend: remove linear trend if present.
1.3 (Optional) Filter: apply band-pass filter to focus on frequency range of interest.
Step 2: PSD matrix estimation
2.1 Choose segment length \(N_{\text{seg}}\) (e.g. 2048) and overlap (e.g. 50%).
2.2 For each channel \(i\), compute windowed FFTs for all segments.
2.3 At each frequency bin \(k\), form \(\mathbf{S}_{yy}(\omega_k)\) using (2).
2.4 Result: PSD matrices \(\mathbf{S}_{yy}(\omega_k)\) for \(k = 0, \ldots, N_{\text{seg}}/2\).
Step 3: SVD at each frequency
3.1 For each \(\omega_k\): compute SVD \(\mathbf{S}_{yy}(\omega_k) = \mathbf{U}_k \mathbf{\Sigma}_k \mathbf{V}_k^H\); store \(\sigma_{1,k}\) (first singular value) and \(\mathbf{u}_{1,k}\) (first singular vector).
3.2 Result: \(\sigma_1(\omega_k)\) curve and \(\mathbf{u}_1(\omega_k)\) vectors.
Step 4: Frequency identification (FDD)
4.1 Plot \(\sigma_1(\omega_k)\) vs \(f_k = \omega_k / (2\pi)\).
4.2 Identify peaks using peak detection (with prominence threshold).
4.3 For each peak \(r\), record frequency \(f_r\) (with sub-bin accuracy if fitted).
Step 5: Mode shape extraction (FDD)
5.1 For each peak \(r\) at frequency bin \(k_r\): extract mode shape \(\mathbf{\phi}_r = \mathbf{u}_{1,k_r}\); normalize (unit norm or max component = 1); (optional) check consistency with nearby bins.
5.2 Result: Mode shapes \(\mathbf{\phi}_r\) for \(r = 1, \ldots, N_m\).
Step 6: Damping estimation (EFDD, optional)
6.1 For each peak \(r\): select frequency band around \(f_r\); extract \(\sigma_1(\omega_k)\) in the band; fit SDOF model (4) using optimization (5); extract damping ratio \(\zeta_r\).
6.2 Result: Damping ratios \(\zeta_r\) for \(r = 1, \ldots, N_m\).
Output: Modal parameters: frequencies \(f_r\), mode shapes \(\mathbf{\phi}_r\), damping ratios \(\zeta_r\) (if EFDD).
When to use and limitations¶
Use when:
-
Output-only data (ambient excitation, operational conditions).
-
Multiple sensors (at least 2, preferably 4+ for reliable mode shapes).
-
Broadband or white excitation (ensures all modes are excited).
-
Well-separated modes (FDD works best when modes are not too close).
-
Moderate damping (very light damping: peaks are sharp, EFDD fitting may be difficult; very heavy damping: peaks are broad, hard to separate).
Limitations:
-
No damping from FDD: FDD gives frequencies and mode shapes only; need EFDD for damping.
-
Close modes: When modes are very close (within a few frequency bins), the first singular vector may mix modes; use second/third singular vectors or switch to SSI.
-
Mode shape accuracy: Singular vectors are approximations; accuracy depends on SNR, number of sensors, and mode separation.
-
Excitation assumption: Assumes white or broadband excitation; narrowband excitation may bias results.
-
Computational cost: SVD at each frequency line; for many frequencies and sensors, cost grows as \(O(n^3 \cdot N_f)\), where \(N_f\) is the number of frequency bins.
Engineering practice: detailed guidelines¶
PSD estimation parameters¶
| Parameter | Typical values | Notes |
|---|---|---|
| Segment length \(N_{\text{seg}}\) | 1024–4096 samples | Longer → better frequency resolution; shorter → more averages. Choose based on \(f_s\) and desired \(\Delta f\). |
| Overlap | 50% (standard), 75% (more averages) | More overlap → more averages but more computation. |
| Window | Hanning (standard), Hamming, flat-top | Hanning: good balance; flat-top: amplitude accuracy; rectangular: transient signals. |
| Number of averages \(M\) | \(\geq 20\) (recommended) | More averages → lower variance but need longer data. |
| Frequency resolution \(\Delta f\) | \(f_s / N_{\text{seg}}\) | Typical: 0.05–0.1 Hz for civil structures (e.g. \(f_s = 100\) Hz, \(N_{\text{seg}} = 2048\) → \(\Delta f \approx 0.05\) Hz). |
Peak detection and mode selection¶
| Aspect | Guidelines |
|---|---|
| Peak prominence | Set threshold: \(\sigma_{1,\text{peak}} > 2 \cdot \sigma_{1,\text{noise}}\) (or use automatic prominence). |
| Sub-bin frequency | Fit parabola around peak: \(f_{\text{peak}} = f_k + \delta\), where \(\delta\) is from parabola vertex. |
| Close modes | If peaks within 3–5 bins, check second singular vector; if still mixed, use SSI. |
| Spurious peaks | Check mode shape consistency; spurious peaks have inconsistent or noisy mode shapes. |
| Frequency range | Focus on range where modes are expected (e.g. 0.1–10 Hz for bridges, 1–50 Hz for buildings). |
EFDD damping fitting¶
| Aspect | Guidelines |
|---|---|
| Frequency band width | Start with \(\Delta\omega \approx 3 \zeta_r \omega_r\); adjust if fit is poor (narrower if close modes, wider if noisy). |
| Initial guess | \(\omega_r\): from FDD peak; \(\zeta_r\): 0.01 (civil), 0.05 (mechanical), or from prior knowledge. |
| Optimization method | Levenberg–Marquardt is robust; Gauss–Newton is faster if near solution. |
| Convergence | If fails, try narrower band, different initial guess, or skip damping (use FDD frequency only). |
| Validation | Plot fitted curve vs measured \(\sigma_1\); large residuals indicate poor fit (mode mixing or noise). |
Common issues and solutions¶
| Issue | Symptoms | Solutions |
|---|---|---|
| Noisy singular value curve | Many small peaks, unstable mode shapes | Increase number of averages \(M\); use longer segments; apply smoothing to \(\sigma_1\) curve. |
| Mode mixing | Mode shapes change rapidly near peak | Check second/third singular vectors; use narrower frequency band for EFDD; switch to SSI. |
| Missing modes | Expected mode not found in \(\sigma_1\) curve | Check excitation covers that frequency; increase frequency resolution; check sensor placement (avoid nodes). |
| Poor damping fit | EFDD optimization fails or gives unrealistic \(\zeta\) | Try different initial guess; adjust frequency band; check if mode is too close to another; use FDD only. |
| Inconsistent mode shapes | Mode shape varies across nearby frequencies | Check SNR; increase averages; verify sensor synchronization; check for nonlinearity. |
Edge and online computing¶
Suitability — Moderately suited. Output-only (no input measurement needed); SVD per frequency line can be done in batches; manageable when channels and lines are limited. However, PSD estimation needs buffer, and EFDD damping fit adds computation.
Implementation strategy:
-
PSD estimation (sliding-window Welch or block processing)
1.1 Buffer \(N_{\text{seg}}\) samples per channel.
1.2 Compute windowed FFT for current block.
1.3 Update PSD estimate (exponential moving average or block average).
1.4 Trade-off: more averages → better quality but more latency. -
SVD computation (for each frequency bin)
2.1 Economy SVD — compute only first 1–2 singular vectors (most modes are in the first).
2.2 Batch processing — process multiple frequency bins in parallel if hardware allows.
2.3 Incremental updates — for slowly varying systems, update SVD incrementally (e.g. rank-1 updates). -
Peak detection: Lightweight (comparisons and local fits); can run in real time.
-
EFDD damping: More expensive (nonlinear optimization); options:
4.1 Run EFDD offline or in cloud (upload peak frequencies, download damping).
4.2 Use pre-computed damping from baseline (assume damping doesn't change much).
4.3 Skip EFDD on edge, use FDD frequencies only (damping from other methods or prior).
Practical edge deployment:
-
Tiered pipeline:
1.1 Edge — PSD estimation + SVD + peak detection → frequencies and mode shapes (FDD).
1.2 Cloud/offline — EFDD damping fitting for identified peaks. -
Resource limits:
2.1 Limit number of frequency bins (focus on expected modal range).
2.2 Limit number of sensors (use subset if needed).
2.3 Use economy SVD (first 1–2 modes only). -
Real-time screening: Compare FDD frequencies with baseline; flag significant shifts; upload suspect segments for full analysis.
Challenges:
-
Memory: PSD matrices and SVD results need storage; limit frequency range and sensors.
-
Computation: SVD at each frequency; for many bins, cost is significant on MCUs.
-
Latency: PSD needs buffer; real-time updates have delay (e.g. \(N_{\text{seg}} / f_s\) seconds).
-
Quality: Edge SNR may be lower; fewer averages → noisier results; use smoothing or longer buffers.
Comparison with other methods¶
FDD vs PP:
-
FDD: Uses SVD of PSD matrix → more robust to noise, better for close modes, gives mode shapes directly.
-
PP: Simpler (just peak picking on spectra) → faster, less robust, mode shapes from amplitude ratios.
FDD vs SSI:
-
FDD: Frequency-domain, non-parametric → simpler, no order selection, but no damping (need EFDD).
-
SSI: Time-domain, parametric → more accurate, gives damping, but needs order selection and more computation.
FDD vs EFDD:
-
FDD: Fast, gives frequencies and mode shapes, no damping.
-
EFDD: Adds damping estimation via SDOF fitting → more complete but slower.
When to choose:
-
Use FDD for quick screening, well-separated modes, when damping is not critical.
-
Use EFDD when damping is needed and modes are reasonably separated.
-
Use SSI for highest accuracy, close modes, or when full modal model is needed.