%------------矢量水听器 近场 远场 常规波束形成 MVDR-----0722-----
clc; clear all; close all;
%-----------信号模型--------------
M=12;
N=1024;
f0=1000;
fs=10*f0;
c=1500;
lamda=c/f0; %波长
w=2*pi*f0;
k=w/c;
d=lamda/2;
t=0:N-1;
snr=10;%信噪比
theta=30*pi/180;%入射角度
A=sqrt(2*10^(snr/10));
s=A*exp(-j*w*t/fs);
%----------远场 常规波束形成--------------
for m=1:M
Sp(m,:)=A*exp(-j*(w*t/fs+k*(m-1)*d*cos(theta)))+randn(size(t))/3;
Sx(m,:)=A*exp(-j*(w*t/fs+k*(m-1)*d*cos(theta)))*cos(theta)+randn(size(t))/3;
Sy(m,:)=A*exp(-j*(w*t/fs+k*(m-1)*d*cos(theta)))*sin(theta)+randn(size(t))/3;
end
S=[Sp.',Sx.',Sy.'];
R=cov(S);
theta1=-180:180; for i=1:length(theta1)
for m=1:M
Wp(m)=exp(-j*k*(m-1)*d*cos(theta1(i)*pi/180));
Wx(m)=exp(-j*k*(m-1)*d*cos(theta1(i)*pi/180))*cos(theta1(i)*pi/180);
Wy(m)=exp(-j*k*(m-1)*d*cos(theta1(i)*pi/180))*sin(theta1(i)*pi/180);
end
W=[Wp,Wx,Wy];
P(i)=W*R*W';
Pm(i)=1/(W*(R^-1)*W');
end
%-----------归一化-----------------
pp=max(abs(P));
P=20*log10(P/pp);
ppm=max(abs(Pm));
Pm=20*log10(Pm/ppm);
%----------------------------------
figure
plot(theta1,P);
title('远场 常规算法波束形成') xlabel('x/角度°') ylabel('y/dB') ;
%-----------------------------------
figure
plot(theta1,Pm);
title('远场 MVDR算法波束形成') xlabel('x/角度°') ylabel('y/dB')
%------------------------------------
figure
plot(theta1,P,'r-',theta1,Pm,'b:');
title('远场 常规与MVDR算法波束形成'); xlabel('x/角度°'); ylabel('y/dB'); legend('常规算法','MVDR算法');
%----------近场 波束形成--------------
x0=15; y0=20; % 目标位置x0 % 目标位置y0
for m=1:M
theta2(m,:)=atan(y0/(x0-(m-1)*d));
r(m,:)=sqrt(y0^2+((x0-(m-1)*d))^2);
SMp(m,:)=A*exp(-j*(w*t/fs+k*r(m,:)))+randn(size(t))/3;
SMx(m,:)=A*exp(-j*(w*t/fs+k*r(m,:))).*cos(theta2(m,:))+randn(size(t))/3;
SMy(m,:)=A*exp(-j*(w*t/fs+k*r(m,:))).*sin(theta2(m,:))+randn(size(t))/3;
end
SM=[SMp.',SMx.',SMy.'];
RM=cov(SM);
x=-30:0.5:30;
y=-30:0.5:30;
for xx=1:length(x)
hwait=waitbar(0,'请等待>>>>>>>>');
step=length(x)/100;
if length(x)-xx<=5
waitbar(xx/length(x),hwait,'即将完成');
pause(0.1);
else
PerStr=fix(xx/step);
str=['正在运行中',num2str(PerStr),'%'];
waitbar(xx/length(x),hwait,str);
pause(0.1);
end
close(hwait);
for yy=1:length(y)
for m=1:M
theta3=atan(y(yy)/(x(xx)-(m-1)*d));
r2=sqrt(y(yy)^2+((x(xx)-(m-1)*d))^2);
WMp(m)=exp(-j*k*r2);
WMx(m)=exp(-j*k*r2)*cos(theta3);
WMy(m)=exp(-j*k*r2)*sin(theta3);
end
WM=[WMp,WMx,WMy];
PP(xx,yy)=WM*RM*WM';
PPm(xx,yy)=1/(WM*(RM^-1)*WM');
end
end
size(xx) size(yy) size(PP)
figure
imagesc(x,y,abs(PP')) colorbar; colormap gray;
title('近场 常规算法波束形成') xlabel('x/米'); ylabel('y/米'); axis xy;
figure
imagesc(x,y,abs(PPm')) title('近场 MVDR算法波束形成') xlabel('x/米'); ylabel('y/米'); axis xy; colorbar; colormap gray;