%% 合并三个时间段的索力识别结果
clc;
clear;
close all;
% 加载拉索参数
cable_params = struct(...
'nz_02', struct('m_line',52.75, 'E',2.05e11, 'L',93.43, 'd',0.894),...
'nz_14', struct('m_line',64.14, 'E',2.05e11, 'L',244.19, 'd',0.989));
selected_cable = 'nz_14';
param = cable_params.(selected_cable);
% 加载完整数据
load nz_14;
Sig = zz(:);
Sig = Sig(1:30000); % 截取前30000个点
% 分段参数
segment_length = 30000;
num_segments = 1;
SampFreq = 100;
% 预分配存储数组
all_T_msst = [];
all_T_sst = [];
all_time = [];
% 循环处理每个时间段
for seg = 1:num_segments
% 截取当前段数据
start_idx = (seg-1)*segment_length + 1;
end_idx = seg*segment_length;
current_Sig = Sig(start_idx:end_idx);
% 生成全局时间轴(单位:秒)
time_offset = (seg-1)*(segment_length/SampFreq); % 计算时间偏移
time_local = (0:length(current_Sig)-1)/SampFreq;
time_global = time_offset + time_local;
%% MSST处理(挤压次数=10)
[Ts_msst] = IMSST_Z(current_Sig,300, 10);
%% SST处理(挤压次数=1)
[Ts_sst] = IMSST_Z(current_Sig, 300, 1);
%% 脊线提取与索力计算
fre = linspace(0, SampFreq/2, size(Ts_msst,1));
% 公共参数
m = 64.14; % 使用结构体参数
E = 2.05e11;
L = 244.19;
d = 0.989;
I = pi * d^4 / 64;
T0 = 4184500; % 根据实际情况调整
for method = {'msst', 'sst'}
Ts = eval(['Ts_', method{1}]);
% 脊线检测
[Cs11] = Ridge_mult_detection_Y(abs(Ts), 0:1, 3, 0.0001, 10);
Cs11 = sort(Cs11, 'descend');
fre_ridges = fre(Cs11(1,:)); % 取主脊线
% 索力计算
f = fre_ridges;
epsilon=L*(T0/(E*I))^1/2; % 修正公式表达
T = zeros(size(f));
for i = 1:length(f)
if epsilon >= 0 && epsilon <= 18
T=3.432*m*L.^2*f.^2-45.191*E*I/L.^2;
elseif epsilon > 18 && epsilon <= 210
T=m*(2*L*f-(2.363*(E*I/m)^0.5)/L).^2;
else
T=4*m*L.^2*f.^2;
end
end
eval(['T_', method{1}, '= T/1000;']); % 转换为kN
end
% 存储结果
all_T_msst = [all_T_msst, T_msst];
all_T_sst = [all_T_sst, T_sst];
all_time = [all_time, time_global];
end
%% 合并结果绘图
figure('Units','normalized','Position',[0.1 0.2 0.8 0.6]);
plot(all_time, all_T_msst, 'b-', 'LineWidth',1.2);
hold on;
plot(all_time, all_T_sst, 'r--', 'LineWidth',1.2);
title(sprintf('索力识别对比 (%s)\\fontsize{10}\\color{gray}[数据分段: 0-100s, 100-200s, 200-300s]', selected_cable),...
'Interpreter','tex');
xlabel('时间 (s)');
ylabel('索力 (kN)');
legend('MSST识别结果', 'SST识别结果', 'Location','best');
grid on;
set(gca, 'FontSize',12, 'FontName','Times New Roman', 'LineWidth',1.2);
% 添加分段标记
yl = ylim;
for seg = 1:num_segments
xline(seg*100, '--', {sprintf('段%d', seg)},...
'Color',[0.5 0.5 0.5], 'LineWidth',0.8,...
'FontSize',10, 'LabelOrientation','horizontal');
end
xlim([0 300]);
此代码运行不了,显示
内存不足。
出错 IMSST_Z (第 45 行)
tfr(indices,icol)=rSig.*conj(h(Lh+1+tau));
出错 nz14 (第 42 行)
[Ts_msst] = IMSST_Z(current_Sig,300, 10);
相关文档
>> 但是分段处理可以运行,但是希望可以一次运行30000个点该怎么办