Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

DoA using MUSIC and Uniform Circular Array

891 views
Skip to first unread message

Chintan

unread,
Nov 10, 2010, 5:40:11 AM11/10/10
to
Hi All

The problem that I am facing is as below:

In a DoA estimation problem, the key point is to implement the steering vector. I have implemented MUSIC algorithm for ULA and it seems to work fine i.e. the performance becomes better with increase in SNR and resolution increases with increase in elements. Basically,in the case of ULA-MUSIC, we have to search for power in each azimuth angle's direction and select the one with maximum.

And same for UCA-MUSIC, but now for a given elevation angle, we have to search for all azimuth angles. Is this correct?

However, the problem that I have is UCA-MUSIC fails when I add noise even at very high SNR but I get exact results for noise-less case.

Chintan

unread,
Nov 10, 2010, 5:57:05 AM11/10/10
to
"Chintan " <cpsh...@gmail.com> wrote in message <ibdsqb$s3e$1...@fred.mathworks.com>...

%%%%%%%%%%%

%%Here is a Matlab code that I have written so far..

clear all;
close all;
clc;

tic;

r=1; % Radius (m)
N=16; % Number of Elements
d=2*r*sin(pi/N); % Inter element spacing

s=1; % Number of source signals

noise_var=0;

gamma=2*pi/N*(0:N-1); % Angle between two sensors (wrt origin and ref sensor)

fc=30e3; % Carrier frequency
c=3e8; % Speed of light (m/s)
lambda=c/fc; % wavelength

a_theta=35; % Elevation Angle [0 90]
a_phi=50; % Azimuth angle [0 2pi)

zeta=2*pi/lambda*r*sin(a_theta*pi/180);
A=exp(1i*zeta*cos((a_phi-gamma)*pi/180)).'; % Steering vector

samples=100;
t=(0:samples-1)/1000; % Time

S=sin(2*pi*fc*t);

X=A*S; % Received Signal

noise=sqrt(noise_var/2)*(randn(size(X))+1i*randn(size(X))); % Uncorrelated noise

X=X+noise;

R=X*X'/samples;

[Q,D]=eig(R); % Compute eigendecomposition of covariance matrix
[D,I]=sort(diag(D),1,'descend'); % Find s largest eigenvalues
Q=Q(:,I); % Sort the eigenvectors to put signal eigenvectors first
Qs=Q(:,1:s); % Get the signal eigenvectors
Qn=Q(:,s+1:N); % Get the noise eigenvectors

theta=0:90;
phi=0:1:359;

p_MUSIC=zeros(length(theta),length(phi));

for ii=1:length(theta)
for iii=1:length(phi)
zeta=2*pi/lambda*r*sin(theta(ii)*pi/180);
A=exp(1i*zeta*cos((phi(iii)-gamma)*pi/180)).'; % Steering vector
p_MUSIC(ii,iii)=(1/(A'*(Qn*Qn')*A));
% p_MUSIC(ii,iii)=(1/norm(A'*Qn));
end
end

mesh(phi,theta,abs(p_MUSIC))
grid on;xlabel('\phi');ylabel('\theta');zlabel('PMUSIC');title('UCA MUSIC');


toc;

Paolo Rossi

unread,
Jul 2, 2011, 7:02:09 AM7/2/11
to
"Chintan " <cpsh...@gmail.com> wrote in message <ibdtq1$1v6$1...@fred.mathworks.com>...

----------------------------
Hi my name is Paolo
your program is very nice, i have a problem....i must write a program that calculate DoA of wideband (20Khz - 40Khz) of a random noise, i use UCA array and Capon beamforming....i write below my m files, i think there is something that not work properly, how can i resolve my problems?

%------------ Uniform Circular Array - Algoritmo CAPON --------------------

clear all
close all


%------------ Parametri e geometria del sistema ---------------------------

r = 0.30; % Raggio della piattaforma (m)
M = 40; % Numero di idrofoni
c = 1500; % Velocità del suono nell'acqua (m/s)
gamma = 2*pi/M*(0:M-1); % Angolo tra due idrofoni

azimuth = 45; % Angolo di arrivo in azimuth (gradi)

t = 0.1; % Intervallo temporale di osservazione (sec)
Tcamp = 1/12000; % Intervallo di campionamento
N = round(t/Tcamp); % Numero di campioni prelevati

f = 0:1/(10*N*Tcamp):(1/Tcamp)/10 -1/(10*N*Tcamp); %Frequenze

%----------------- Generazione del segnale + rumore -----------------------

% Genero il segnale utile, lo spettro di frequenza che ricevo lo filtro in
% modo da analzzare solamente le frequenze da 20Khz a 40Khz.

s = wgn(1,N,0);
S = fft(s);

H = [zeros(1,500) ones(1,500) zeros(1,200)];
SF = S.*H;
sf = ifft(SF);

%-------------------- Applicazione CAPON ----------------------------------

SSF = zeros(1,length(f));

phi = 0:1:359;

for k = 1:length(f)

SSF(k) = SF(k); %Filtraggio
ssf = ifft(SSF);
a = exp(1i*2*pi*f(k)/c*r*cos((azimuth-gamma)*pi/180)).';
x = a*sf;

IR = inv(x*x'/M);

for kk = 1:length(phi)

a = exp(1i*2*pi/c*f(k)*r*cos((phi(kk)-gamma)*pi/180)).';
CAPON(k,kk) = 1/real(a'*IR*a);
end
end

mesh(phi,0:length(f)-1,abs(CAPON))
grid on;
xlabel('Azimuth (Degree)');
ylabel('Frequenza (Hz)');
zlabel('Algoritmo Capon');
title('CAPON');

Richard

unread,
Nov 16, 2012, 1:44:18 PM11/16/12
to
"Chintan " <cpsh...@gmail.com> wrote in message <ibdtq1$1v6$1...@fred.mathworks.com>...
Hi there,

I've been working on the same algorithm, but for an irregular circular array (I'm assuming the underlying algorithm should be the same, just the steering vector should accept multiple values for element radius), and I cannot see where your implementation is incorrect - did you ever get it working?

Cheers,

Richard
0 new messages