PKU-Millimeter-Wave-Radar-T.../基于点云的人体定位demo/doa.m
2024-03-11 21:04:35 +08:00

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