if ((k1 == 1) && (ff(in3)/Fs < 1e-3)) % 在第一次迭代中,如果最大PDS值/采样频率<阈值(10^-3),则认为残余量具有单调趋势,将嵌入维度M设置为N/3 否则 M=1.2*FS/最大PDS值
l = floor(L/3); %l就是嵌入维数 %设定嵌入维度,可更改的地方
%下面开始重构SSC分量
%先是重构轨迹矩阵
M = zeros(L-(l-1), l);
for k=1:L-(l-1)
M(k,:) = v2(k:k+(l-1));
end
[U,S,V] = svd(M); %对M进行奇异值分解 M=U*S*V U左奇异向量 S奇异值 V右奇异向量
U(:,l+1:end) = [];
S(l+1:end,:) = [];
V(:,l+1:end) = [];
rM = rot90(U(:,1)*S(1,:)*V'); %将数组旋转90°
r = zeros(1,L);
[~,m] = size(rM);
for k=-(l-1):L-(l)
r(k+l) = sum(diag(rM,k))/m;
end
else % 以后的运行中
for cont = 1:2 %运行2次
v2 = v2-mean(v2);
[deltaf] = gaussfit_SSD(ff,nmmt'); % 高斯拟合
% 带宽估计
[~,iiii1] = min(abs(ff-(ff(in3)-deltaf)));
[~,iiii2] = min(abs(ff-(ff(in3)+deltaf)));
l = floor(Fs/ff(in3)*Nstdd); %设定嵌入维度,可更改的地方
if l <= 2
l=2;
elseif l > floor(L/3)
l = floor(L/3);
end
M=zeros(L, l);
% M built with wrap-around
for k=1:l
M(:,k)=[v2(end-k+2:end)'; v2(1:end-k+1)'];
end
[U,S,V] = svd(M,0);
%选择主成分
if size(U,2)>l
yy = abs(fft(U(:,1:l),lf));
else
yy = abs(fft(U,lf));
end
yy_n = size(yy,1);
ff2 = (0:yy_n-1)*Fs/yy_n;
yy(floor(yy_n/2)+1:end,:) = [];
ff2(floor(length(ff2)/2)+1:end) = [];
% %
if size(U,2)>l
[~,ind1] = max(yy(:,1:l));
else
[~,ind1] = max(yy);
end
ii2 = find(ff2(ind1)>ff(iiii1) & ff2(ind1));
if isempty(ii2)
rM=U(:,1)*S(1,:)*V';
else
if ii2(ii2==maxindom)
rM = U(:,ii2)*S(ii2,:)*V';
else
ii2 = [maxindom,ii2];
rM = U(:,ii2)*S(ii2,:)*V';
end
end
if cont == 2
vr = r;
end
[~,m] = size(rM);
for k=-(L-1):0
kl = k+L;
if kl >= m
r(kl) = sum(diag(rM,k))/m;
else
r(kl) = (sum(diag(rM,k))+sum(diag(rM,kl)))/m;
end
end
r = fliplr(r);
if cont == 2 && r*(y-r)'<0 % check condition for convergence
r = vr;
end
v2 = r;
end
end
RR1(k1,:) = (y*r'/(r*r'))*r;
y=y-RR1(k1,:); %残余信号
remenold = remen;
if testcond %如果达到停止条件?
remen = sum((sum(RR1(stept:end,:),1)-orig2).^2)/(sum(orig2.^2));
if k1 == stept+3
break
end
else
remen = sum((sum(RR1(1:end,:),1)-orig).^2)/(sum(orig.^2)); %残余信号与原信号之间的标准均方误差
end
% in rare cases, convergence becomes very slow; the algorithm is then
% stopped if no real improvement in decomposition is detected (this is
% something to fix in future versions of SSD)
if abs(remenold - remen)< 1e-5 %判断残余信号与原信号直接的标准均方误差,如果该值<自定义阈值th的0.01时,认为分解完成 否则将该残余信号当原信号继续分解
testcond = 1;
stept = k1+1;
orig2 = y;
end
end
if testcond
fprintf('分解完成,残余信号与原始信号的均方误差能量为: %3.1f\n %',(1-sum((sum(RR1(1:end,:),1)-orig).^2)/(sum(orig.^2)))*100);
end
%
ftemp = (0:size(RR1,2)-1)*Fs/size(RR1,2);
sprr = abs(fft(RR1'));
[~,isprr] = max(sprr);
fsprr = ftemp(isprr);
[~,iord] = sort(fsprr,'descend');
RR1 = RR1(iord,:);
SSD_Output = RR1;
if nargout>0
varargout{1}=SSD_Output;
end
if nargout>1
varargout{2}=y;
end
end
以下回答来自GPT,请参考:
这段代码是一个信号分解算法,主要使用了SSD(Singular Spectrum Decomposition)方法。以下是对代码的详细注解:
第1-3行:判断条件部分。如果k1
等于1且(ff(in3)/Fs) < 1e-3
,即最大PDS值除以采样频率小于阈值,则认为残余量具有单调趋势,并将嵌入维度M设置为N/3;否则,将M设置为1.2*FS/最大PDS值。
第5-9行:计算嵌入维度l。将信号v2
按照嵌入维数l进行重构,并进行奇异值分解,得到奇异向量U、奇异值S和右奇异向量V。
第11-20行:根据嵌入维度l计算旋转后的轨迹矩阵rM。然后根据rM中的对角线元素计算r,用于后续的信号分解。
第22-82行:进入循环,进行后续的信号分解。其中,第24行表示运行2次的循环。第26行对信号v2进行均值归零操作,并通过高斯拟合计算出deltaf。第29-31行根据deltaf计算带宽估计的范围。第33行根据Fs、ff(in3)和Nstdd来计算嵌入维度l。第35-39行根据嵌入维度l构建重构矩阵M。第42-50行进行奇异值分解,得到奇异向量U、奇异值S和右奇异向量V。第53-62行选择主成分,并计算出相应的频谱yy。第65-79行根据选择的主成分进行拼接,并计算旋转后的轨迹矩阵rM。最后通过循环和翻转操作得到信号r。
第85-97行:计算信号分解后的残余量RR1。其中,第87行表示计算投影系数,即y与r的内积除以r与r的内积乘以r。第88行表示更新残余信号y。第91-97行用于计算残余信号与原信号之间的标准均方误差。
第100-103行:检查是否达到停止条件testcond。如果达到,则输出分解完成并计算残余信号与原始信号的均方误差能量。否则,继续进行信号分解。
第106-107行:对RR1进行排序,按照fsprr降序排列。
第109-112行:输出分解结果SSD_Output。根据输出参数的个数判断是否需要返回其他额外的变量。
注:由于代码缺少一些变量的定义和初始化,因此无法完全理解其中的计算逻辑。以上只是对给定的代码进行了大致的解释。