DSPRelated.com
Forums

DOA estimation using SVD algorithm in Matlab

Started by raffaellobonvino June 28, 2009
Hi all. I'm a student from Italy. I'm working on a project for an exam at the university. As a matter of fact I'm trying to realize the DOA in Matlab for a linear antennas array trough the SVD algorithm. The first columns of the V matrix will be the steering vector while the zeros showed by the other column will realize the DOA. So this is the scenario: there is a linear array capturing two signals at the same frequency interfering each other, but arriving with two different angles (respect the local normal in the plane of the array) so ,in the hypothesis of far field and of narrow band signals (complex sinusoids) every signal is captured by every antenna with a different phase from the previous one so the signals are spatially incorrelated, but correlated in time. The SVD works well in recognizing one single signal or two or many with different frequencies, but doesn't recognize two signals with the same frequency. Here you are a piece of my code:

close all
clear
c= 3e8; % m/s velocitdel segnale nel vuoto
fc = 1; % freqenza di campionamento
A = 1;
freq = .25;
freq2= .25;
fi = 0; %sfasamento iniziale
t=0:1e4-1;

sigma = input('SNR [dB] -> ');
sigma = A/sqrt(2)*10^(-sigma/20); %Modificata da noi

%
% Simulazione delle uscite dei sensori
%
N = input('Numero di sensori -> ');
ti1 = input('Angolo di incidenza del fronte d''onda [deg] -> ');
ti2 = input('Angolo di incidenza del fronte d''onda interferente [deg] -> ');
D = c/(2*freq);

theta1 = pi/180*ti1;
theta2 = pi/180*ti2;

for i=1:N
ritardi1(i) = (i-1) * D * sin(theta1)/c;
ritardi2(i) = (i-1) * D * sin(theta2)/c;

% fasi(i) = (i-1) * D * sin(theta)/ lambda * freq;
%
%
xxx1 = zeros(size(t));
xxx2 = zeros(size(t));

xxx1 = A.*exp(j*(2*pi*freq*(t - ritardi1(i))));
xxx2 = A.*exp(j*(2*pi*freq2*(t - ritardi2(i))));

x(i,:) = xxx1+xxx2;
n(i,:) = sigma * (randn(2*size(t)) + j*randn(2*size(t)));
end
s = x + n;

% figure(1)
% subplot(3,1,1)
% plot(t,real(s'))
% title('Received signals')
% subplot(3,1,2)
% plot(20*log10(abs(fft(s.'))))
% title('Spectra of the received signals')
% subplot(3,1,3)
% mesh(real(s'))
% title('Received signals')
%
% SVD per la stima dell'angolo di incidenza
%
sss = s(:,1:100).'; %Riduzione del tempo di osservazione per messaggio out of memory e trasposizione
%perchin svd il numero di colonne deve essere < del
%numero di righe
[U,S,V] = svd(sss);
U = U(:,1:N); % Segnali normalizzati
S = S(1:N,1:N); % potenza nei segnali estratti
V; % coefficienti dei "filtri spaziali" usati nell'estrazione dei segnali

figure(2)
title('Valori singolari')
plot(1:N,diag(S),'*')

Does someone can help me? Do the SVD is useful for DOA in this case or have I to find another way? Thanks in advance.