阵列信号处理算法应用领域涉及雷达、声纳、卫星通信等众多领域,其主要目的就是对天线阵列接收到的信号进行处理,增强有用信号,抑制无用信号,以达到空域滤波的目的,最后提取回波信号中所包含的角度等信息。

DOA估计意思是波达角度估计,是指电磁波到达天线阵列的方向。

如上图所示,DOA算法的基本思想就是利用天线阵列之间的相位差进行角度的估计。对于远场信号平面波来说,回波到各个天线之间都有一个波程差,其导致了相位差。

DBF数字波束形成,又叫做空域滤波,是阵列信号处理的一个主要方向。其基本思想是通过将各个阵元输出进行加权求和,将天线波束导向在一个方向,对期望来波方向得到最大输出功率。

CAPON算法又叫最大方差无畸变算法。思想是最小化信号功率,又使得来波方向为单位增益的准测自适应波束形成。

MUSIC、ROOT-MUSIC是利用信号子空间和噪声子空间的正交性。

ESPRIT是利用信号子空间的旋转不变性。

DML是利用最大似然准测,将背景噪声和接收噪声认为成大量独立的噪声源发射的,因而把噪声过程视为一平稳高斯随机白噪声过程,信号波形则假设为确定性信号,但输入波形是待估计的位置参数。而确定性最大似然估计算法中的未知参数是信号参数和噪声方差。这些未知量都是最大化似然估计得到的。

上面这几个算法都是超分辨算法,可以克服瑞丽极限。

本文主要对 DOA算法之DBF、CAPON、MUSIC、ROOT-MUSIC、ESPRIT、DML进行性能的对比。希望通过调研仿真,熟悉各个DOA算法的特点和优缺点,加强自己在不同环境下的算法选择能力。

部分主要代码:

%%dbf

a = exp(-1i*2*pi*dd*sind(theta_scan).'*array);

DBFresult1 = 20*log10(abs(signal1(:,1).'*a.')./(max(abs(signal1(:,1).'*a.'))));

%%capon

R1 = inv(signal1*signal1'./snap); %这里需要是共轭转置

for ii = 1:length(theta_scan)

aa = exp(-1i*2*pi*dd*sind(theta_scan(ii)).*array);

caponresult1(ii) = 1/(abs(aa*R1*aa'));

end

caponresult1 = 20*log10(caponresult1./max(caponresult1));

%%MUSIC

R = signal1*signal1'/snap;

[EV,D] = eig(R); %特征值分解,D为由INVR的特征值构成的对角矩阵,EV为其特征向量构成的矩阵

EVA = diag(D)'; %抽取D的对角线元素并转置

[EVA,I] = sort(EVA); %从小到大排序,I对应EVA中元素在原来EVA中的位置。

EVA = fliplr(EVA); %对特征值再从大到小排列

EV = fliplr(EV(:,I)); %对特征值对应的特征向量进行对应的从大到小的排序

EN = EV(:,numstarget+1:arraylen); %把噪声子空间拿出来

for ii = 1:length(theta_scan)

aa = exp(1j*2*pi*dd*sind(theta_scan(ii))*array).';

MUSICresult(ii) = (aa'*aa)/(aa'*EN*EN'*aa);

end

MUSICresult = 20*log10(abs(MUSICresult)./(max(abs(MUSICresult))));

%%root-MUSIC

Unx=EN;

syms z;

pz=z.^([0:arraylen-1]');

pz1=(z^(-1)).^([0:arraylen-1]);

fz=z.^(arraylen-1)*pz1*Unx*Unx'*pz; % 构造多项式

a=sym2poly(fz); % 符号多项式->数值多项式

zx=roots(a); % 求根

rx=zx';

[as,ad]=(sort(abs((abs(rx)-1))));

DOAest=asin(sort(angle(rx(ad([1,3])))/pi))*180/pi;

%ESPRIT

[EV2,D2] = eig(R);

EVA2 = real(diag(D2)');

[EVA2,I2] = sort(EVA2);

EVA2 = fliplr(EVA2);

EV2 = fliplr(EV2(:,I2));

Exy = [EV2(1:arraylen-1,1:numstarget) EV2(2:arraylen,1:numstarget)];

E_xys = Exy'*Exy./(size(Exy'*Exy,1));

[EV3,D3] = eig(E_xys);

EVA_xys = real(diag(D3)');

[EVA_xys,I3] = sort(EVA_xys);

EVA_xys = fliplr(EVA_xys);

EV_xys = fliplr(EV3(:,I3));

Gx = EV_xys(1:numstarget,numstarget+1:numstarget*2);

Gy = EV_xys(numstarget+1:numstarget*2,numstarget+1:numstarget*2);

Psi = -Gx/Gy;

%%DML

R = signal1*signal1'/snap;

target_serched = zeros(1,numstarget);

max_trace = intmin;

aa = zeros(length(array),numstarget);

theta_scan1 = linspace(sind(-90),sind(90),1024);

for ii = 1:length(theta_scan1)

aa(:,1) = exp(1i*2*pi*dd*array.'*theta_scan1(ii));

for jj = ii+1:length(theta_scan1)

aa(:,2) = exp(1i*2*pi*dd*array.'*theta_scan1(jj));

Pa = aa*(inv(aa'*aa))*aa';

Y = Pa*R;

tmp = abs(trace(Y));

if tmp > max_trace

target_serched(1) = theta_scan1(ii);

target_serched(2) = theta_scan1(jj);

max_trace = tmp;

end

end

end

首先是各个算法谱峰的对比:

仿真条件:16个天线阵列,快拍数为50,信噪比为20,角度设定为(-10°,10°)

结论:dbf算法精度最低,其次是capon,其余超分辨算法测角精度上差不多。

然后是各个算法测量角度、RMSE随信噪比变化的趋势对比:

结论:

DBF算法:在高信噪比下,DBF算法的性能表现较好,但在低信噪比下,其分辨率和定位精度会下降。CAPON算法:CAPON算法在低信噪比下的性能表现较好,但在高信噪比下,其抗干扰能力较弱,容易受到噪声的影响。MUSIC算法:MUSIC算法在高信噪比下的性能表现较好,但在低信噪比下,其分辨率和定位精度会下降。ROOT-MUSIC算法:ROOT-MUSIC算法在高信噪比下的性能表现较好,但在低信噪比下,其分辨率和定位精度也会下降。ESPRIT算法:ESPRIT算法的性能表现与信噪比关系不大,在不同信噪比下都能保持较好的分辨率和定位精度。DML算法:DML算法在低信噪比下的性能表现较好,但在高信噪比下容易产生估计误差。

最后是各个算法测量角度、RMSE随快拍数变化的趋势对比:

结论:

DBF算法:随着快拍数的增加,DBF算法的分辨率和定位精度会提高,但计算复杂度也会增加。CAPON算法:CAPON算法的性能随着快拍数的增加而提高,但在快拍数过多时,容易出现过拟合现象。MUSIC算法:MUSIC算法的分辨率和定位精度随着快拍数的增加而提高,但计算复杂度也会增加。ROOT-MUSIC算法:ROOT-MUSIC算法的性能表现与MUSIC算法类似,随着快拍数的增加,其分辨率和定位精度也会提高。ESPRIT算法:ESPRIT算法对快拍数的要求较低,通常只需要较少的快拍数就可以保持较好的性能表现。DML算法:DML算法对快拍数的要求较低,但过多的快拍数会导致计算复杂度增加。