84 lines
2.4 KiB
Matlab
84 lines
2.4 KiB
Matlab
%% 三种角度估计的方法
|
|
|
|
function [angle,doa_abs] = doa(parameter,antVec)
|
|
|
|
doaMethod = parameter.doaMethod;
|
|
if doaMethod == 1
|
|
[angle,doa_abs] = dbfMethod(parameter,antVec);
|
|
elseif doaMethod == 2
|
|
[angle,doa_abs] = fftMethod(parameter,antVec);
|
|
elseif doaMethod == 3
|
|
[angle,doa_abs] = caponMethod(parameter,antVec);
|
|
else
|
|
end
|
|
end
|
|
|
|
function [angle,doa_abs] = dbfMethod(parameter,antVec)
|
|
|
|
txAntenna = parameter.txAntenna;
|
|
rxAntenna = parameter.rxAntenna;
|
|
virtualAntenna = parameter.virtualAntenna;
|
|
lambda = parameter.lambda;
|
|
txNum = length(txAntenna);
|
|
rxNum = length(rxAntenna);
|
|
dx = parameter.dx;
|
|
deg = -90:0.1:90;
|
|
weightVec = zeros(virtualAntenna,1);
|
|
doa_dbf = zeros(length(deg),1);
|
|
kk = 1;
|
|
for degscan = deg
|
|
for txId = 1:txNum
|
|
for rxId = 1:rxNum
|
|
dphi = ((txId-1) * rxNum + rxId - 1) * 2 * pi / lambda * dx * sind(degscan);
|
|
weightVec((txId-1) * rxNum + rxId) = exp(-1i * dphi);
|
|
end
|
|
end
|
|
doa_dbf(kk) = antVec'*weightVec;
|
|
kk = kk + 1;
|
|
end
|
|
doa_abs = abs(doa_dbf);
|
|
[pk,loc]=max(doa_abs);
|
|
angle = deg(loc);
|
|
end
|
|
|
|
function [angle,doa_abs] = fftMethod(parameter,antVec)
|
|
angleIndex = asin((-512:1:512-1)/512) * 180 / pi;
|
|
doa_fft=fftshift(fft(antVec,1024));
|
|
doa_abs=abs(doa_fft);
|
|
[pk,loc]=max(doa_abs);
|
|
angle = angleIndex(loc);
|
|
end
|
|
|
|
function [angle,doa_abs] = caponMethod(parameter,antVec)
|
|
|
|
txAntenna = parameter.txAntenna;
|
|
rxAntenna = parameter.rxAntenna;
|
|
txNum = length(txAntenna);
|
|
rxNum = length(rxAntenna);
|
|
lambda = parameter.lambda;
|
|
dx = parameter.dx;
|
|
virtualAntenna = parameter.virtualAntenna;
|
|
Rx = antVec * antVec' / virtualAntenna;
|
|
deg = -90:0.1:90;
|
|
a = zeros(virtualAntenna,1);
|
|
% a = zeros(1,virtualAntenna);
|
|
kk = 1;
|
|
for degscan = deg
|
|
for txId = 1:txNum
|
|
for rxId = 1:rxNum
|
|
virtualAntennaId = (txId-1) * rxNum + rxId - 1;
|
|
dphi = 2 * pi / lambda * dx * virtualAntennaId * sind(degscan);
|
|
a((txId-1) * rxNum + rxId) = exp(-1i * dphi);
|
|
end
|
|
end
|
|
RxInv = inv(Rx);
|
|
P_out(kk) = 1/(a'*RxInv*a);
|
|
kk = kk + 1;
|
|
end
|
|
doa_abs = abs(P_out);
|
|
[pk,loc]=max(doa_abs);
|
|
angle = deg(loc);
|
|
figure;
|
|
plot(deg,20*log10(abs(P_out)));
|
|
end
|