赞
踩
奇异谱分析算法(SSA)的基本原理为:先将一维信号拆解成二维的轨迹矩阵,然后对轨迹矩阵做奇异值分解并按需选取最重要的前几维特征向量计算重构矩阵,最终利用重构矩阵重构信号,得到去噪后的一维信号。算法典型应用场景:模态分析(每个特征向量逐一重构即可将信号分解成多个独立的模态,即model)、去噪(如选取前6个特征向量进行重构)。
先看下算法效果, 对长度160的信号进行SSA去燥,window_size设置为90,使用前6个特征向量进行重构,去噪效果如下图所示:
//函数参数:input_data输入信号,window_size为构建轨迹矩阵的窗长,eigen_num为重构信号使用的特征向量数量
float[] SSA(float[] input_data, int window_size, int eigen_num){ //构建轨迹矩阵 int N=input_data.length; if(window_size>N/2){ window_size = N-window_size; } int K=N-window_size+1; Jama.Matrix X=new Jama.Matrix(window_size, K); for(int i=0;i<K;i++){ for(int j=0;j<window_size;j++){ X.set(j,i,(double)input_data[j+i]); } } //奇异值分解 Jama.Matrix S = X.times(X.transpose()); SingularValueDecomposition svd=S.svd(); Jama.Matrix U = svd.getU(); Jama.Matrix V = (X.transpose()).times(U); //以指定的特征值数量计算重构矩阵rca Jama.Matrix temp_U=new Jama.Matrix(U.getRowDimension(), eigen_num); for(int i=0;i<U.getRowDimension();i++){ for(int j=0;j<eigen_num;j++){ temp_U.set(i,j,U.get(i,j)); } } Jama.Matrix Vt=V.transpose(); Jama.Matrix temp_V=new Jama.Matrix(eigen_num, Vt.getColumnDimension()); for(int i=0;i<eigen_num;i++){ for(int j=0;j<Vt.getColumnDimension();j++){ temp_V.set(i,j,Vt.get(i,j)); } } Jama.Matrix rca=temp_U.times(temp_V); System.out.println("rca.m="+Integer.toString(rca.getRowDimension())+" ,rca.n="+Integer.toString(rca.getColumnDimension())); //重构信号 Jama.Matrix y=new Jama.Matrix(N,1); y.set(0,0,input_data[0]); int Lp=Math.min(window_size,K); int Kp=Math.max(window_size,K); System.out.println("Lp="+Integer.toString(Lp)+" ,Kp="+Integer.toString(Kp)); //1. 重构 1~Lp-1 for(int k=-1;k<Lp-2;k++){ for(int m=0;m<k+1;m++){ y.set(k+1,0,y.get(k+1,0)+rca.get(m,k-m+2)/(k+1)); } } //2. 重构 Lp~Kp for(int k=Lp-2;k<Kp-1;k++){ for(int m=0;m<Lp;m++){ y.set(k+1,0,y.get(k+1,0)+rca.get(m,k-m+1)/Lp); } } //3. 重构 Kp+1~N for(int k=Kp-1;k<N-1;k++){ for(int m=k-Kp+1;m<N-Kp+1;m++){ y.set(k+1,0,y.get(k+1,0)+rca.get(m,k-m)/(N-k)); } } //输出经奇异谱分析去燥后的信号 float[] output=new float[y.getRowDimension()]; for(int i=0;i<y.getRowDimension();i++){ output[i] = (float)y.get(i,0); } System.out.println("奇异谱分析:"+Arrays.toString(output)); return output; }
运行该代码需要用到jama的矩阵库,我用的是Jama-1.0.3.jar,下载地址:http://www.java2s.com/Code/Jar/j/Downloadjama103jar.htm
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。