Direction of arrival estimation of multiple signals using Capon (MVDR) beamformer

66 views (last 30 days)
Hello everyone. I am trying to write a script for comparing two beamforming methods of estimating direction-of-arrval: conventional (Bartlett) beamformer and MVDR (Capon) beamformer. Everything works fine when there is only one signal arriving to the antenna array. But, when I add another signal from different direction, Capon BF returns incorrect spatial power spectrum. Two peaks in this spectrum are always about 2.5 dB above the floor level (regardless of signal to noise ratio). When I change SNR, whole spectrum is shifted up or down but peak-to-floor ratio remains the same. On the other hand, conventional beamformer works fine both for one and two arriving signals. I was struggling with the code but without effect. Do you know how to obtain proper spatial power spectrum for Capon BF in case of two or more signals received? Best regards. Here is my script:
clear all; close all;
fs = 10e6; %sampling frequency
ts = 1/fs;
T = 0.0001; %signal duration
t = 0:ts:T-ts;
Ns = length(t); %number of samples
fc = 1e6; %carrier freqiency
lambda = 3*10^8/fc; %wavelength
M = 10;%number of antenna elements in Unliform Linear Array
d = 0.5*lambda;%distance between neigbouring antennas
%------------------------------------------------------------------
s1 = exp(1i*2*pi*fc*t); %signal arriving to the array phase center (first antenna)
%SINGLE ARRIVING SIGNAL - WORKS FINE BOTH FOR CONVENTIONAL AND CAPON
%BEAMFORMERS
%teta = [40]/180*pi; %direction of arrival in degrees
%TWO ARRIVING SIGNALS - CONVENTIONAL BF - OK, CAPON BF - INVALID SPECTRUM!!!
teta = [0, 40]/180*pi; %directions of arrivals in degrees
amp = [1 1];% amplitudes of signals
delta_fi = -2*pi*d/lambda*sin(teta); %relative phase delay between signals received through neogbouring elements
for m=1:M;
aU(:,m) = exp(1i*((m-1)*delta_fi)); %steering vector
end
x = zeros(M,Ns);
for k=1:length(teta);
x = x + amp(k)*aU(k,:).'*s1*exp(1i*randn()); %data at the outputs of antenna elements
end
SNR = 10; %signal-to-noise ratio in decibels
sz = (2^(-0.5))*sqrt(10^(-SNR/10))*(randn(M,Ns)+1i*randn(M,Ns)); %complex Gaussian noise
Px = var(aU(k,1).'*s1*exp(1i*randn())); %power of signal
x = x + sz; %adding noise
Psz = var(sz(1,:)); %noise variance
Rxx = x*x'/Ns; %data covariance matrix
SNR_true = 10*log10(Px/Psz) %true SNR in dB
iRxx = inv(Rxx); %inverse of covariance matrix
teta_v = -pi/2:pi/180:pi/2; %range of scanned directions in radians
teta_v_deg = teta_v/pi*180; %same as above but in degrees
Nteta = length(teta_v); %number of scanned directions
for k=1:Nteta; %scanning loop
%k
teta = teta_v(k); %current scannig direction
delta_fi = -2*pi*d/lambda*sin(teta); %relateive phase delay
for m=1:M;
aT(m) = exp(1i*((m-1)*delta_fi)); %steering vector
end
a=aT.'; %transpose of steering vector
wbf = a; %weight vector for conventional beamforming
Pbf(k) = wbf'*Rxx*wbf; %spatial power spectrum of conventional beamformer
wMVDR = (iRxx*a)/(a'*iRxx*a); %weight vector for Caponbeamforming
PMVDR(k) = wMVDR'*Rxx*wMVDR/1; %spatial power spectrum of Capon beamformer
end
Pbf_dB = 10*log10(Pbf); %spectrum in log scale
PMVDR_dB = 10*log10(PMVDR);
figure
plot(teta_v_deg, Pbf_dB,'k','LineWidth',2);
axis([-90 90 0 20*log10(M)+5])
xlabel('\theta [\circ]');
ylabel('P(\theta)','rotation',0);
figure
plot(teta_v_deg, PMVDR_dB,'k','LineWidth',2);
xlabel('\theta [\circ]');
ylabel('P(\theta)','rotation',0);

Accepted Answer

Honglei Chen
Honglei Chen on 8 Aug 2016
I would replace your signal definition with the following
x = x + amp(k)*aU(k,:).'*exp(1i*randn(size(t)));
HTH

More Answers (3)

Shirleyuue Jiang
Shirleyuue Jiang on 28 Aug 2019
I will replace your signal definition with the following
x = x + amp(k)*aU(k,:).'*s1;

Reeha Syed
Reeha Syed on 22 Apr 2021
Edited: Reeha Syed on 22 Apr 2021
I have observed the MUSIC algorithm for 1d and 2d DOA estimations and now want to know the their beamforming patterns for which do I have to write a seperate code for that?
  2 Comments
Sadiq Akbar
Sadiq Akbar on 19 May 2021
Dear Reeha Syed, I was searching MUSIC algorithm for 1d and 2d DOA estimations and came to this page. Can you share the code of MUSIC algorithm for 1d and 2d DOA here. Regards

Sign in to comment.


Tony Azar
Tony Azar on 1 Jun 2022
Please see example "Conventional and Adaptive Beamformers" at:
This example compares Conventional to Adaptive (MVDR & LCMV) Beamformers.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!