matlab仿真多普勒相移,有关脉冲多普勒雷达的matlab仿真问题
大家好,最近在研究脉冲多普勒雷达,从网上找到了一个matlab代码:
% ===========================================================================================%
% 该程序完成16个脉冲信号的【脉压、动目标显示/动目标检测(MTI/MTD)】
% ===========================================================================================%
% 程序中根据每个学生学号的末尾三位(依次为XYZ)来决定仿真参数,034
% 目标距离为[3000 8025 9000+(Y*10+Z)*200 8025],4个目标
% 目标速度为[50 0 (Y*10+X+Z)*6 100]
% ===========================================================================================%
close all; %关闭所有图形
clear all; %清除所有变量
clc;
% ===================================================================================%
% 雷达参数 %
% ===================================================================================%
C=3.0e8; %光速(m/s)
RF=3.140e9/2; %雷达射频 1.57GHz
Lambda=C/RF;%雷达工作波长
PulseNumber=16; %回波脉冲数
BandWidth=2.0e6; %发射信号带宽 带宽B=1/τ,τ是脉冲宽度
TimeWidth=42.0e-6; %发射信号时宽
PRT=240e-6; % 雷达发射脉冲重复周期(s),240us对应1/2240300=36000米最大无模糊距离
PRF=1/PRT;
Fs=2.0e6; %采样频率
NoisePower=-12;%(dB);%噪声功率(目标为0dB)
% ---------------------------------------------------------------%
SampleNumber=fix(Fs*PRT);%计算一个脉冲周期的采样点数480;
TotalNumber=SampleNumberPulseNumber;%总的采样点数48016=;
BlindNumber=fix(Fs*TimeWidth);%计算一个脉冲周期的盲区-遮挡样点数;
%===================================================================================%
% 目标参数 %
%===================================================================================%
TargetNumber=4;%目标个数
SigPower(1:TargetNumber)=[1 1 1 0.25];%目标功率,无量纲
TargetDistance(1:TargetNumber)=[3000 8025 15800 8025];%目标距离,单位m 距离参数为[3000 8025 9000+(Y*10+Z)*200 8025]
DelayNumber(1:TargetNumber)=Fs2TargetDistance(1:TargetNumber)/C; % 将目标距离转换为采样点(即距离门)的数量,并采用朝零方向进行取整
TargetVelocity(1:TargetNumber)=[50 0 204 100];%目标径向速度 单位m/s 速度参数为[50 0 (Y*10+X+Z)*6 100]
Note that TargetFd(1:TargetNumber) is assigned to 2 multiplied by TargetVelocity(1:TargetNumber) divided by Lambda.
%====================================================================================%
% 产生线性调频信号 %
%====================================================================================%
number=fix(Fs*TimeWidth);%回波的采样点数=脉压系数长度=暂态点数目+1
if rem(number,2)~=0 %rem求余
number=number+1;
end %把number变为偶数
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), 生成复数矩阵 Chirp.
end
coeff=conj(fliplr(Chirp));%把Chirp矩阵翻转并把复数共轭,产生脉压系数
figure(1);%脉压系数的实部
plot(real(Chirp));axis([0 90 -1.5 1.5]);title('脉压系数实部');
%-------------------------产生目标回波串-----------------------------------------------------------------------------------------%
%-------------------------产生前3个目标的回波串-------%
SignalAll=zeros(1,TotalNumber);%所有脉冲的信号,先填0
for k=1:TargetNumber-1 % 依次产生各个目标
SignalTemp=zeros(1,SampleNumber);% 一个PRT
S_Temp(从 DelayNumber(K) + 1 至 DelayNumber(K) + number)= sqrt(SigPower(K)) * Chirp; % 单个脉冲的目标(未考虑多普勒效应)从 DelayNumber(K) + 1 至 DelayNumber(K) + number.
Signal=zeros(1,TotalNumber);
for i=1:PulseNumber % 16个回波脉冲
该处使用...标记表示信号分割的位置为: Signal((i-1)SampleNumber+1:iSampleNumber)=SignalTemp; %此处分割后的每一个目标将包含连续的16个SignalTemp值。
end
MoveFreq = e^(j * 2 * π * TargetFd(k) * (0:TotalNumber-1) / Fs); 表示目标通过多普勒效应导致的时间位移等于其多普勒速度
Signal=Signal.*FreqMove;%加上多普勒速度后的16个脉冲1个目标
SignalAll=SignalAll+Signal;%加上多普勒速度后的16个脉冲4个目标
end
% %-------------------------产生第4个目标的回波串-------%
fi=pi/3;
SignalTemp=zeros(1,SampleNumber);% 一个脉冲
SignalTemp(DelayNumber(4)+1:DelayNumber(4)+number)=\sqrt{SigPower(4)} \cdot e^{j \cdot fi} \cdot Chirp;该脉冲的目标为单一目标(未引入多普勒效应)
Signal=zeros(1,TotalNumber);
for i=1:PulseNumber
Signal((i-1)SampleNumber+1:iSampleNumber)=SignalTemp;
end
The Doppler shift corresponding to the target is calculated as FreqMove = exp(j * 2 * π * TargetFd(4) * (0:TotalNumber-1) / Fs);
Signal=Signal.*FreqMove;
SignalAll=SignalAll+Signal;
figure(2);
subplot(2,1,1);plot(real(SignalAll),'r-');title('目标信号的实部');grid on;zoom on;
subplot(2,1,2);plot(imag(SignalAll));title('目标信号的虚部');grid on;zoom on;
%====================================================================================%
% 产生系统噪声信号 %
%====================================================================================%
SystemNoise由以下公式生成复数噪声信号:SystemNoise = normrnd(0, 10^{(NoisePower/10)}, 1, TotalNumber) + j \times normrnd(0, 10^{(NoisePower/10)}, 1, TotalNumber);
%均值为0,标准差为10^(NoisePower/10)的噪声
%====================================================================================%
% 总的回波信号 %
%====================================================================================%
Echo=SignalAll+SystemNoise; % +SeaClutter+TerraClitter, 加入噪声后的回声
for i=1:PulseNumber %在接收机闭锁期,接收的回波为0
Echo((i-1)*SampleNumber+1:(i-1)*SampleNumber+number)=0; %发射时接收为0
end
figure(3);%加噪声之后的总回波信号
subplot(2,1,1);plot(real(Echo),'r-');title('总回波信号的实部,闭锁期为0');
subplot(2,1,2);plot(imag(Echo));title('总回波信号的虚部,闭锁期为0');
%================================时域脉压=================================%
pc_time0=conv(Echo,coeff);%pc_time0为Echo和coeff的卷积
pc_time1=pc_time0(number:TotalNumber+number-1);%去掉暂态点 number-1个
figure(4);%时域脉压结果的幅度
subplot(2,1,1); plot(abs(pc_time0), 'r-'); title('Time-domain pulse effect result amplitude and its transient characteristics', 'en'); % Represents the modulus changes of pc_time0
使用 subplot 函数生成第 2 行 1 列的第二个子图;通过 plot 函数绘制 abs(pc_time1) 的图形;设置标题为‘时域脉压结果的幅度’(无暂态点);注:pc_time1 的模值曲线。
% ================================频域脉压=================================%
Echo_fft = fft(Echo, 8192);%原本应执行TotalNumber+number−1点Fast Fourier Transform(FFT),但由于追求运算速度的优化需求,则采用了8192点的FFT
coeff_fft=fft(coeff,8192);
pc_fft=Echo_fft.*coeff_fft;
pc_freq0=ifft(pc_fft);
figure(5);
使用子图布局函数 subplot(2, 1, 1),然后绘制 abs(pc_freq0) 的绝对值曲线;并在图形标题中设置为 '频域脉压结果的幅值及其暂态阶段数据'
创建一个包含两个子图的布局,并选择第二个子图;
绘制图形:abs(pc_time0(1:TotalNumber+number-1)-pc_freq0(1:TotalNumber+number-1)) 的值,
颜色设为红色;
设置标题:时域与频域脉冲特性的差异
该代码段用于计算某个参数 pc_freq 的值。
具体来说,
pc_freq = pc_freq0(number: TotalNumber + number - 1);
其中,
total_points = TotalNumber + (8_192 - number) + 1 - TotalNumber;
filling_points = total_points - TotalNumber;
% ================按照脉冲号、距离门号重排数据=================================%
for i=1:PulseNumber
计算模块 pc(i, 1: SampleNumber) 等于 pc_freq1((i - 1) * SampleNumber + 1:i * SampleNumber),其中每个 PRT 对应一行数据块,并且每一行包含 480 个采样数据点的信息块
end
figure(6);
plot(abs(pc(1,:)));title('频域脉压结果的幅度,没有暂态点');
% ================MTI(动目标显示),对消静止目标和低速目标---可抑制杂波=================================%
for i=1:PulseNumber-1 %滑动对消,少了一个脉冲
mti(i,:)=pc(i+1,:)-pc(i,:);
end
figure(7);
mesh(abs(mti));title('MTI result');
% ================MTD(动目标检测),区分不同速度的目标,有测速作用=================================%
mtd=zeros(PulseNumber,SampleNumber);
for i=1:SampleNumber
buff(1:PulseNumber)=pc(1:PulseNumber,i);
buff_fft=fft(buff);
mtd(1:PulseNumber,i)=buff_fft(1:PulseNumber);
end
figure(8);mesh(abs(mtd));title('MTD result');
代码表现得非常出色,在注释部分非常清晰且语言简洁明了地说明了各个步骤的功能,在运行过程中始终能够得到准确的结果。对于一个问题不明白,在实验中发现如果将采样频率Fs减半的话,则理论上不应该影响最终的结果(如图6所示),然而实际运行后却出现了伪峰现象(如图),目前尚不清楚具体原因,请各位大神不吝赐教)。
图六.jpg
(19.82 KB, 下载次数: 3)
2017-9-17 11:23 上传


图6

