% ===========================================================================================%
% 该程序完成16个脉冲信号的脉压、MTI/MTD
% ===========================================================================================%
% 程序中根据每个学生学号的末尾三位(依次为XYZ)来决定仿真参数, 示例:学号后三位为005 X=0 Y=0 Z=5
% 目标距离为[2800 8025 8025 9000+(Y*10+Z)*200],
% 目标速度为[50 -100 0 (200+X*10+Y*10+Z)]
% ===========================================================================================%
close all; %关闭所有图形
clear all; %清除所有变量
clc;
% ===================================================================================%
% 雷达参数 %
% ===================================================================================%
C=3.0e8; %光速(m/s)
RF=3.140e9/2; %雷达射频
Lambda=C/RF;%雷达工作波长
PulseNumber=16; %回波脉冲数
BandWidth=2.0e6; %发射信号带宽
TimeWidth=42.0e-6; %发射信号时宽
PRT=240e-6; % 雷达发射脉冲重复周期(s),240us对应1/2*240*300=36000米
%PRT=240e-6;
PRF=1/PRT;
Fs=2.0e6; %采样频率
NoisePower=-12;%(dB);%噪声功率(目标为0dB)
% ---------------------------------------------------------------%
SampleNumber=fix(Fs*PRT);%计算一个脉冲周期的采样点数480;
TotalNumber=SampleNumber*PulseNumber;%总的采样点数480*16=;
BlindNumber=fix(Fs*TimeWidth);%计算一个脉冲周期的盲区-遮挡样点数;
%===================================================================================%
% 目标参数 %
%===================================================================================%
TargetNumber=4;%目标个数
SigPower(1:TargetNumber)=[1 1 0.25 1];%目标功率,无量纲
TargetDistance(1:TargetNumber)=[2800 8025 8025 11600];%目标距离,单位m 9200需要改9000+(Y*10+Z)*200
DelayNumber(1:TargetNumber)=fix(Fs*2*TargetDistance(1:TargetNumber)/C);% 把目标距离换算成采样点(距离门)
TargetVelocity(1:TargetNumber)=[50 -100 0 223];%目标径向速度 单位m/s 230需要改为(200+X*10+Y*10+Z)
TargetFd(1:TargetNumber)=2*TargetVelocity(1:TargetNumber)/Lambda; %计算目标多卜勒
%====================================================================================%
% 产生线性调频信号 %
%====================================================================================%
number=fix(Fs*TimeWidth);%回波的采样点数=脉压系数长度=暂态点数目+1
if rem(number,2)~=0
number=number+1;
end
for i=-fix(number/2):fix(number/2)-1
Chirp(i+fix(number/2)+1)=exp(j*(pi*(BandWidth/TimeWidth)*(i/Fs)^2));%exp(j*fi)*
end
coeff=conj(fliplr(Chirp));%产生脉压系数
figure(1);
plot(real(Chirp));
title('线性调频信号的实部');
xlabel('回波采样点数');ylabel('幅度');
%-------------------------产生目标回波串-----------------------------------------------------------------------------------------%
SignalAll=zeros(1,TotalNumber);%所有脉冲的信号,先填0
for k=1:TargetNumber% 依次产生各个目标
SignalTemp=zeros(1,SampleNumber);% 一个脉冲
SignalTemp(DelayNumber(k)+1:DelayNumber(k)+number)=sqrt(SigPower(k))*Chirp;%一个脉冲的1个目标(未加多普勒速度)
Signal=zeros(1,TotalNumber);
for i=1:PulseNumber
Signal((i-1)*SampleNumber+1:i*SampleNumber)=SignalTemp;
end
FreqMove=exp(j*2*pi*TargetFd(k)*(0:TotalNumber-1)/Fs);%目标的多普勒速度*时间=目标的多普勒相移
Signal=Signal.*FreqMove;
SignalAll=SignalAll+Signal;
end
figure(2);
subplot(2,1,1);plot(real(SignalAll),'r-');title('目标信号的实部');
xlabel('采样点数');ylabel('幅度');
subplot(2,1,2);plot(imag(SignalAll));title('目标信号的虚部');
xlabel('采样点数');ylabel('幅度');
grid on;zoom on;
%====================================================================================%
% 产生系统噪声信号 %
%====================================================================================%
% SystemNoise=normrnd(0,10^(NoisePower/10),1,TotalNumber)+j*normrnd(0,10^(NoisePower/10),1,TotalNumber);
% save noise.mat SystemNoise
%load noise.mat SystemNoise
SystemNoise=normrnd(0,10^(NoisePower/10),1,TotalNumber)+j*normrnd(0,10^(NoisePower/10),1,TotalNumber);
%====================================================================================%
% 总的回波信号 %
%====================================================================================%
Echo=SignalAll+SystemNoise;% +SeaClutter+TerraClutter;
for i=1:PulseNumber %在接收机闭锁期,接收的回波为0
Echo((i-1)*SampleNumber+1:(i-1)*SampleNumber+number)=0;
end
figure(3);
subplot(2,1,1);plot(real(Echo));title('加噪声后回波信号的实部,闭锁期为0');
subplot(2,1,2);plot(imag(Echo));title('加噪声后回波信号的虚部,闭锁期为0');
%================================时域脉压=================================%
pc_time0=conv(Echo,coeff);
figure(4);plot(abs(pc_time0));title('时域脉压结果的幅度,有暂态点');
pc_time1=pc_time0(number:TotalNumber+number-1);%去掉暂态点 number-1个
% ================================频域脉压=================================%
Echo_fft=fft(Echo,8192);%理应进行TotalNumber+number-1点FFT,但为了提高运算速度,进行了8192点的FFT
coeff_fft=fft(coeff,8192);
pc_fft=Echo_fft.*coeff_fft;
pc_freq0=ifft(pc_fft);
figure(5);plot(abs(pc_freq0));title('频域脉压结果的幅度,有暂态点');
figure(6);
plot(abs(pc_time0(1:TotalNumber+number-1)-pc_freq0(1:TotalNumber+number-1)),'r');
title('红色为时域频域脉压的差别');xlabel('采样点数');ylabel('差距大小');
pc_freq1=pc_freq0(number:TotalNumber+number-1);%去掉暂态点 number-1个,后填充点若干(8192-number+1-TotalNumber)
% ================按照脉冲号、距离门号重排数据=================================%
for i=1:PulseNumber
pc(i,1:SampleNumber)=pc_freq1((i-1)*SampleNumber+1:i*SampleNumber);
end
figure(7);
plot(abs(pc(1,:)));title('去掉前暂态点后的第一个回波的频域脉压幅度');
xlabel('采样点数');ylabel('幅度');
% ================MTI(动目标显示),对消静止目标和低速目标---可抑制杂波=================================%
for i=1:PulseNumber-1 %滑动对消,少了一个脉冲
mti(i,:)=pc(i+1,:)-pc(i,:);
end
figure(8);
mesh(abs(mti));title('MTI结果');
xlabel('目标距离门');ylabel('多普勒通道');zlabel('幅度');
% ================MTD(动目标检测),区分不同速度的目标,有测速作用=================================%
mtd=zeros(PulseNumber,SampleNumber);
for i=1:SampleNumber
buff(1:PulseNumber)=pc(1:PulseNumber,i);
buff_fft=fftshift(fft(buff)); %用fftshift将零频搬移到中间 这样可以方便观察速度正负
mtd(1:PulseNumber,i)=buff_fft(1:PulseNumber)';
end
x=0:1:479;
y=-8:1:7;%通道这样设后读出的通道数乘单位值则是速度值。
figure(9);mesh(x,y,abs(mtd));title('MTD结果');
xlabel('目标距离门');ylabel('多普勒通道');zlabel('幅度');
figure(10);plot(y,abs(mtd));title('MTD处理结果沿通道方向的幅度关系');
xlabel('多普勒通道');ylabel('幅度');
%%%%%%%%%%%%%存储matlab的脉压、MTI、MTD幅度结果,用于与DSP处理结果相比较%%%%%%%%%%%%%
pc_freq0=abs(pc_freq0);
save pc_amp_matlab.mat pc_freq0
mti=abs(mti);
save mti_amp_matlab.mat mti
mtd=abs(mtd);
save mtd_amp_matlab.mat mtd
% ==以下是为DSP程序提供回波数据、脉压系数=====================================================%
%fo=fopen('D:\Program Files\Analog Devices\my program\coeff_fft.dat','wt');%频域脉压系数的实部和虚部
fo=fopen('E:\my program\coeff_fft.dat','wt'); %频域脉压系数的实部和虚部
for i=1:8192
fprintf(fo,'%f,\n',real(coeff_fft(i)));
fprintf(fo,'%f,\n',imag(coeff_fft(i)));
end
fclose(fo);
%fo=fopen('D:\Program Files\Analog Devices\my program\echo.dat','wt');%16次回波的实部和虚部
fo=fopen('E:\my program\echo.dat','wt'); %16次回波的实部和虚部
for i=1:TotalNumber
fprintf(fo,'%f,\n',real(Echo(i)));
fprintf(fo,'%f,\n',imag(Echo(i)));
end
fclose(fo);
%}