奇异谱分析

步骤一:建立轨迹矩阵

原始信号长度为N,滑动窗口长度为Lp,Kp = N-Lp+1;轨迹矩阵就是按照列做分割,第一列为索引为1~Lp的信号,第二列为2~Lp+1,第三列为3~Lp+2,第Kp列为信号索引为Kp~N。

 

轨迹矩阵:

 

步骤二:奇异值分解

1) 计算XXT的特征值和特征向量U

2)  计算左奇异向量U和右奇异向量V,

 

。求V的时候可以不用除lambda,因为重构信号的时候又乘上lambda。

 

步骤三:分组

分组的目的就是将目标信号成份和其他信号成份分开,在信号处理领域,通常认为前面r个较大的奇异值反应信号的主要能量。

步骤四:对角重构信号平均化

根据分组结果将对应的奇异向量重构:

i为选择的r个奇异向量。

对角平均化分为三部完成,对应于下面表格的三部分。

若:奇异矩阵是rca,Lp*Kp,其中Lp<Kp,重构信号为y,长度为N

第一部分:浅蓝色部分,1~Lp-1

y(1) = rca(1,1);

y(2) = (rca(1,2)+rca(2,1))/2;

y(3) = (rca(1,3)+rca(2,2)+rca(3,1))/3;

y(Lp-1) = (rca(1,Lp-1)+rca(2,Lp-2)+…+rca(Lp-1,1))/(Lp-1);

第二部分:橙色部分,Lp~Kp

y(Lp) = (rca(1,Lp)+rca(2,Lp-1)+…+rca(Lp,1))/Lp;

y(Lp+1) = (rca(1,Lp+1)+rca(2,Lp)+rca(3,Lp-1)…+rca(Lp,2))/Lp;

y(Kp) = (rca(1,Kp)+rca(2,Kp-1)+rca(3,Kp-2)+…+rca(Lp,Kp-Lp+1))/Lp;

第三部分:绿色部分,Kp+1~N

y(Kp+1) = (rca(2,Kp)+rca(3,Kp-1)+rca(4,Kp-2)+…+rca(Lp, Kp-Lp+2))/(Lp-1);

y(Kp+2) = (rca(3,Kp)+rca(4,Kp-1)+…+rca(Lp,Kp-Lp+3))/(Lp-2)

y(N-1) = (rca(Lp-1,Kp)+rca(Lp,Kp-1))/(Lp-(Lp-1)+1);

y(N) = rca(Lp,Kp);

function [signalFiltered]=SSA(signal,windowLen)
%========================================================================
% 参看http://www.ilovematlab.cn/thread-301868-1-1.html柳絮艳的分享代码ssa改写
% signal 原始信号
% windowLen 窗口长度
% signalFiltered   重构时间序列
%=========================================================================
% Step1 : 建立轨迹矩阵
N=length(signal);
if windowLen>N/2;
    windowLen=N-windowLen;
end
K=N-windowLen+1;
X=zeros(windowLen,K);
for i=1:K
    X(1:windowLen,i)=signal(i:windowLen+i-1);
end
% Step 2: 奇异值分解
S=X*X';
[U,autoval]=eig(S);%eig返回矩阵的特征值和特征向量,U是特征向量,autoval是特征值
[d,i]=sort(diag(autoval),'descend');
sev=sum(d); %特征值的和,可根据占比选择有效信号
U=U(:,i);
V=(X')*U;
% Step 3:分组
I=[1:windowLen/2];%I的选择可根据信号特征选择
Vt=V';
rca=U(:,I)*Vt(I,:);
% Step 4: 对交平均化重构信号
y=zeros(N,1);
Lp=min(windowLen,K);
Kp=max(windowLen,K);
%重构 1~Lp-1
for k=0:Lp-2
    for m=1:k+1;
        y(k+1)=y(k+1)+(1/(k+1))*rca(m,k-m+2);
    end
end
%重构 Lp~Kp
for k=Lp-1:Kp-1
    for m=1:Lp;
        y(k+1)=y(k+1)+(1/(Lp))*rca(m,k-m+2);
    end
end
%重构 Kp+1~N
for k=Kp:N-1
    for m=k-Kp+2:N-Kp+1;
        y(k+1)=y(k+1)+(1/(N-k))*rca(m,k-m+2);
    end
end
 
signalFiltered = y;
end

 

  • 10
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
奇异谱分析(SSA)是一种常用于时间序列分析的方法,它能够将时间序列分解成多个成分,从而揭示出序列中的结构和特征。在Python中,可以使用NumPy和SciPy库来实现奇异谱分析。 首先,你需要安装NumPy和SciPy库。你可以使用以下命令来安装它们: ``` pip install numpy pip install scipy ``` 接下来,你可以按照以下步骤进行奇异谱分析的实施: 1. 导入所需的库: ```python import numpy as np import scipy.linalg as la ``` 2. 定义奇异谱分析的主要函数: ```python def ssa(X, window_size, embedding_dimension): n = len(X) K = n - window_size + 1 L = n - embedding_dimension + 1 # 构造轨迹矩阵 X_traj = np.column_stack([X[i:i+embedding_dimension for i in range(L)]) # 计算奇异值分解 U, S, V = la.svd(X_traj) # 构造重构矩阵 X_reconstructed = np.dot(U[:, :K], np.dot(np.diag(S[:K]), V[:K, :])) # 计算奇异谱 singular_spectrum = np.square(S) / (L - 1) return X_reconstructed, singular_spectrum ``` 3. 使用上述函数进行奇异谱分析: ```python # 准备时间序列数据 X = np.array([1, 4, 3, 6, 8, 9, 11, 14, 13, 10]) # 指定窗口大小和嵌入维度 window_size = 4 embedding_dimension = 3 # 进行奇异谱分析 reconstructed, spectrum = ssa(X, window_size, embedding_dimension) # 打印重构结果和奇异谱 print("Reconstructed series:", reconstructed) print("Singular spectrum:", spectrum) ``` 这样,你就可以得到重构后的时间序列和奇异谱。你可以根据奇异谱来观察序列中的结构和特征。请注意,这只是奇异谱分析的简单示例,你可以根据具体需求进行更复杂的操作和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值