Operational Deflection Shapes

An Operational Deflection Shape (ODS) represents the deformation pattern of a structure at a specific frequency when it is subjected to operational forces. Unlike traditional mode shapes, which are derived from theoretical models or controlled experiments, ODS are obtained from measurements taken while the structure is in operation. This makes them particularly useful for understanding how a structure behaves under real-world conditions. If the structure under consideration is lightly damped, ODS can approximate mode shapes, providing insights into the dynamic characteristics of the structure.

1 Extracting ODS from measured data

The extraction of ODS from the measured data typically depends on the measured quantities. In StructuralVibration.jl, we provide methods to extract ODS from response spectra and cross-spectral density matrices.

1.1 Extraction from response spectra

When response spectra are available, ODS can be extracted by identifying the peaks in the spectra corresponding to the frequencies of interest. The ODS \(\boldsymbol{\Psi}_k\) at a specific frequency peak \(f_k\) is simply given by:

\[ \boldsymbol{\Psi}_k = \mathbf{y}(f_k), \] where \(\mathbf{y}(f_k)\) is the response spectrum vector at frequency \(f_k\).

1.2 Extraction from CSD matrices

When cross-spectral density (CSD) matrices are available, ODSs can be extracted using singular value decomposition (SVD). The CSD matrix \(\mathbf{G}_{yy}(f)\) at some frequency \(f\) can be decomposed as 1: \[ \mathbf{G}_{yy}(f) = \boldsymbol{\Phi}\boldsymbol{G}_{qq}(f) \boldsymbol{\Phi}^H, \] where \(\boldsymbol{\Phi}\) is the mode shapes matrix, and \(\boldsymbol{G}_{qq}(f)\) is the power spectral density matrix of the modal coordinates. On the other hand, performing SVD on the CSD matrix yields:

\[ \mathbf{G}_{yy}(f) = \mathbf{U}(f) \boldsymbol{\Sigma}(f) \mathbf{U}(f)^H, \] where \(\mathbf{U}\) consists of the left singular vectors, and \(\boldsymbol{\Sigma}\) is a diagonal matrix containing the singular values. This comparison reveals a connection between the singular vectors and the mode shapes. In fact, near a resonance frequency \(f_k\), the largest singular value is associated with the dominant mode at that frequency.

Consequently, the ODS \(\boldsymbol{\Psi}_k\) at frequency \(f_k\) is given by the first singular vector: \[ \boldsymbol{\Psi}_k = \mathbf{u}_1(f_k). \]

1.3 Real-normalization of ODS

In practice, ODS are often real-normalized for better interpretability. It consists in converting the complex-valued ODS \(\boldsymbol{\Psi}_k\) into a real-valued vector \(\bar{\boldsymbol{\Psi}}_k\). This can be achieved using the real_normalization function (see Mode shapes real-normalization).

1.4 Improve ODS extraction robustness

In an attempt to improve the robustness of the ODS extraction, especially in the presence of noise, an averaging technique can be employed. This involves averaging multiple ODS candidates within a frequency band around each identified peak frequency. The candidates are selected based on a Modal Assurance Criterion (MAC) threshold to ensure they are sufficiently similar to the reference ODS at the peak frequency. This approach allows defining what is called the Sdof-bell corresponding to the frequencies around each peak where the ODS candidates are considered for averaging.

To estimate the ODS from the average of all selected candidates, a weighted averaging process is implemented using the following formula: \[ \boldsymbol{\Psi}_k = \frac{\sum_{i=1}^{N_k} w_i\, \mathbf{u}_1(\omega_i)}{\sum_{i=1}^{N_k} w_i}, \] where \(N_k\) is the number of selected candidates within the bell and \(w_i\) are the weights assigned to each candidate.

In StructuralVibration.jl, the weights are either uniform (i.e. \(w_i = 1\)) or based on the value of the largest singular value of the CSD matrix at the peak frequency (i.e. \(w_i = s_1(\omega_i)\)). From a theoretical standpoint, using the singular value as a weight give more importance to candidates that are more likely to represent the true mode shape and less importance to those that may be influenced by noise or other factors.

2 API

ods


ods(y, freq, pks_indices)
ods(y, freq, pks_indices, min_mac)
ods(Gyy, freq, pks_indices)
ods(Gyy, freq, pks_indices, min_mac; avg_alg)

Compute the operational deflection shapes (ODS) from response spectrum.

Inputs

  • y::Matrix{Complex}: Response spectrum matrix (noutput x nfrequency)

  • Gyy::Array{Complex, 3}: Cross-spectral density matrix (nouput x ninput x n_frequency)

  • freq: Frequency vector (Hz)

  • pks_indices: Indices of the peaks in the frequency vector

  • min_mac: Minimum MAC value to consider a candidate ODS for averaging

  • avg_alg: Algorithm used for averaging

    • :lin: Linear averaging

    • :sv: Weighted average using singular value (default)

Outputs

  • ods_mode: Operational deflection shape

  • freq_pks: Frequencies at the peaks (Hz)

Note

  • The ODS are normalized such that the maximum absolute value of each mode shape is 1.

3 Example

3.1 Extracting ODS from response spectra

# Structure parameters of the beam
L = 1.        # Length
b = 0.03      # Width
h = 0.01      # Thickness
S = b*h       # Cross-section area
Iz = b*h^3/12 # Moment of inertia

# Material parameters
E = 2.1e11  # Young's modulus
ρ = 7850.   # Density
ξ = 0.01    # Damping ratio

# Mesh
x = 0:0.05:L
xexc = x[2]

# Mode calculation - Simply supported boundary conditions
beam = Beam(L, S, Iz, E, ρ)
fmax = 500.

ωn, kn = modefreq(beam, 2fmax)
ms_exc = modeshape(beam, kn, xexc)
ms_m = modeshape(beam, kn, x)

# Response spectrum calculation
freq = 1.:0.1:fmax
Fn = repeat(ms_exc', 1, length(freq)) # Frequency-independent force vector
prob = ModalFreqProblem(ωn, ξ, Fn, freq, ms_m)
y = solve(prob).u

pks_indices = [225, 929, 2101, 3743]
ods_complex, freq_peaks = ods(y, freq, pks_indices)
ods_real = real_normalization(ods_complex)

scaling = msf(ods_real, ms_m[:, 1:size(ods_real, 2)])
ods_scaled = ods_real .* scaling'

3.2 Extracting ODS from CSD matrices

# Acquisition parameters
sample_rate = 4096
block_size = 4096
fft_params = FFTParameters(sample_rate, block_size)

freq = fft_params.freq
t = fft_params.t
dt = fft_params.dt

# Mode calculation - Simply supported boundary conditions
ωn, kn = modefreq(beam, 2freq[end])
ms_ref = modeshape(beam, kn, x)

# Chirp excitation
F0 = 10.
chirp = SweptSine(F0, t[1], 0.8t[end], freq[1], freq[end], zero_end = true)
force = zeros(length(x), length(t))
force[2, :] .= excitation(chirp, t)

# Response calculation
prob = ForcedModalTimeProblem(ωn, ms_ref, ξ*ones(length(kn)), ms_ref'force, (zeros(length(x)), zeros(length(x))), t)
y = solve(prob).u

tukeywin(x) = tukey(x, 0.5)
Gyy, freq = csd(y, y, block_size, tukeywin, fs = sample_rate)

frange = [0., 500.]
freq_idx = freq .>= frange[1] .&& freq .<= frange[2]
freq = freq[freq_idx]
Gyy = Gyy[:, :, freq_idx]

pks_indices = [23, 94, 211, 375]
ods_complex, freq_peaks = ods(Gyy, freq, pks_indices)
ods_real = real_normalization(ods_complex)

scaling = msf(ods_real, ms_m[:, 1:size(ods_real, 2)])
ods_scaled = ods_real .* scaling'

Footnotes

  1. C. Rainieri and F. Fabbrocino, “Operational modal analysis of civil engineering structures: An introduction and guide for applications” Springer, 2014.↩︎