資源簡介
SAM_SSD.m
代碼片段和文件信息
function?[varargout]=?SAM_SSD(varargin)
%例?SSC=SAM_SSD(yfs);
%分解結果不包含殘余分量
%輸入:信號,采樣頻率,最大分解次數
warning?off;?%關閉警告
if?nargin==2
????y=varargin{1};
????Fs=varargin{2};
????Times=inf;
????Nstdd=1.2;
elseif?nargin==3
????y=varargin{1};
????Fs=varargin{2};
????Times=varargin{3};
????Nstdd=1.2;
elseif?nargin==4
????y=varargin{1};?%原始信號
????Fs=varargin{2};?%采樣頻率
????Times=varargin{3};?%輸出SSC的數量(默認不設置)
????Nstdd=varargin{4};?%嵌入維數權值(默認0.2)
end
%輸入:?待分解的時域信號y?信號采樣頻率??
????k1=0;
????th=0.01;?%迭代停止閾值
????y=y(:)‘;?%強制變為行向量
????L=length(y);
????y?=?y-mean(y);?%將輸入信號變為均值為0的向量,因為SSD針對的就是均值為0的向量
????if?Fs/L?<=?0.5
????????lf?=?L;
????else
????????lf?=?2*Fs;
????end
????RR1=zeros(size(y));?%初始化輸出
????orig?=?y;
????remen?=?1;??%迭代停止標準
????testcond?=?0;
????time=0;
????
????while?(remen?>?th&&time ????????time=time+1;
????????k1?=?k1+1;
????????y?=?y-mean(y);??%輸入信號均值向0逼近
????????v2=y;
????????clear?nmmt;
????????[nmmtff]?=?pwelch(v2[][]4096Fs);%求功率譜估計密度
????????[~in3]?=?max(nmmt);
????????nmmt?=?nmmt‘;
????????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
????????????[USV]?=?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(1L);
????????????[~m]?=?size(rM);
????????????for?k=-(l-1):L-(l)
????????????????r(k+l)?=?sum(diag(rMk))/m;??
????????????end
????????else?%?以后的運行中
????????????for?cont?=?1:2?%運行2次
????????????????v2?=?v2-mean(v2);
????????????????[deltaf]?=?gaussfit_SSD(ffnmmt‘);?%?高斯擬合
????????????????%?帶寬估計
????????????????[~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
????????????????[USV]?=?svd(M0);
????????????????%選擇主成分
?????????????????if?size(U2)>l
????????????????????yy?=?abs(fft(U(:1:l)lf));
????????????????else
????????????????????yy?=?abs(fft(Ulf));
????????????????end
????????????????yy_n?=?size(yy1);
????????????????ff2?=?(0:yy_n-1)*Fs/yy_n;
????????????????yy(floor(yy_n/2)+1:end:)?=?[];
????????????????ff2(floor(length(ff2)/2)+1:end)?=?[];
????????????????%?%
??????????????
評論
共有 條評論