def _process(self, X):
"""
Perform TOPS for a given frame in order to estimate steered response
spectrum.
"""
# need more than 1 frequency band
if self.num_freq < 2:
raise ValueError('Need more than one frequency band!')
# select reference frequency
max_bin = np.argmax(np.sum(np.sum(abs(X[:,self.freq_bins,:]),axis=0),
axis=1))
f0 = self.freq_bins[max_bin]
freq = list(self.freq_bins)
freq.remove(f0)
# compute empirical cross correlation matrices
C_hat = self._compute_correlation_matrices(X)
# compute signal and noise subspace for each frequency band
F = np.zeros((self.num_freq,self.M,self.num_src), dtype='complex64')
W = np.zeros((self.num_freq,self.M,self.M-self.num_src),
dtype='complex64')
for k in range(self.num_freq):
# subspace decomposition
F[k,:,:], W[k,:,:], ws, wn = \
self._subspace_decomposition(C_hat[k,:,:])
# create transformation matrix
f = 1.0/self.nfft/self.c*1j*2*np.pi*self.fs*(np.linspace(0,self.nfft/2,
self.nfft/2+1)-f0)
Phi = np.zeros((len(f),self.M,self.num_loc), dtype='complex64')
for n in range(self.num_loc):
p_s = self.loc[:,n]
proj = np.dot(p_s,self.L)
for m in range(self.M):
Phi[:,m,n] = np.exp(f*proj[m])
# determine direction using rank test
for n in range(self.num_loc):
# form D matrix
D = np.zeros((self.num_src,(self.M-self.num_src)*(self.num_freq-1)),
dtype='complex64')
for k in range(self.num_freq-1):
Uk = np.conjugate(np.dot(np.diag(Phi[k,:,n]),
F[max_bin,:,:])).T
# F[max_bin,:,:])).T
idx = range(k*(self.M-self.num_src),(k+1)*(self.M-self.num_src))
D[:,idx] = np.dot(Uk,W[k,:,:])
#u,s,v = np.linalg.svd(D)
s = linalg.svdvals(D) # FASTER!!!
self.P[n] = 1.0/s[-1]
评论列表
文章目录