Singular Value Decomposition (SVD) is a powerful method to extract major components from a matrix of data. It will decompose a signal into major components and help you to extract the key issue that matters.

Principle of SVD

Suppose we have a signal array matrix as: Mn,mM_{n,m}, where n is time dimension, m is space dimension. After SVD to this signal matrix, it will be decomposed as the matrix product of three matrix as:

Mn,m=Un,nSn,mVm,mT M_{n,m} = U_{n,n}S_{n,m}V_{m,m}^T

Where Un,nU_{n,n} is time eigen vector, Vm,mV_{m,m} is space eigen vector. The surffix T stand for matrix transposition. Sn,mS_{n,m} is the matrix containing the eigenvalues. In python and matlab, the singular values and related singular matrices are arranged by their values from big to small. To examine the time and space property of a certain singular value λi\lambda_i, we can pick up the ithi^{th} component in the eigen time and space vector. Then we perform a Fourier time transformation to the eigen time vector and get the frequency spectrum of the related singular value. If we plot the space eigen vector in the polar coordinate, we can get the space mode structure of the related singular value. The detailed code to calculated these transformation has been uploaded on Github (https://github.com/DocNan/Python_libs/). The code to conduct the SVD analysis can be called as: Python_libs.SVD_analysis().

Problem with Equal Singular Values?

When I use singular value decomposition for the test data, what puzzles me is that for a rotating signal matrix, it will be decomposed as two static component after SVD. The example signal matrix is generate like this:

Singular Values{width=350px}

1
2
3
4
5
Mode1: A1=10, f1=300 Hz, n1=3
Mode2: A2=5, f2=800 Hz, n2=0
Mode3: A3=3, f3=500 Hz, n3=2
Sig(t) = A1*cos(2*pi*f1*t + n1*2*pi*(i-1)/N) + A2*cos(2*pi*f2*t + n2*2*pi*(i-1)/N) + A3*cos(2*pi*f3*t + n3*2*pi*(i-1/N)) + noise(t)
N = 35 is number of artificial probes, i is the index of probe in loop calculation.

1st, 2nd and 3rd components, frequency and structure{width=600px
This problem is actually can be explained as the decomposition of circular polarized rotation wave.

Decomposition of Circular Polarized Light

To understand the decomposition of the circular polarized light, we can do this inversely by composing two linearly polarized light to a circular polarized light. Suppose the two polarized lights are:

Y1=cos(ωt)exY2=cos(ωt+ϕ)ey\begin{array}{l} Y_1 = cos(\omega t)\vec{e_x}\\ Y_2 = cos(\omega t + \phi)\vec{e_y}\\ \end{array}

Then the coupled wave will be: Y=Y1+Y2Y = Y_1 + Y_2, which is equal to the parameter equation:

x=cos(ωt)y=cos(ωt+ϕ)\begin{array}{l} x = cos(\omega t)\\ y = cos(\omega t + \phi) \end{array}

Start from the expression of y, we have:

y=cos(ωt+ϕ)=cos(ωt)cos(ϕ)sin(ωt)sin(ϕ)sin(ωt)sin(ϕ)=cos(ωt)cos(ϕ)ysin2(ωt)sin2(ϕ)=cos2(ωt)cos2(ϕ)2cos(ωt)cos(ϕ)y+y2\begin{array}{l} y = cos(\omega t + \phi) = cos(\omega t)cos(\phi) - sin(\omega t)sin(\phi)\\ \Rightarrow sin(\omega t)sin(\phi) = cos(\omega t)cos(\phi) - y\\ \Rightarrow sin^2(\omega t) sin^2(\phi) = cos^2(\omega t)cos^2(\phi) - 2cos(\omega t)cos(\phi)y + y^2 \end{array}

Consider the fact that x=cos(ωt)x = cos(\omega t), then the whole equation becomes:

x22cos(ϕ)xy+y2sin2(ϕ)=0x^2 -2cos(\phi)xy + y^2 -sin^2(\phi)=0

With Δ=(2cos(ϕ))24<0\Delta = (-2cos(\phi))^2 - 4 < 0, where ϕkϕ\phi\neq k\phi, the whole equation will be an normal equation of an ellipse. Then if we look inversely, we can decompose a circular rotation to two orthogonal linearly polarized light. That is the reason why we have decomposed the artificial travel/rotating wave into two static linear polarized harmonics.

Formation of the traveling/rotation wave/mode

So to reconstruct the traveling wave, we just need to combine the two equal singular values related harmonics together. For the above simulation, we can get:

Combination of 1st and 2nd singular components{width=300px}

From this figure we can see the rotational wave is well reconstructed with the combination of 1st and 2nd equal singular value related components. See the shift of phase shift change with time, which represent mode rotation.

The related open source python SVD code has been upload on Github at:

https://github.com/DocNan/Python_libs

Welcome to visit!

And thanks for the helpful discussion on this problem on ResearchGate with Ronald Kessel and Francesco Barone.

Page link to ResearchGate Discussion on SVD