CCM-ESPRIT,L型阵列二维角度配对算法

论文:

贴代码

%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


猜你喜欢

转载自blog.csdn.net/weixin_38452468/article/details/73613840