close all
clear
clc
%%
% 雷达及目标参数
c = 3e8;
fc = [150e6;200e6;300e6;600e6;1.25e9]; % 多部雷达 不同载频 [3*米波 L S]
lambda = c./fc;
Rresolution = [150;100;75;50;25]; % 多部雷达 不同距离分辨率
B = c./(2*Rresolution); % 多部雷达 不同带宽
Tp = [50e-6;50e-6;50e-6;50e-6;50e-6]; % 脉宽
gama = B./Tp; % 信号调频率
PRF = [1e3;1e3;1e3;1e3;1e3];
ratio = Tp.*PRF; % 占空比
unambiguous_range = c./(2*PRF); % 不模糊距离
min_range = c.*Tp/2; % 最小探测距离
unambiguous_speed = lambda.*PRF/4; % 不模糊径向速度
Fs = 2*B; % 距离向采样率
% 雷达位置
Rposition = [0,-300e3,0;300e3,0,0;600e3,0,0;0,0,0;0,-600e3,0];
Rnum=size(Rposition,1); % Number of radars
figure;plot3(Rposition(:,1)./1e3,Rposition(:,2)./1e3,Rposition(:,3)./1e3,'o');hold on
% 目标位置
Tnum = 5;
Mach = 340;
Tposition = [170e3,-130e3,20e3;
150e3,-110e3,10e3;
160e3,-80e3,15e3;
215e3,-115e3,18e3;
200e3,-90e3,13e3];
Tposition(:,1) = Tposition(:,1) + 500e3 - 80e3;
Tposition(:,2) = Tposition(:,2) - 500e3;
Tspeed = [-1*Mach,1*Mach,0;
-1.5*Mach,1.4*Mach,0;
-1.5*Mach,1.5*Mach,0;
-1.3*Mach,1.5*Mach,0;
-1.5*Mach,1.7*Mach,0];
Tacceleration = [0,0,0;
0,0,0;
-5,-5,0;
-10,0,0;
-5,5,0];
% 功率测试目标 调整回波功率至某一定点处一致
Tposition(6,1)=mean(Tposition(1:5,1));
Tposition(6,2)=mean(Tposition(1:5,2));
Tposition(6,3)=mean(Tposition(1:5,3));
Tspeed(6,:)=[0,0,0];
Tacceleration(6,:)=[0,0,0];
% 航迹查看 非雷达采样点
t = (0:1/PRF(1):0.5).';
Tpoint = cell(Tnum,1);
for k = 1:Tnum
Tpoint{k} = Tposition(k,:) + t*Tspeed(k,:) + 0.5*t.^2*Tacceleration(k,:);
plot3(Tpoint{k}(:,1)./1e3,Tpoint{k}(:,2)./1e3,Tpoint{k}(:,3)./1e3,'.');
end
grid on;xlabel('x (km)'); ylabel('y (km)'); zlabel('z (km)');
legend('雷达位置-','目标一','目标二','目标三','目标四','目标五');
% 目标距离计算后 信号包络起始在PRI内但包络末端超过PRI 所以实际处理的距离分辨率会小于设定值
cpi=64; % 相干积累脉冲数 128
frame=10; % 检测帧数
step=0.064; % 每帧间隔 step 秒
Pc=[220e3;200e3;160e3;1000e3;260e3]; % 各雷达发射功率
Ls=[1;1;1;1;1]; % 各雷达系统损耗忽略
PRI=1./PRF;
freq=cell(Rnum,1); % 多普勒频率轴
range=cell(Rnum,1); % 距离轴
Rweight=cell(Rnum,1); % 距离权 用于补偿雷达回波随距离的衰减
Dresolution=zeros(Rnum,1); % 多普勒分辨率
% 设置快慢时间轴
fasttime=cell(Rnum,1); numfast=zeros(Rnum,1);
slowtime=cell(Rnum,1); numslow=zeros(Rnum,1);
doppler_num=cpi; % 多普勒升采样数
for tempRnum=1:Rnum
% 慢
slowtime{tempRnum}=zeros(1,cpi*frame);
for k=1:frame
slowtime{tempRnum}(1+(k-1)*cpi:k*cpi)=...
(0:PRI(tempRnum):cpi/PRF(tempRnum)-PRI(tempRnum))+(k-1)*step; % 慢时间 步长为PRI % 节省回波仿真时间
end
% 快
sampletime=1/Fs(tempRnum);
fasttime{tempRnum} = 0:sampletime:PRI(tempRnum)-sampletime; % 快时间 从0至PRI 步长为sampletime
numfast(tempRnum)=length(fasttime{tempRnum});
numslow(tempRnum)=length(slowtime{tempRnum});
% 频率
%freq{tempRnum}=linspace(-PRF(tempRnum)/2,PRF(tempRnum)/2,doppler_num).';
freq{tempRnum}=((-doppler_num/2:doppler_num/2-1)./doppler_num.*PRF(tempRnum)).';
Dresolution(tempRnum)=abs(freq{tempRnum}(2)-freq{tempRnum}(1));
% 距离
range{tempRnum}=(c.*fasttime{tempRnum}/2).';
[weight,~]=mapminmax(range{tempRnum}.^2.',0,1);
Rweight{tempRnum}=weight.';
%{
figure;plot(slowtime{tempRnum})
figure;plot(fasttime{tempRnum})
%}
end
%% 信号产生
vec_radar_mov_tar=cell(Rnum,Tnum); % 视线向量
R_mt_radar=cell(Rnum,Tnum); % 斜距
doppler=cell(Rnum,Tnum); % 模糊多普勒
flag_noise_adding=1; % 回波是否带噪 时域回波
% 理论rd域增益 脉压增益+相参积累增益,对动目标相参积累有损失
rd_up=10*log10(B.*Tp)+0.6*10*log10(cpi);
SNR_dB=-rd_up+[2;3;2;2;2];
rcs=[1.1,1,1,1,1.4,1;
1.8,1,1,2.2,1.5,1;
1.2,1,1,1.7,1.5,1;
1.1,1.2,1,1.7,1,1;
1.2,1,1,1.8,1.8,1]; % 不同雷达对不同目标的RCS
radar_num=5;
% 目标模糊数
Ambiguous_Range=zeros(Rnum,Tnum);
Ambiguous_Speed=zeros(Rnum,Tnum);
Monte=5; % 回波噪声要多次仿
noisenum=[1,6,4,4,5;(7:7+Monte-2).'*ones(1,Rnum)];
S=cell(Rnum,Monte); % 多部雷达回波信号
tic
for Carlo=1:Monte
for tempRnum=1:Rnum % 雷达循环
% 初始化
S{tempRnum,Carlo}=zeros(numfast(tempRnum),numslow(tempRnum));
for tempTnum=1:Tnum % 目标循环
P_coeff=sqrt(Pc(tempRnum)*lambda(tempRnum)^2/((4*pi)^3)*Ls(tempRnum)*rcs(tempRnum,tempTnum));
% 计算当前雷达慢时间轴下的该目标位置
ct=slowtime{tempRnum}.';
Tpos=Tposition(tempTnum,:)+ct*Tspeed(tempTnum,:)+0.5*ct.^2*Tacceleration(tempTnum,:);
% 计算瞬时斜距及时延
vec_radar_mov_tar{tempRnum,tempTnum}=Tpos-Rposition(tempRnum,:);
R_mt_radar{tempRnum,tempTnum}=vecnorm(vec_radar_mov_tar{tempRnum,tempTnum}, 2, 2);
Ambiguous_Range(tempRnum,tempTnum)=floor(R_mt_radar{tempRnum,tempTnum}(1)/unambiguous_range(tempRnum));
t_rec=2*R_mt_radar{tempRnum,tempTnum}./c;
% 计算瞬时多普勒
Tvelocity=Tspeed(tempTnum,:)+ct*Tacceleration(tempTnum,:);
% doppler{tempRnum,tempTnum}=...
% doppler_calculation(Rposition(tempRnum,:),[0,0,0],Tpos,Tvelocity,lambda(tempRnum),PRF(tempRnum));
% Ambiguous_Speed(tempRnum,tempTnum)=(doppler{tempRnum,tempTnum}(1,2)-doppler{tempRnum,tempTnum}(1,1))/PRF(tempRnum);
%
pattern=1;% 方向图参数 预留
duration_pls=Tp(tempRnum); % 脉宽
% 回波生成
for temp_i_PRI=1:numslow(tempRnum) % 慢时间循环
temp_t_rec=t_rec(temp_i_PRI); % 当前时延
if temp_t_rec<PRI(tempRnum) % 无距离模糊
% data record the pulse echo. size = (1,length(fasttime))
tempdata=P_coeff/(R_mt_radar{tempRnum,tempTnum}(temp_i_PRI)^2) *... % 信号功率以1/R^4衰减 电压以1/R^2衰减
pattern*( (fasttime{tempRnum}>=temp_t_rec & ...
fasttime{tempRnum}<=temp_t_rec+duration_pls)...
.*exp(-1i*2*pi*fc(tempRnum)*temp_t_rec )...
.*exp(1i*pi*gama(tempRnum)*(fasttime{tempRnum}-temp_t_rec).^2) );
% 已经解调至基带
S{tempRnum,Carlo}(:,temp_i_PRI)=S{tempRnum,Carlo}(:,temp_i_PRI)+tempdata.';
else % 存在距离模糊
num_pri=floor(temp_t_rec/PRI(tempRnum)); % 回波模糊脉冲数
new_temp_t_rec=temp_t_rec-num_pri*PRI(tempRnum); % 模糊时延
%
if new_temp_t_rec+duration_pls<=PRI(tempRnum)
Twin=(fasttime{tempRnum}>=new_temp_t_rec & fasttime{tempRnum}<=new_temp_t_rec+duration_pls);
else
Twin=(fasttime{tempRnum}>=new_temp_t_rec | fasttime{tempRnum}<=new_temp_t_rec+duration_pls-PRI(tempRnum));
end
%
tempdata=P_coeff/(R_mt_radar{tempRnum,tempTnum}(temp_i_PRI)^2) *...
pattern*( Twin.*exp(-1i*2*pi*fc(tempRnum)*new_temp_t_rec )...
.*exp(1i*pi*gama(tempRnum)*(fasttime{tempRnum}-new_temp_t_rec).^2) );
if (temp_i_PRI+num_pri)<=numslow(tempRnum)
S{tempRnum,Carlo}(:,temp_i_PRI+num_pri)=S{tempRnum,Carlo}(:,temp_i_PRI+num_pri)+tempdata.';
end
end % if temp_t_rec<PRI(t