An attempt to compute SVD in Python to find the most significant elements of the spectrum and create a matrix containing only the most significant parts.
In python, I have:
u,s,v = linalg.svd(Pxx, full_matrices=True)
This returns 3 matrices; where "s" contains the values corresponding to u, v.
To build a new matrix containing all the significant parts of the signal, I need to fix the highest values in "s" and match them with the columns in "u" and "v", and the resulting matrix should give me the most significant part of the data.
The problem is that I don’t know how to do this in Python, for example, how to find the highest numbers in "s" and select the columns in "u" and "v" to create a new matrix?
(I'm new to Python and numpy), so any help would be greatly appreciated
Edit:
import wave, struct, numpy as np, matplotlib.mlab as mlab, pylab as pl from scipy import linalg, mat, dot; def wavToArr(wavefile): w = wave.open(wavefile,"rb") p = w.getparams() s = w.readframes(p[3]) w.close() sd = np.fromstring(s, np.int16) return sd,p def wavToSpec(wavefile,log=False,norm=False): wavArr,wavParams = wavToArr(wavefile) print wavParams return mlab.specgram(wavArr, NFFT=256,Fs=wavParams[2],detrend=mlab.detrend_mean,window=mlab.window_hanning,noverlap=128,sides='onesided',scale_by_freq=True) wavArr,wavParams = wavToArr("wavBat1.wav") Pxx, freqs, bins = wavToSpec("wavBat1.wav") Pxx += 0.0001 U, s, Vh = linalg.svd(Pxx, full_matrices=True) assert np.allclose(Pxx, np.dot(U, np.dot(np.diag(s), Vh))) s[2:] = 0 new_a = np.dot(U, np.dot(np.diag(s), Vh)) print(new_a)