贴代码
%2017.6.21
%L型阵列配对
%Pair-matching method for estimating 2d angle of arrival with a cross
%correlation matrix
clc
close all;
clear all
Mx=10; %x轴阵元数
Mz=10; %z轴阵元数
d_lamda=1/2; %阵元间距
K=4; %信号数
phix=[45,52,120,150]; %x轴方位角
thetaz=[15,25,65,88]; %z轴俯仰角
fc=[200*10^6,300*10^6,500*10^6,400*10^6]; %信号频率
fs=1000*10^6; %采样频率
L=1000; %快拍数
snr=20; %信噪比
for k=1:L
S(:,k)=sqrt(10.^(snr/10))*randn(1)*exp(1j*2*pi*fc'/fs*(k-1));
end
for kk=1:K
A1x(:,kk)=exp(-1j*2*pi*[0:Mx-1]'*d_lamda*cos(phix(kk)/180*pi));
A1z(:,kk)=exp(-1j*2*pi*[0:Mz-1]'*d_lamda*cos(thetaz(kk)/180*pi)); %1维导向矢量
end
%用ESPRIT算法求Z轴角度
ZZ=A1z*S+wgn(Mz,L,0,'dBm','complex'); %z轴接收到的信号
XX=A1x*S+wgn(Mz,L,0,'dBm','complex'); %x轴接收到的信号
Z1=ZZ(1:Mz-1,:); %Z子阵1接受的数据矢量
Z2=ZZ(2:Mz,:); %Z子阵2接受的数据矢量
X1=XX(1:Mx-1,:); %x子阵1接受的数据矢量
X2=XX(2:Mx,:); %x子阵2接受的数据矢量
Z=[Z1;Z2]; %对两个子阵的模型进行合并
X=[X1;X2];
Rz=Z*Z'/L;
Rx=X*X'/L;
[Uz,Sz,Vz]=svd(Rz); %对Rz,Rx进行奇异值分解
[Ux,Sx,Vx]=svd(Rx);
Rz=Rz-Sz(2*(Mz-1),2*(Mz-1))*eye(2*(Mz-1)); %去噪
Rx=Rx-Sx(2*(Mx-1),2*(Mx-1))*eye(2*(Mx-1));
[Uz1,Sz1,Vz1]=svd(Rz);
Uzs=Uz1(:,1:K);
Uzs1=Uzs(1:Mz-1,:);
Uzs2=Uzs(Mz:2*(Mz-1),:);
Mzz=pinv(Uzs1)*Uzs2; %按照公式得到旋转不变矩阵M
[Vzm,Dzm]=eig(Mzz); %对得到的旋转不变矩阵进行特征分解
Dzm=(diag(Dzm)).';
doaz=sort(180-acos(angle(Dzm)/pi)*180/pi,'ascend');
disp('doaz');
disp(doaz); %得到z轴估计的俯仰角
[Ux1,Sx1,Vx1]=svd(Rx);
Uxs=Ux1(:,1:K);
Uxs1=Uxs(1:Mx-1,:);
Uxs2=Uxs(Mx:2*(Mx-1),:);
Mxx=pinv(Uxs1)*Uxs2;
[Vxm,Dxm]=eig(Mxx);
Dxm=(diag(Dxm)).';
doax=sort(180-acos(angle(Dxm)/pi)*180/pi,'ascend');
disp('doax');
disp(doax); %得到x轴估计的方位角
rzx=diag((ZZ*XX')/L).';
rzx1=conj(rzx);
Rcc=toeplitz(rzx,rzx1); %构造Rcc
G=Rcc(:,1:K);
H=Rcc(:,K+1:Mx);
P=pinv(G)*H; %PM算法构造传播算子
Un=[P;-eye(Mx-K)]; %噪声子空间
Gn=Un*Un';
searching_doa=0:1:180; %线阵的搜索范围为-90~90度
for i=1:length(searching_doa)
a_theta=exp(-1j*2*pi*d_lamda*[0:Mx-1]'*sin(pi*searching_doa(i)/180));
Pmusic(i)=1./abs((a_theta)'*Gn*a_theta);
end
% plot(searching_doa,20*log10(Pmusic));
[Vw,Iw]=sort(Pmusic,'descend');
Iw=sort(Iw(:,1:K));
for k=1:K
for kk=1:K
w(k,kk)=cos(doaz(k)/180*pi)-cos(doax(kk)/180*pi); %构造K^2种组合(sin(θ)-sin(φ))
end
end
w=w.';
n=numel(w);
wnew=reshape(w,1,n); %把K^2种组合变成一行
for k=1:K
for kk=1:K^2
f(k,kk)=abs((exp(1j*wnew(:,kk))-exp(1j*sin(Iw(k)/180*pi))));
end
end
for k=1:K
[Vest(k,:),Iest(k,:)]=sort(f(k,:)); %配对过程
end
Iest=Iest(1:K,1);
for k=1:K
a=rem(Iest(k),K);
if a~=0
thetaest(k)=doax(a);
b=(Iest(k)-a)/K;
phiest(k)=doaz(b+1);
else thetaest(k)=doax(K);
phiest(k)=doaz(K);
end
end
disp('(俯仰角,方位角)');
for k=1:K
disp([num2str(phiest(k)) ',' num2str(thetaest(k))]);
end