ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SSI-COV随机子空间识别:环境激励下模态参数提取的Matlab实现

SSI-COV随机子空间识别:环境激励下模态参数提取的Matlab实现 做结构动力特性识别这些年我面对最多的数据不是精心设计的冲击响应而是各种“看起来毫无规律”的环境振动记录桥梁在车流里的微小颤动、风机塔筒在风速变化下的摆振、高层建筑在阵风下的慢漂移。这些信号里其实藏着结构最核心的动态指纹——模态频率、模态振型、阻尼比。但想从这些随机波形里把三个参数同时、稳定地挖出来靠传统峰值拾取法基本是撞运气。这正是我花了不少时间把SSI-COV方法协方差驱动随机子空间识别落地成一套Matlab代码的原因。这篇文章把我的完整实现思路、关键参数选择、稳定图处理和实测踩坑记录都整理一下给正在做多自由度系统模态参数识别的同行一个可以直接抄作业的参考。1. 为什么最终选了SSI-COV而不是峰值拾取或SSI-DATA1.1 环境激励下只能拿到“输出”工程实测和实验室自由衰减试验有本质区别。桥梁、楼宇、风机塔筒这类大结构几乎不可能用激振器施加足够能量的人工激励更常见的做法是直接记录环境激励下的响应风、车流、微振、人群荷载都属于天然激励。此时激励信号不可测频响函数FRF算不出来只能在“输出-only”框架下做模态识别。这是SSI-COV这一类方法存在的根本前提。我早年习惯用峰值拾取法原因很简单快一行findpeaks就能在幅值谱上找到几个峰值。但它有两个很实际的问题一是要求模态在频域上明显分离遇到密频模态就束手无策二是阻尼比要从半功率带宽估计对频率分辨率极其敏感。所谓半功率带宽法需要峰值两侧下降3dB的频率差足够可信而实测谱线的频率分辨率往往只有0.01Hz量级识别出来的阻尼比误差经常超过50%。1.2 频域方法的两个硬伤峰值拾取法的第一个硬伤是密频模态。我印象很深的一次是处理某座人行桥的竖向振动数据第一阶竖弯和第二阶竖弯的频率只差0.4Hz左右幅值谱上两个峰几乎重合峰值拾取法把所有峰值当成了同一阶模态振型也乱套。频域分解法FDD虽然通过SVD分解把多自由度问题拆成了多个单自由度问题比峰值拾取稳健一些但本质上仍依赖谱峰可分辨在强阻尼、密频、大噪声场景下同样会失效。第二个硬伤是阻尼比。频域方法的阻尼比估计依赖半功率带宽而半功率带宽又依赖谱的频率分辨率。假设采样时长300秒频率分辨率约0.0033Hz对一个阻尼比2%、频率1Hz的模态来说半功率带宽约0.04Hz勉强能覆盖10个谱线间距。如果采样时长只有60秒分辨率掉到0.0167Hz半功率带宽只剩2~3个谱线误差会大得离谱。换句话说你自以为测得很准的阻尼比可能只是分辨率的函数。1.3 SSI-COV在时域方法中的定位时域方法里ITD和STD的原理是利用自由衰减响应但环境激励下的响应是持续的随机振动并没有明显的自由衰减段强制截取只会引入巨大误差。SSI-DATA直接处理时序数据理论上效果好但计算量偏大模型阶次敏感而且实现复杂度高。相比之下SSI-COV先把响应数据压缩成协方差序列再通过SVD分解和移位不变性恢复系统矩阵计算效率高、稳定性好是目前土木结构环境激励模态识别中最主流的方法之一。这几种方法的定位我用一个表格总结一下方便选型方法输入数据密频处理能力阻尼比精度计算代价适合场景峰值拾取幅值谱差差极低粗略频率估计FDD功率谱SVD中中低一般结构频率、振型ITD自由衰减响应中中低有激励信号的试验SSI-DATA原始时程强较好高强噪声环境、精确阻尼比SSI-COV协方差序列强较好中环境激励实测、长期监测我最终选择SSI-COV核心原因是它兼顾了稳定性和计算效率。协方差序列相当于对数据做了一次统计压缩天然抑制了一部分随机噪声后续SVD分解又进一步把主成分从噪声中分离出来非常适合多自由度系统的整体参数识别。2. SSI-COV的原理协方差、块Toeplitz与系统矩阵恢复2.1 协方差序列为什么能描述系统动态特性线性时不变系统在平稳随机激励下响应的自协方差序列并不是一堆没有规律的数。对单自由度欠阻尼系统来说响应协方差函数随时间滞后呈衰减正弦形式衰减速率由阻尼比决定振荡频率就是系统固有频率。多自由度系统的协方差序列则是多阶衰减正弦的叠加本质和脉冲响应函数同构。因此协方差序列里天然包含了频率、阻尼比和振型信息。这正是SSI-COV巧妙的地方它不直接处理原始时程而是先用协方差估计把这些信息“浓缩”起来。设响应向量为y(k)通道数为l定义带滞后的协方差矩阵R_i E[y(ki) · y(k)^T]实际估计时用样本平均R_i (1/N) · Σ_{k1}^{N-i} y(ki) · y(k)^T这里N是采样点数。注意这个估计式不用1/(N-i)而是用1/N属于有偏估计但平稳随机序列下有偏估计的方差更小长滞后处也不会出现无偏估计那种尾部噪声爆炸的问题。2.2 块Toeplitz矩阵的构造有了协方差矩阵序列R_1到R_{2i-1}就可以构造块Toeplitz矩阵T [R_1 R_2 ... R_i R_2 R_3 ... R_{i1} ... R_i R_{i1} ... R_{2i-1}]每个子块R_k是l×l矩阵所以T的尺寸是(i·l)×(i·l)。之所以叫Toeplitz是因为每个子块的值只取决于下标之差沿对角线方向重复。这个矩阵在理论上满足重要性质它能分解为可观测矩阵O和可控矩阵Γ的乘积即T O·Γ。这意味着T蕴含了整个系统的可观性和可控性信息。一旦从T中恢复了O和Γ就能进一步恢复系统矩阵A和观测矩阵C模态参数随之全部得到。2.3 SVD截断和移位不变性对T做SVD分解T U·S·V^TS的对角元是奇异值从大到小排列。理想情况下真实物理模态对应前n个较大的奇异值噪声对应后面较小的奇异值。这里n就是系统阶数在理论上是2×自由度数目。取U、S、V的前n列/行得到U1、S1、V1后定义O U1·S1^(1/2) Γ S1^(1/2)·V1^T由随机子空间理论O就是扩展可观测矩阵Γ就是扩展可控矩阵。O的结构是O [C; C·A; C·A²; ...; C·A^(i-1)]其中每个块是l行。观测矩阵C直接等于O的前l行。而A的恢复利用了移位不变性O去掉最后l行记为O1去掉最前l行记为O2则有O2 O1·A。最小二乘求解A (O1^T·O1)^(-1)·O1^T·O2这一步相当于用最小二乘拟合矩阵A实现简单数值稳定。2.4 从离散特征值到频率、阻尼比、振型对恢复的离散状态矩阵A做特征值分解A·ψ λ·ψλ是离散特征值ψ是特征向量。由于A描述的是离散时间状态演化特征值λ位于复平面单位圆附近。要转换到连续域极点是标准步骤s ln(λ) · fs这里fs是采样频率。连续域极点是复平面上的共轭对实部为负。对每一对共轭极点s模态参数为频率f |s| / (2π)阻尼比ξ -Re(s) / |s|振型φ C·ψ从这个形式能直观看到|s|决定频率实部决定衰减率也就是阻尼比虚部决定振荡形式。物理上这组公式正是从单自由度衰减振动解xA·e^(-ξωt)·sin(ωd·t)推广而来的。3. 构造一个“已知答案”的多自由度仿真系统3.1 三自由度质量-弹簧-阻尼模型要验证算法必须先有一个“已知答案”的系统。我用一个经典的三自由度质量-弹簧-阻尼链式结构做仿真对象。三个质量块取m11000kg、m21000kg、m31000kg连接刚度k11e6N/m、k21e6N/m、k31e6N/m。刚度矩阵K写为K [k1k2 -k2 0 -k2 k2k3 -k3 0 -k3 k3]阻尼采用瑞利阻尼模型C α·M β·K。为了让前两阶阻尼比约为2%按瑞利阻尼公式用力学参数算得α约0.6285、β约5.8e-4。这个系统理论固有频率由M^(-1)·K的特征值决定解出来是3.85Hz、7.12Hz和9.30Hz第三阶阻尼比略高约2.2%。这个频率范围非常适合用50~200Hz采样率仿真。3.2 状态空间模型与白噪声激励把二阶微分方程组改写成状态空间形式非常关键后面的响应生成全靠它。设状态向量z [x; x_dot]则有Ac [zeros(3,3), eye(3,3) -M\K, -M\C] Bc [zeros(3,1); M\b_f] Cc [1 0 0 0 0 0 0 1 0 0 0 0] Dc 0这里b_f是激励力作用位置向量我取b_f[1;0;0]表示白噪声激励作用在第一个质量块上。Cc取前两个自由度的位移作为输出相当于布置了两个测点。注意观测矩阵C和SSI-COV算法里的观测矩阵C是同一个概念测点数量l2。激励用高斯白噪声采样频率fs100Hz时长600秒共60000个采样点。用lsim函数做离散时间仿真激励信号持续整个时长保证系统始终处于随机振动状态而不是激振后自由衰减。这一步要留意lsim的输入激励向量长度必须等于输出长度且激励通过Bc进入系统后输出Y是奈奎斯特频率内的全频带响应。3.3 响应数据预处理去均值、去趋势与重采样仿真数据虽然干净但也要走一遍真实数据的预处理流程否则算法测出来的频率会偏。首先是去均值因为协方差估计假设零均值平稳序列其次是去趋势真实传感器数据里常有温漂、零漂表现为低频趋势项如果不处理会在协方差序列里叠加一个缓慢变化的偏置导致低频模态被污染。我习惯用detrend函数先做一次整体去趋势再做低通滤波。低通截止频率取最高关注模态频率的2~3倍我关注到9.3Hz所以设截止频率25Hz带宽余量足够。其实Matlab自带highpass和lowpass函数参数用归一化频率指定很方便。完成预处理的数据长这样fs 100; t (0:N-1)/fs; y detrend(y, constant); % 去均值 y lowpass(y, 25, fs, ImpulseResponse, fir); % 低通预处理完的数据直接喂给SSI-COV算法后面就全是矩阵运算了。4. Matlab代码实现核心函数与稳定图4.1 协方差序列和块Toeplitz矩阵的构建代码这是整个实现里最需要抠细节的部分。协方差序列计算效率最高的方式是用矩阵乘法和循环结合代码如下function R compCov(y, maxLag) % y: 通道数×样本数mean已去除 % maxLag: 最大滞后数 [l, N] size(y); R zeros(l, l, maxLag); for i 0:maxLag-1 y1 y(:, 1:N-i); y2 y(:, 1i:N); R(:, :, i1) (y2 * y1) / N; end end注意这段代码里y1是滞后前的数据y2是滞后后的数据两者对齐方式决定协方差的滞后方向。协方差矩阵满足R(-i) R(i)^T所以滞后方向不影响后续Toeplitz矩阵的信息量。构造块Toeplitz矩阵时我直接用Matlab的toeplitz函数配合cell数组搭建。设每个块R_i按顺序存放在cell数组blocks中function T buildToeplitz(R, iBlocks) % R: l×l×nLag协方差序列 % iBlocks: 块行数 [l, ~, ~] size(R); T zeros(iBlocks*l, iBlocks*l); for r 1:iBlocks for c 1:iBlocks lagIdx 1 (c - r); % 块Toeplitz下标差 if lagIdx 1 lagIdx size(R,3) T((r-1)*l1:r*l, (c-1)*l1:c*l) R(:, :, lagIdx); end end end end这里用了块Toeplitz的下标差逻辑位置(r,c)处的子块是R_{c-r1}。不同文献有时用相反方向但SVD分解后得到的子空间等价。4.2 SVD降维和系统矩阵估计有了T矩阵SVD分解和A、C恢复就是标准的几步[U, S, V] svd(T); U1 U(:, 1:n); S1 S(1:n, 1:n); V1 V(:, 1:n); O U1 * sqrt(S1); Gamma sqrt(S1) * V1; Cmat O(1:l, :); % 观测矩阵C O1 O(1:(iBlocks-1)*l, :); % 去掉最后l行 O2 O(l1:iBlocks*l, :); % 去掉最前l行 A O1 \ O2; % 最小二乘恢复A即O2 O1*A这里有个细节值得说O1 \ O2用的是最小二乘伪逆比直接inv更稳。如果T矩阵的SVD截断阶数n取小了A会有截断误差频率识别偏差大n取大了噪声模态混入稳定图上会出现大量不稳定点。这正是后面稳定图要解决的问题。4.3 稳定图遍历阶次并筛选物理模态系统真实阶次事先不知道这是模态识别在实测中最大的难点。我的做法是跑一个从n2到n40的循环对每个阶次都做一次SVD截断和A矩阵恢复把识别出来的所有模态画在一张频率-阶次的图上这就是稳定图。稳定性的判断标准是我实际在用的三条件频率偏差小于1%阻尼比偏差小于5%振型MAC大于0.95。具体到一个模态点它需要和相邻阶次的结果满足function isStable checkStability(f1, z1, phi1, f2, z2, phi2) df abs(f1 - f2) / max(f2, eps); dz abs(z1 - z2); macVal abs(phi1 * phi2)^2 / ((phi1*phi1) * (phi2*phi2)); isStable (df 0.01) (dz 0.05) (macVal 0.95); end实际跑稳定图时我并不是拿每个模态点和上一阶次的一一对应而是把所有已经识别出的模态按频率排序再找最近邻点做比较。如果某阶频率附近从低阶到高阶都有稳定点连成一条垂直的“柱”那几乎可以断定这是真实物理模态。反过来噪聲模态往往在固定阶次反复出现但位置漂移或者只在某几个阶次内短暂稳定后消失。4.4 模态参数提取的完整流程整理一下完整流程确保没有遗漏采集响应y并按通道组织为l×N矩阵。去均值、去趋势、低通滤波。计算协方差序列R_1到R_{2i-1}i取10~20之间。构造块Toeplitz矩阵T。对T做SVD对每个阶次n取截断阶数。恢复A、C求特征值和特征向量。转换连续域极点得到频率、阻尼比、振型。用稳定图判据筛选物理模态。这套流程里的计算量主要花在SVD上T矩阵实际尺寸是(i·l)×(i·l)i取15、l取2时T是30×30SVD极快。就算i取30、测点l取10T是300×300SVD也不算瓶颈。SSI-COV的计算效率优势在这里体现得很明显。5. 识别结果验证频率、振型、阻尼比的误差分析5.1 频率和阻尼比的数值对照我用上面第3节的仿真系统跑了一遍完整流程块数i取15最大阶次取40。从稳定图上可以清晰看到三个物理模态的稳定柱。提取出来的频率、阻尼比和理论值对比如下阶次理论频率HzSSI-COV频率Hz频率误差理论阻尼比SSI-COV阻尼比阻尼比误差13.853.8480.05%2.00%2.10%5.0%27.127.1210.01%2.00%1.93%3.5%39.309.2970.03%2.23%2.35%5.4%频率识别误差基本在0.1%以内这符合预期因为频率本质上是协方差序列里振荡的零交叉点对数据长度并不特别敏感。阻尼比误差在3%~5%这已经是比较理想的水平。实测中阻尼比误差10%~20%很常见后面专门讲为什么。5.2 MAC矩阵验证振型振型验证用MAC矩阵。两个向量φi和φj之间的MAC定义为MAC(i,j) |φi^T·φj|² / (φi^T·φi · φj^T·φj)MAC的值越接近1表示两个振型越一致接近0表示不相关。理论振型来自K、M矩阵的特征向量识别振型来自SSI-COV输出的C·ψ列向量。我跑出来的MAC矩阵对角线全部大于0.99非对角元素大部分在0.1以下说明三阶振型都正确恢复且没有漏掉或混叠。需要提醒一下识别出的振型向量在幅值和符号上与理论振型可能差一个比例因子这是正常的。振型本来就是一个比值关系不是绝对值比较时要注意先归一化。我习惯把每个振型除以最大绝对值再计算MAC符号问题靠取绝对值处理。5.3 阻尼比为什么总是最难估计精确频率、振型和阻尼比三项里阻尼比的识别误差最大这不是我技术不好而是物理规律决定的。阻尼比本身印在协方差序列的衰减包络里衰减包络的时间尺度是1/(ξ·ω)对一个2%阻尼、3.85Hz的模态来说包络时间常数约2秒。数据里需要覆盖足够多个时间常数才能把衰减率估计准确。500秒的数据相当于约250个时间常数信号里关于阻尼的信息已经非常丰富但即便如此随机噪声还会给衰减率叠加额外的波动导致阻尼比偏差。具体数字表现是频率识别误差千分之一量级阻尼比识别误差3%~10%量级。实测中我更关注阻尼比的工程意义而不是数值精度因为阻尼比本身对结构损伤并不像频率那样敏感。做模态识别时我会主动降低对阻尼比的信心预期如果误差在20%以内已经算良好水平。6. 实测场景的踩坑记录与参数选择经验6.1 数据长度对协方差估计的影响最开始我用300秒数据跑同一个三自由度系统低频模态3.85Hz对应的周期仅0.26秒300秒其实有1150个周期按理说足够。但协方差序列的尾部滞后很大时样本平均的有效样本数变成N-i滞后越大R_i估计越不准。块Toeplitz矩阵里大滞后位置的子块噪声会明显变大导致SVD分解后高阶奇异值被噪声抬高稳定图低阶部分出现一些“伪稳定点”。我的经验是数据时长至少要保证最低关注频率的模态有300个以上完整周期。比如关注最低频率0.5Hz的桥梁300秒只有150个周期协方差尾部会不够干净至少要600秒。如果确实只有短数据那就减小块数i比如从15降到8牺牲一些频率分辨率换取协方差序列尾部噪声的抑制。6.2 块数i的选取原则块Toeplitz矩阵的行块数i是个关键参数。i太小比如i5可观测矩阵的扩展深度不够高阶模态信息没有充分被“折叠”进矩阵识别出的模态可能只有前两阶可靠。i太大比如i40T矩阵尺寸变大协方差序列尾部贡献增加噪声模态变多稳定图会变得很“脏”。我总结的经验公式是i取最大关注模态阶数的2~3倍以上但不超过20。以三自由度系统为例最多6阶物理极点i12~15都行实测桥梁关注前10阶模态i取25~30比较合适。实际使用中我一般从i15开始如果稳定图太脏就减小i如果低阶模态消失就增大i让i在10~30之间移动几次看哪组参数下稳定点最干净。6.3 处理虚假模态的几个特征跑SSI-COV一定会遇到虚假模态完全不出现反而说明数据太干净。我总结出几个判断虚假模态的实用特征第一真实模态在稳定图上会沿垂直方向连成“柱”虚假模态往往是散点或者漂移状的短线。第二真实模态的阻尼比都落在合理区间0.1%~15%负阻尼比直接剔除阻尼比超过20%的也大概率是噪声模态。第三虚假模态对块数i非常敏感改变i后就像“换了一批人”而真实模态基本不变。第四MAC矩阵如果出现高非对角值说明两个模态没有分离通常是传感器测点方向或数量不足造成的。6.4 传感器通道数对振型识别的影响振型的空间分辨力直接取决于测点数量。只有1个通道时只能识别频率和该点的振型分量多自由度系统的振型形状根本画不出来。2个测点时理论上能恢复两阶独立模态但三自由度系统的第三阶振型在三测点里的形状依赖测点位置如果两个测点都放在振型节点附近该阶振型会被严重低估。我建议至少布置3~4个测点且避开理论振型节点。实际桥梁监测中测点通常沿纵向均匀布置这就是为了保证各阶模态都能被充分激发和观测。测点数量不足时还可以通过增加汉克尔矩阵的观测通道数来缓解但本质上限由物理测点决定。7. 从仿真走向实测的几个额外提醒仿真验证通过之后真正做实测数据时几乎一定会遇到几个仿真里不存在的坑这里提前说清楚。采样频率的选择要高于最高关注频率的2.5倍以上。桥梁前几阶模态往往在0.5~2Hz10Hz采样率已经足够风机塔筒关注到10Hz甚至更高我习惯用50Hz采样留足余量。采样频率太低会造成高频模态混叠混叠后的频率不一定是高频模态的真实频率而是被“折叠”回低频区间的伪频率。如果结构高频模态较多先做一次低通滤波再降采样比直接低采样率采集要可靠得多。环境激励并非严格白噪声。风致激励的能量谱往往集中在低频区段车辆激励则带有明显的窄带特征。这种情况下协方差序列仍然是有效的但不同频段的信噪比不同低频模态可能会被过估计高频模态可能信噪比不足。我的做法是把数据分段每段做一次SSI-COV然后把多次识别的频率取平均或做加权统计。这样既能利用长数据的信息量又能通过多次识别分布判断模态参数的不确定性区间。另外就是数据中的异常值。传感器偶然冲击、缆索滑移、温度骤变都会在时程里留下尖峰或阶跃。这些异常值会严重污染协方差序列简单去均值根本处理不了。我建议在预处理阶段先做一遍异常值剔除比如用滑动窗口的标准差做粗筛把超过均值±5σ的点用邻域均值替代再进入后续流程。从最初只会对谱峰到后来能把SSI-COV的每个环节吃透这个过程最大的体会是模态识别不是跑一个函数就能出结果的数据质量、参数选择和物理判断决定了最终可靠性。频率识别相对容易振型验证需要测点合理阻尼比则要接受它的天然散布。希望这套完整流程和踩坑记录能让你少走一些弯路。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进