Add files via upload

This commit is contained in:
St. Zhang 2024-03-11 21:04:35 +08:00 committed by GitHub
parent d91f202e2b
commit 31171fa508
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 340 additions and 0 deletions

View File

@ -0,0 +1,19 @@
%% 2DFFT-
function fft2dData = RAfftMatrix(rawData)
rawData = squeeze(rawData);
[angleBin,rangeBin] = size(rawData);
angleWin = hanning(angleBin);
angleWin2D = repmat(angleWin,1,rangeBin);
rangeWin = hanning(rangeBin)';
rangeWin2D = repmat(rangeWin,angleBin,1);
rawDataWin = rawData .* angleWin2D;
fft1dData = fftshift(fft(rawDataWin,angleBin,1));
fft1dDataWin = fft1dData .* rangeWin2D;
fft2dData = fft(fft1dDataWin,rangeBin,2);
end

View File

@ -0,0 +1,14 @@
%% 2DFFT-
function fft2dData = RDfftMatrix(rawData)
rawData = squeeze(rawData);
[rangeBin,dopplerBin] = size(rawData);
rangeWin = hanning(rangeBin);
rangeWin2D = repmat(rangeWin,1,dopplerBin);
dopplerWin = hanning(dopplerBin)';
dopplerWin2D = repmat(dopplerWin,rangeBin,1);
rawDataWin = rawData .* rangeWin2D;
fft1dData = fft(rawDataWin,rangeBin,1);
fft1dDataWin = fft1dData .* dopplerWin2D;
fft2dData = fftshift(fft(fft1dDataWin,dopplerBin,2),2);
end

View File

@ -0,0 +1,67 @@
%% CFAR2D-CFAR
function [pointList,cfarRD] = cfar(parameter,accumulateRD)
[rangeLen,dopplerLen] = size(accumulateRD);
%% doppler
dopplerMethod = parameter.dopplerMethod;
dopplerSNR = parameter.dopplerSNR;
dopplerWinGuardLen = parameter.dopplerWinGuardLen;
dopplerWinTrainLen = parameter.dopplerWinTrainLen;
dopplerLeft = accumulateRD(:,dopplerLen - dopplerWinGuardLen - dopplerWinTrainLen + 1:dopplerLen);
dopplerRight = accumulateRD(:,1:dopplerWinGuardLen+dopplerWinTrainLen);
dopplercfar = [dopplerLeft accumulateRD dopplerRight];
dopplerCfarList = [];
for rangeIdx = 1:rangeLen
for dopplerIdx = 1:dopplerLen
dopplerCfarIdx = dopplerIdx + dopplerWinGuardLen + dopplerWinTrainLen;
leftCell = dopplercfar(rangeIdx,dopplerIdx:dopplerIdx+dopplerWinTrainLen-1);
rightCell = dopplercfar(rangeIdx,dopplerCfarIdx+dopplerWinGuardLen:dopplerCfarIdx+dopplerWinGuardLen+dopplerWinTrainLen-1);
leftNoise = mean(leftCell);
rightNoise = mean(rightCell);
noise = (leftNoise + rightNoise) / 2;
indexdb = dopplercfar(rangeIdx,dopplerCfarIdx);
targetSnr = indexdb - noise;
if targetSnr > dopplerSNR
dopplerCfarList = [dopplerCfarList dopplerIdx];
cfarRDdoppler(rangeIdx,dopplerIdx) = indexdb;
end
end
end
dopplerCfarList = unique(dopplerCfarList);
%% range
rangeMethod = parameter.rangeMethod;
rangeSNR = parameter.rangeSNR;
rangeWinGuardLen = parameter.rangeWinGuardLen;
rangeWinTrainLen = parameter.rangeWinTrainLen;
rangeUp = accumulateRD(rangeLen - rangeWinGuardLen - rangeWinTrainLen + 1:rangeLen,:);
rangeDown = accumulateRD(1:rangeWinGuardLen+rangeWinTrainLen,:);
rangecfar = [rangeUp;accumulateRD;rangeDown];
rangeCfarList = [];
cfarRD = zeros(rangeLen,dopplerLen);
for dopplerIdx = dopplerCfarList
for rangeIdx = 1:rangeLen
rangeCfarIdx = rangeIdx + rangeWinGuardLen + rangeWinTrainLen;
upCell = rangecfar(rangeIdx:rangeIdx+rangeWinTrainLen-1,dopplerIdx);
downCell = rangecfar(rangeCfarIdx+rangeWinGuardLen:rangeCfarIdx+rangeWinGuardLen+rangeWinTrainLen-1,dopplerIdx);
upNoise = mean(upCell);
downNoise = mean(downCell);
if rangeMethod == 1
noise = (upNoise + downNoise) / 2;
indexdb = rangecfar(rangeCfarIdx,dopplerIdx);
targetSnr = indexdb - noise;
if targetSnr > rangeSNR
rangeCfarList = [rangeCfarList [rangeIdx;dopplerIdx]];
cfarRD(rangeIdx,dopplerIdx) = indexdb;
end
elseif dopplerMethod == 2
elseif dopplerMethod == 3
else
end
end
end
pointList = rangeCfarList;
end

View File

@ -0,0 +1,10 @@
%%
function accumulateRD = chan_Accumulate(fft2dDataDB)
[channelNum,rangeBin,dopplerBin] = size(fft2dDataDB);
accumulateRD = zeros(rangeBin,dopplerBin);
for channelId = 1:channelNum
accumulateRD = accumulateRD + (abs(squeeze(fft2dDataDB(channelId,:,:))));
end
end

View File

@ -0,0 +1,83 @@
%%
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

View File

@ -0,0 +1,14 @@
%% CFAR
function parameter = generateCfarParameter()
parameter.dopplerMethod = 1; %1ca-cfar 2so-cfar 3go-cfar
parameter.dopplerSNR = 10;
parameter.dopplerWinGuardLen = 2;
parameter.dopplerWinTrainLen = 8;
parameter.rangeMethod = 1; %1ca-cfar 2so-cfar 3go-cfar
parameter.rangeSNR = 10;
parameter.rangeWinGuardLen = 2;
parameter.rangeWinTrainLen = 4;
end

View File

@ -0,0 +1,36 @@
%
function parameter = generateParameter()
parameter.c = 3e8; %
parameter.stratFreq = 76.5e9; %
parameter.Tr = 10e-6; %
parameter.Samples = 256; %
parameter.Fs = 25.6e6; %
parameter.rangeBin = parameter.Samples ; %rangebin
parameter.Chirps = 512; %chirp
parameter.dopplerBin = parameter.Chirps; %dopplerbin
parameter.Slope = 30e12; %chirp
parameter.Bandwidth = parameter.Slope * parameter.Tr ; %
parameter.BandwidthValid = parameter.Samples/parameter.Fs*parameter.Slope; %
parameter.centerFreq = parameter.stratFreq + parameter.Bandwidth / 2; %
parameter.lambda = parameter.c / parameter.centerFreq; %
parameter.txAntenna = ones(1,3); %线
parameter.rxAntenna = ones(1,4); %线
parameter.txNum = length(parameter.txAntenna);
parameter.rxNum = length(parameter.rxAntenna);
parameter.virtualAntenna = length(parameter.txAntenna) * length(parameter.rxAntenna);
parameter.dz = parameter.lambda / 2; %线
parameter.dx = parameter.lambda / 2; %线
parameter.doaMethod = 2; % 1-dbf 2-fft 3-capon
parameter.target = [
100 -20 0; %target1 range speed angle
0 10 -30; %target2 range speed angle
0 20 30; %target2 range speed angle
];
end

View File

@ -0,0 +1,67 @@
%%
function rawData = generateSignal(Parameter)
c = Parameter.c; %
stratFreq = Parameter.stratFreq; %
Tr = Parameter.Tr; %
samples = Parameter.Samples; %
fs = Parameter.Fs; %
rangeBin = Parameter.rangeBin; %rangeBin
chirps = Parameter.Chirps; %chirp
dopplerBin = Parameter.dopplerBin; %dopplerBin
slope = Parameter.Slope; %chirp
bandwidth = Parameter.Bandwidth; %
centerFreq = Parameter.centerFreq; %
lambda = Parameter.lambda;
txAntenna = Parameter.txAntenna; %线
txNum = length(txAntenna); %线
rxAntenna = Parameter.rxAntenna; %线
rxNum = length(rxAntenna); %线
dz = Parameter.dz; %
dx = Parameter.dx; %
target = Parameter.target; %
targetNum = size(target,1); %
rawData = zeros(txNum*rxNum,rangeBin,dopplerBin);
t = 0:1/fs:Tr-(1/fs); %chirp
for chirpId = 1:chirps
for txId = 1:txNum
St = exp((1i*2*pi)*(centerFreq*(t+(chirpId-1)*Tr)+slope/2*t.^2)); %
for rxId = 1:rxNum
Sif = zeros(1,rangeBin);
for targetId = 1:targetNum
%% Parameter.frame=0
if targetId==1
targetRange = target(targetId,1)-Parameter.frame;
targetSpeed = target(targetId,2);
targetAngle = target(targetId,3);
elseif targetId==2
targetRange = target(targetId,1)+0.5*Parameter.frame;
targetSpeed = target(targetId,2);
targetAngle = target(targetId,3);
elseif targetId==3
targetRange = target(targetId,1)+Parameter.frame;
targetSpeed = target(targetId,2);
targetAngle = target(targetId,3);
end
tau = 2 * (targetRange + targetSpeed * (txId - 1) * Tr) / c;
fd = 2 * targetSpeed / lambda;
wx = ((txId-1) * rxNum + rxId) / lambda * dx * sind(targetAngle);
Sr = 10*exp((1i*2*pi)*((centerFreq-fd)*(t-tau+(chirpId-1) * Tr)+slope/2*(t-tau).^2 -wx)); %
Sif = Sif + St .* conj(Sr);
%20dB
Sif = awgn(Sif,20);
end
rawData((txId-1) * rxNum + rxId,:,chirpId) = Sif;
end
end
end
end

View File

@ -0,0 +1,30 @@
%%
function [RD_pearkSearch,peakSearchList] = peakSearch(RD_cfar,cfarTargetList)
peakSearchList = [];
[rangeLen, dopplerLen] = size(RD_cfar);
RD_pearkSearch = zeros(rangeLen, dopplerLen);
length = size(cfarTargetList,2);
for targetIdx = 1:length
rangeIdx = cfarTargetList(1,targetIdx);
dopplerIdx = cfarTargetList(2,targetIdx); %
if rangeIdx > 1 && rangeIdx < rangeLen && dopplerIdx > 1 && dopplerIdx < dopplerLen %
if RD_cfar(rangeIdx,dopplerIdx) > RD_cfar(rangeIdx - 1,dopplerIdx) && ...
RD_cfar(rangeIdx,dopplerIdx) > RD_cfar(rangeIdx + 1,dopplerIdx) && ...
RD_cfar(rangeIdx,dopplerIdx) > RD_cfar(rangeIdx,dopplerIdx - 1) && ...
RD_cfar(rangeIdx,dopplerIdx) > RD_cfar(rangeIdx,dopplerIdx + 1)
RD_pearkSearch(rangeIdx,dopplerIdx) = RD_cfar(rangeIdx,dopplerIdx);
cfarTarget = [rangeIdx ; dopplerIdx];
peakSearchList = [peakSearchList cfarTarget];
end
end
end
end