function [WT_list,BFH_list,WT_value,si_std,label] = GKSB0104(signal,len) %输入进来的信号进行工况识别,判断是否为稳态数据 %signal:输入的工况数据 %len:每段窗长度 %WT_list:稳态数据点 %BFH_list:变负荷数据点 %WT_value:稳态数据时间段平均输出功率 %si_std:每段滑窗的std数值 %label:数据标签向量 N=length(signal); step=floor(len); %步长 overlap=len-step;%重叠样本数 nums=floor((N-overlap)/step); %滑窗次数 WT_list=[];%稳态数据,第一列是数据点位置,第二列是幅值 BFH_list=[];%非稳态数据 WT_value=[];%存放每一段稳态滑窗对应的平均输出功率 WY_nums=0; BFH_nums=0; for i=1:nums si=signal((i-1)*step+1 : (i-1)*step+len); si_std(i)=std(si-mean(si)); if si_std(i)>1 %误差的std大于1说明处于变负荷阶段 %判断变负荷阶段具体突变位置 diff_si=abs(diff(si)); for j=1:length(diff_si) if diff_si(j)<1 WY_nums=WY_nums+1; WT_list(WY_nums,1)=(i-1)*step+j; %保存数据点位置 label((i-1)*step+j)=1;%稳态数据点打标签 WT_list(WY_nums,2)=si(j); %保存数据点数值 WT_value(i)=mean(si(1:j)); else BFH_nums=BFH_nums+1; BFH_list(BFH_nums,1)=(i-1)*step+j; %保存数据点位置 label((i-1)*step+j)=0;%非稳态数据点打标签 BFH_list(BFH_nums,2)=si(j); %保存数据点数值 end end else %误差的std小于1(滑窗全是稳态点) WT_list((WY_nums+1:WY_nums+len),1)=(i-1)*step+1 : (i-1)*step+len; %保存数据点位置 label((i-1)*step+1 : (i-1)*step+len)=1;%稳态数据点打标签 WT_list((WY_nums+1:WY_nums+len),2)=si; %保存数据点数值 WY_nums=WY_nums+len; WT_value(i)=mean(si); %添加判断条件,查看是否下一截窗内数据升高或降低 if i~=nums s1=si; s2=signal(i*step+1 : i*step+len); mean1=mean(s1); mean2=mean(s2); end if abs(s1-s2)>0.2*abs(mean1) BFH_nums=BFH_nums+1; BFH_list(BFH_nums,1)=(i-1)*step+len; %保存数据点位置 label((i-1)*step+len)=0;%非稳态数据点打标签 BFH_list(BFH_nums,2)=si(end); %保存数据点数值 end end end xt=(1:length(signal))/60/60; figure; subplot(121); plot(xt,signal);title('工况数据变化曲线');xlabel('time/h');ylabel('有功功率'); subplot(122); plot(xt,signal); hold on; scatter(BFH_list(:,1)/60/60,BFH_list(:,2),'*');ylabel('有功功率'); title('变工况检测结果');xlabel('time/h'); hold off; % figure; % plot(signal); % hold on; % scatter(WT_list(:,1),WT_list(:,2),'*');ylabel('有功功率'); % title('稳态检测结果');xlabel('time/h'); end