Engee 文档
Notebook

利用脉冲压缩估计范围和多普勒

本例演示了发射脉冲与接收信号相关时的脉冲压缩效应。 雷达和声纳系统使用脉冲压缩通过减少反射信号的持续时间来提高信噪比(SNR)和范围分辨率。 该示例还演示了多普勒处理,其中目标的径向速度由目标移动时发生的多普勒频移确定。

确定目标的范围和速度

下面介绍的雷达系统将线性频率调制(lfm)波的脉冲序列发送到移动目标并接收回波信号。 通过应用一致滤波和多普勒处理,雷达系统可以有效地确定目标的范围和速度。

让我们设置雷达系统的要求。 在本例中,使用载波频率fc=3GHz和采样频率fs=1MHz。

In [ ]:
using Pkg; Pkg.add("DSP")
using FFTW,DSP
fc = 3e9; # 载波频率,Hz
fs = 1e6; # 采样率,Hz
c = 299_792_458; # 米/秒

创建系统对象来模拟雷达系统。 该系统是单稳态的。 发射器位于(0,0,0)m处并且是静止的,并且目标以(25,25,0)m/s的速度位于(5000,500,0)m处并且具有1sq的有效散射区域(ESR)。 m.

In [ ]:
antenna = EngeePhased.IsotropicAntennaElement(FrequencyRange=[1e8 10e9]); # 天线元件
transmitter = EngeePhased.Transmitter(Gain=20,InUseOutputPort=true); # 发射器
txloc = [0;0;0]; # 发射器的位置
tgtloc = [5000;5000;0]; # 目标坐标,范围~=7071米
tgtvel = [25;25;0]; # 目标速度,相对速度~=35.4m/s
target = EngeePhased.RadarTarget(Model="Nonfluctuating",MeanRCS=1,OperatingFrequency=fc);
antennaplatform = EngeePhased.Platform(InitialPosition=txloc); # 太空中的发射器物体
targetplatform = EngeePhased.Platform(InitialPosition=tgtloc,Velocity=tgtvel); # 空间中的目标物体
radiator = EngeePhased.Radiator( # 散热器
   PropagationSpeed=c, # 传播的速度
   OperatingFrequency=fc, # 信号的载波频率
   Sensor=antenna # 天线元件
);
channel = EngeePhased.FreeSpace( # 分销渠道
   PropagationSpeed=c, # 传播的速度
   OperatingFrequency=fc, # 载波频率
   TwoWayPropagation=false # 双向方向
);
collector = EngeePhased.Collector(
   PropagationSpeed=c, # 传播的速度
   OperatingFrequency=fc, # 信号的载波频率
   Sensor=antenna # 天线元件
);
receiver = EngeePhased.ReceiverPreamp( # 发射器
   NoiseFigure=0, # 噪音系数
   EnableInputPort=true, # 用于与发射机同步的输入端口
   SeedSource="Property", # 相位噪声的PSP发生器初始值的来源
   Seed=2024 # 相位噪声的PSP发生器的值
);

创建脉冲持续时间为10微秒,脉冲重复率为10kHz,扫描带宽为100kHz的FM信号。 基于该信号生成匹配滤波器系数。

In [ ]:
waveform = EngeePhased.LinearFMWaveform( # LFM信号发生器
    PulseWidth=10e-6, # 脉冲持续时间
    PRF=10e3, # 脉冲重复率
    OutputFormat="Pulses", # 输出类型
    NumPulses=1, # 脉冲数
    SweepBandwidth=1e5 # 锯的生长时间
);
wav = waveform(); # LFM信号生成
maxrange = c/(2*waveform.PRF); # 最大一位数目标检测范围
SNR = npwgnthresh(1e-6,1,"noncoherent"); # 基于检测阈值的SNR计算
lambda = c/fc; # 波长
tau = waveform.PulseWidth; # 脉冲持续时间
Ts = 290; # 接收器噪声温度

# 一致的过滤器
Mfilter = EngeePhased.MatchedFilter( 
   Coefficients=getMatchedFilter(waveform), # 滤波器系数
   GainOutputPort=true # 传动比输出端口
);

为了提高多普勒分辨率,系统发射64个脉冲。 信号数据将存储在变量rxsig中,数据矩阵存储每列中的快速时间样本(每个脉冲内的时间)和每行中的慢时间样本(脉冲之间的时间)。

In [ ]:
numPulses = 64; # 脉冲数
rxsig = zeros(ComplexF64,length(wav),numPulses); # 输出信号的内存分配

for n = 1:numPulses
    tgtloc,tgtvel = targetplatform(1/waveform.PRF); # 目标移动参数
    tgtrng,tgtang = rangeangle(tgtloc,txloc); # 雷达运动参数
    
    txsig, txstatus = transmitter(wav); # 发射信号的形成
    txsig = radiator(txsig,tgtang); # EM波发射到太空
    txsig = channel(txsig,txloc,tgtloc,[0;0;0],tgtvel); # 通道:发射器-目标
    txsig = target(txsig); # 基于目标EPR的信号反射
    txsig = channel(txsig,tgtloc,txloc,tgtvel,[0;0;0]); # 频道:目标接收器
    txsig = collector(txsig,tgtang); # 接收天线中的信号生成
    rxsig[:,n] = receiver(txsig,xor.(txstatus,1)); # 接收信号的预放大
end

prf = waveform.PRF; # 脉冲重复率
fs = waveform.SampleRate; # 采样率
response = EngeePhased.RangeDopplerResponse(
    DopplerFFTLengthSource="Property", # 设置FFT长度源
    DopplerFFTLength=2048, # 多普勒FFT长度
    SampleRate=fs, # 采样率
    DopplerOutput="Speed", # 输出类型
    OperatingFrequency=fc, # 载波频率
    PRFSource="Property", # 恒指任务的来源
    PRF=prf # 脉冲重复率
);
filt = getMatchedFilter(waveform); # 匹配滤波器的系数
resp,rng_grid,dop_grid = response(rxsig,filt); # 范围和速度响应
rng_grid = range(extrema(rng_grid)...,length = length(rng_grid)) # 范围网格
dop_grid = range(extrema(dop_grid)...,length = length(dop_grid)) # 速度网格

# 建立dolero-range肖像
heatmap(dop_grid,rng_grid,DSP.pow2db.((abs.(resp)).^2),ylims=(0,12e3), 
    fontfamily=font(14,"Computer Modern"), xticks=(-200:50:200),
    colorbar_title = "功率,dBW",
    title=("范围-多普勒肖像"),
    margin=5Plots.mm
)
xlabel!("速度,m/s")
ylabel!("范围,m")
Out[0]:

响应指示目标正在以大约-40m/s的速度移动,并且目标正在远离发射器,因为速度是负的。

我们将计算对应于信号的传播速度的范围估计。 第一个慢时间样本的曲线图显示了7000m区域的最高峰,其对应于对范围速度的响应的曲线图。

In [ ]:
fasttime = unigrid(0,1/fs,1/prf,"[)"); # 快速时间网格
rangebins = (c*fasttime/2); # 范围分辨率

# 绘制幅度对范围的依赖性
plot(rangebins.*1e-3,
    abs.(rxsig[:,1].*1e6),
    lab="",xlabel="范围,公里",
    ylabel="振幅,MV"
)
Out[0]:

范围检测

让我们设置一个检测阈值,在该阈值下,虚警的概率将更低。 . 让我们执行64个脉冲的非相干累积,假设信号处于白高斯噪声中。 基于超过阈值的最大峰值,我们将确定目标范围估计。

In [ ]:
pfa = 1e-6; # 虚警的概率
NoiseBandwidth = 5e6/2; # 噪音波段

# 噪声功率的计算
npower = noisepow(
    NoiseBandwidth, # 噪音波段
    receiver.NoiseFigure, # 噪音系数
    receiver.ReferenceTemperature # 噪音温度
);

thresh = npwgnthresh(pfa,numPulses,"noncoherent"); # 检测阈值
thresh = npower*DSP.db2pow(thresh); # 接收灵敏度

pks,range_detect = findpeaks(pulsint(rxsig,"noncoherent"),"MinPeakHeight",thresh); # 峰值检测
range_estimate = rangebins[range_detect[1]]; # 确定范围估计
print("范围:$(round(range_estimate;sigdigits=6)),m")
Дальность: 7344.92, м

速度检测

让我们选择包含检测目标的范围样本,并使用periodagram函数绘制功率谱密度估计值。

In [ ]:
out = DSP.periodogram(rxsig[range_detect[1],:][:]; onesided=false, 
    nfft=256, fs=prf, window=nothing)
spec_power = fftshift(DSP.pow2db.(out.power))
freq = fftshift(fftfreq(256,prf))
plot(freq.*1e-3,spec_power,lab="",gridalpha=0.15)
xlabel!("频率,千赫", fontfamily="Computer Modern")
ylabel!("功率,dBW", fontfamily="Computer Modern")
title!("光谱功率密度", fontfamily="Computer Modern")
Out[0]:

峰值频率对应于多普勒频移除以2,可以转换为目标速度。 正速度意味着目标正在接近散热器,负速度意味着目标正在远离散热器。

In [ ]:
Y,I = maximum(spec_power),argmax(spec_power);
lambda = c/fc;
tgtspeed = dop2speed(freq[I]/2,lambda);
print("多普勒频移估计:ψ(freq[I]/2)Hz")
Оценка доплеровского сдвига: -351.5625 Гц
In [ ]:
print("速度估计:△(round(tgtspeed;sigdigits=4))m/s")
Оценка скорости: -35.13 м/с