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.
%%%%%%%%%%%
%%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;
----------------------------
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');