Автомобильный радар для оценки дальности и скорости
Автор
import FFTW
function calcParamFMCWMT()
function fftshiftfreqgrid(N,Fs)
freq_res = Fs/N
freq_grid = Vector(0:N-1)*freq_res;
Nyq = Fs/2
half_res = freq_res/2
if rem(N,2)==1 #odd
idx = Vector(1:Int64((N-1)/2))
halfpts = Int64((N+1)/2)
freq_grid[halfpts] = Nyq-half_res
freq_grid[halfpts+1] = Nyq+half_res
else
idx = Vector(1:Int64(N/2))
hafpts = Int64(N/2+1);
freq_grid[hafpts] = Nyq;
end
freq_grid[N] = Fs-freq_res
freq_grid = FFTW.fftshift(freq_grid)
freq_grid[idx] = freq_grid[idx].-Fs
return freq_grid
end
#Constant
c = 3e8;
maxEstimatesFMCWMT = 2;
#Radar Waveform
NumSweeps = 64;
Bw = 150e6;
Fs = Bw;
T = 5.5*400/c;
PRF = 1/T;
Slope = Bw/T;
NumSamplesSweep = Int64(T*Fs);
#Radar Hardware
Fc = 77e9;
lambda = c/Fc;
Ppow = 0.00316227766016838;
TxGain = 36.0042142909402;
NF = 4.5;
RxGain = 42.0042142909402;
RCS = 50;
TruckRCS = 1000;
NumEl = 4;
Spacing = lambda/2;
azs = -0.5:0.5:0.5;
els = zeros(size(azs));
LookAngs = [azs;els];
NumBeams = size(LookAngs,2);
#Geometry
RadarVel = [100*1000/3600; 0; 0];
RadarPos = [0; 0; 0];
CarVel = [60*1000/3600; 0; 0];
CarPos = [50; 0; 0];
TruckVel = [130*1000/3600; 0; 0];
TruckPos = [150; 0; 0];
#Range Processing Interval
rangeProcessLimits = [1 200] #Only process from 1 m to 200 m
rngVec = beat2range(fftshiftfreqgrid(NumSamplesSweep,Fs),Slope,c)
idxRangeProcessMin = argmin(abs.(rngVec .- rangeProcessLimits[1]))
idxRangeProcessMax = argmin(abs.(rngVec .- rangeProcessLimits[2]))
IdxRangeProcessLimits = [idxRangeProcessMin idxRangeProcessMax]
#CFAR
numRng = idxRangeProcessMax - idxRangeProcessMin + 1
NumRng = numRng
rngOver = max(round(Int64,numRng/(T*Fs)),1)
nGuardRng = 2*rngOver
nTrainRng = 4*rngOver
numCUTRng = 1+nGuardRng+nTrainRng
numDop = NumSweeps
NumDop = numDop
dopOver = round(Int64,numDop/NumSweeps)
numGuardDop = 1*dopOver
numTrainDop = 4*dopOver
numCUTDop = 1+numGuardDop+numTrainDop
CUTSize = [(1+nGuardRng+nTrainRng) (1+numGuardDop+numTrainDop)]
GuardSize = Int64.([nGuardRng numGuardDop]);
TrainSize = Int64.([nTrainRng numTrainDop]);
idxRngCUTFMCWMT = Vector{Int64}(numCUTRng:(numRng-numCUTRng+1))
idxDopCUTFMCWMT = Vector{Int64}(numCUTDop:(numDop-numCUTDop+1))
NumCUTIdx = length(idxRngCUTFMCWMT)*length(idxDopCUTFMCWMT)
N = 64
#Plot Limits
RngLims = [rngVec[idxRangeProcessMin] rngVec[idxRangeProcessMax]]; #m
dopVec = fftshiftfreqgrid(NumDop,PRF); #Hz
speedVec = sort(-dop2speed(dopVec,lambda)/2); #m/s
SpeedLims = [speedVec[1] speedVec[end]]; #m/s
# New variable
Idx_Proc = (IdxRangeProcessLimits[1]:IdxRangeProcessLimits[2])
CFAR_Idx = [reshape(repeat(idxRngCUTFMCWMT[:]',length(idxDopCUTFMCWMT),1),NumCUTIdx,1)'
reshape(repeat(idxDopCUTFMCWMT[:],length(idxRngCUTFMCWMT),1),NumCUTIdx,1)']
return (c =c,maxEstimatesFMCWMT = maxEstimatesFMCWMT,NumSweeps = NumSweeps,Bw = Bw,
Fs = Fs,T = T,PRF = PRF,Slope = Slope,NumSamplesSweep = NumSamplesSweep,
Fc = Fc,lambda = lambda,Ppow = Ppow,TxGain = TxGain,NF = NF,RxGain = RxGain,RCS = RCS,TruckRCS = TruckRCS,
NumEl = NumEl,Spacing = Spacing,LookAngs = LookAngs,NumBeams = NumBeams,
RadarVel = RadarVel,RadarPos = RadarPos,CarVel = CarVel,CarPos = CarPos,TruckVel = TruckVel,TruckPos = TruckPos,
IdxRangeProcessLimits = IdxRangeProcessLimits,NumRng = NumRng,NumDop = NumDop,
CUTSize = CUTSize,GuardSize = GuardSize,TrainSize = TrainSize,NumCUTIdx = NumCUTIdx,
RngLims = RngLims,SpeedLims = SpeedLims,idxRngCUTFMCWMT = idxRngCUTFMCWMT,idxDopCUTFMCWMT = idxDopCUTFMCWMT,
Idx_Proc = Idx_Proc,CFAR_Idx = CFAR_Idx,N = N)
end