Advertisement

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 上传

442a53943febe9465fc072b4fbe10813.gif
b2a5a3e0dcc7d508e00275fe42fce1b5.gif

图6

b0835b3b5da9abc5c5a8df3afd20d5d9.png

全部评论 (0)

还没有任何评论哟~