Engee 文档
Notebook

探测信号类型的选择,以提高雷达系统的射程

此示例显示波形如何影响雷达系统的检测特性。 该示例考虑了对现有雷达系统设计设定更高探测范围要求的情况。 由于旧的设计不能再提供所需的性能,因此使用了新的波形。 该示例还演示了如何模拟偏离路线的目标,模拟返回,然后确定它们的范围。

使用的函数

In [ ]:
Pkg.add(["DSP"])
   Resolving package versions...
   Installed CUDA_Driver_jll ──── v0.10.4+0
   Installed CUDA_Runtime_jll ─── v0.15.5+0
   Installed MLDataDevices ────── v1.6.11
   Installed MPItrampoline_jll ── v5.5.2+0
   Installed NVTX ─────────────── v0.3.5
   Installed Atomix ───────────── v1.1.0
   Installed NNlib ────────────── v0.9.27
   Installed IntervalArithmetic ─ v0.22.23
   Installed CUDA ─────────────── v5.6.1
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
In [ ]:
using DSP
# Функция для построения выходного отклика радара и порогового значения
function RadarPulsePlot(ReceivePulse,threshold,t,tp,num_plot::Int64)
    thresh = sqrt(threshold)*ones(length(t),num_plot)
    ReceivePulse =  Float64.(DSP.db2pow.((abs.(ReceivePulse)).^2))
    ReceivePulse[ReceivePulse.==0] .= eps(0.)
    thresh .=  DSP.db2pow.(thresh.^2)
    t = repeat(t,1,num_plot) .+ tp[1:num_plot]'
    text_title = reshape(["Импульс № $(i)" for i in 1:num_plot],1,num_plot)
    xlabel_text = [reshape(repeat([""],1,num_plot-1),1,num_plot-1) "Время, с"]
    plot(t,ReceivePulse[:,1:num_plot],layout=(num_plot,1),label="",title = text_title,
        fontfamily="Computer Modern", titlefontsize=10, guidefontsize=10, tickfontsize=10,gridalpha=0.3,lw=1.2)
    plot!(t,thresh[:,1:num_plot],layout=(num_plot,1),xlabel=xlabel_text,lw=1.2,
        ylabel = repeat(["Мощность, дБВт"],1,num_plot),label="",ls=:dash) # 
end;

function BasicMonostaticRadarExampleData()
    c = 299_792_458
    waveform = EngeePhased.RectangularWaveform(PulseWidth=100/c, 
        PRF=c/1e4,OutputFormat="Pulses",NumPulses=1,SampleRate= 2c/100);
    antenna = EngeePhased.IsotropicAntennaElement(FrequencyRange=[5e9 1.5e10]);
    radiator = EngeePhased.Radiator(Sensor=antenna,
        PropagationSpeed=c,OperatingFrequency=1e10);
    collector = EngeePhased.Collector(Sensor=antenna,
        PropagationSpeed=c,Wavefront="Plane",
        OperatingFrequency=1e10);
    transmitter = EngeePhased.Transmitter(PeakPower=5226.4791642003665401716716587543,
        Gain=20,LossFactor=0, InUseOutputPort=true,CoherentOnTransmit=true);
    receiver = EngeePhased.ReceiverPreamp(Gain=20,NoiseFigure=0, 
        ReferenceTemperature=290,SampleRate=2*c/100, PhaseNoiseInputPort=false,
        EnableInputPort=true,SeedSource="Property",Seed=1000);
    sensormotion = EngeePhased.Platform(InitialPosition=[0;0;0],Velocity=[0;0;0]);

    return waveform, antenna, radiator, collector, transmitter, receiver, sensormotion
end;

1. 战术和技术特点

在示例["模拟雷达приемника的测试信号"](https://engee.com/helpcenter/stable/ru/interactive-scripts/radars/MonostaticRadarExample.html )开发了一种单稳态脉冲雷达,用于模拟雷达接收器的测试信号,以满足以下要求:

  1. 最小有效散射面积(ESR):1 ,非波动;
  2. 最大明确目标探测范围:5公里;
  3. 正确重载的概率:0.9;
  4. 虚警概率(VLT): .

下载雷达系统对象:

In [ ]:
waveform,antenna,radiator,collector,transmitter,receiver,sensormotion = BasicMonostaticRadarExampleData();

新规定

雷达部署后,我们将增加2个新要求:

  1. 最大明确目标探测范围:5公里;
  2. 目标波动模型:"Swerling-2"

是否可以修改现有设计以实现新的性能目标? 要回答这个问题,有必要重新计算受新要求影响的参数。

受影响的第一个参数是脉冲重复率(HSI)。 需要根据新的最大个位数检测范围重新计算。

In [ ]:
prop_speed = radiator.PropagationSpeed; # скорость распространения
max_range = 8000; # максимальная дальость
prf = prop_speed/(2*max_range) # ЧСИ
print("Новая частота следования импульсов: $(round(prf*1e-3;sigdigits=5)) кГц")
Новая частота следования импульсов: 18.737 кГц

与现有设计的30kHz HSI相比,新的HSI变得更小,等于18.737kHz。 因此,脉冲之间的间隔较长。 请注意,这是雷达软件的一个微不足道的变化,在硬件成本方面相当便宜。

In [ ]:
waveform.PRF = prf;

此外,由于目标是使用Swerling-2模型描述的,因此需要使用Shnidman方程(而不是Albersham方程)来计算实现指定VPO和VLT所需的SNR。 Shnidman方程假设使用具有非相干累积的二次检测器。 要累加的脉冲数为10。

In [ ]:
num_pulse_int = 10; # количество импульсов накопления
pfa = 1e-6; # вероятность ложной тревоги
snr_min = shnidman(0.9,pfa,num_pulse_int,2) # расчет ОСШ
print("Минимальное ОСШ: $(round(snr_min;sigdigits=5)) дБ")
Минимальное ОСШ: 6.1583 дБ

2. 选择信号类型

如果我们在现有设计中使用相同的矩形波形,脉冲宽度将保持不变,因为它是由范围分辨率决定的。 然而,我们的最大射程从5公里增加到8公里,并且目标模型从无波动模型切换到Swerling-2模型,我们需要重新计算所需的峰值发射功率。

In [ ]:
fc = radiator.OperatingFrequency; # несущая частота
lambda = prop_speed/fc; # длина волны
peak_power = ((4*pi)^3*noisepow(1/waveform.PulseWidth)*max_range^4*
    DSP.db2pow(snr_min))/(DSP.db2pow(2*transmitter.Gain)*1*lambda^2) # расчет пиковой мощности
print("Пиковая мощность передатчика: $(round(peak_power*1e-3;sigdigits=5)) кВт")
Пиковая мощность передатчика: 44.821 кВт

峰值功率比以前的要求高出约八倍。 这样的设备改进不那么容易实现,原因有两个:

  1. 现有的雷达设备被设计成接收峰值功率约为5,200瓦的脉冲。 虽然大多数设计都在所需功率之上留下一些余量,但现有系统不太可能提供八倍以上的功率。;
  2. 更换用于输出如此高功率的设备是非常昂贵的。 因此,必须通过使用更复杂的信号处理技术来修改当前的设计以满足新的目标。

线性频率调制(LFM)信号

降低功耗的一种方法是使用矩形信号以外的信号。 例如,线性FM信号可以使用比矩形更长的脉冲。 结果,所需的峰值发送功率降低。

让我们来看看LFM信号的配置细节。

所需的范围分辨率决定了信号的带宽。 对于LFM信号,带宽等于其扫描宽度。 然而,脉冲宽度不再受脉冲带宽的倒数限制,因此可以使用大得多的脉冲宽度。 我们使用20倍大的脉冲宽度,并设置两倍于脉冲带宽的采样率。

In [ ]:
range_res = 50; # разрешение по дальности
pulse_bw = prop_speed/(2*range_res); # ширина спектра ЛЧМ-сигнала
pulse_width = 20/pulse_bw; # длительность импульса ЛЧМ-сигнала
fs = 2*pulse_bw; # частота дискретизации

waveform = EngeePhased.LinearFMWaveform(
    SweepBandwidth=pulse_bw,
    PulseWidth=pulse_width,
    PRF=prf,
    SampleRate=fs
);

现在,让我们定义实现设计要求所需的新的所需发射功率。

In [ ]:
peak_power = ((4*pi)^3*noisepow(1/waveform.PulseWidth)*max_range^4*
    DSP.db2pow(snr_min))/(DSP.db2pow(2*transmitter.Gain)*1*lambda^2)
    
print("Пиковая мощность передатчика: $(round(peak_power*1e-3;sigdigits=5)) кВт")
Пиковая мощность передатчика: 2.2411 кВт

这种功率与我们现有雷达系统的能力完全一致。 我们已经达到了一个峰值容量,可以满足新的要求,而无需修改现有设备。

In [ ]:
release!(transmitter)
transmitter.PeakPower = peak_power;

3. 系统建模

现在我们已经根据设计规范确定了雷达,我们将设置目标和环境来模拟整个系统。

目标

与上面的例子一样,我们假设在自由空间环境中有3个目标。 但是,现在目标模型是目标波动模型-"Swerling-2"。 我们将设置雷达和目标的位置,以及EPR目标

In [ ]:
tgtpos = [[2024.66; 0; 0] [6518.63; 0; 0] [6845.04; 0; 0]];  # компоненты начального положения целей
tgtvel = [[0;0;0] [0;0;0] [0;0;0]]; # компоненты скорости целей
tgtmotion = EngeePhased.Platform(InitialPosition=tgtpos,Velocity=tgtvel); # модель движения целей

tgtrcs = [2.2 1.1 1.05]; # ЭПР целей
fc = radiator.OperatingFrequency; # несущая частота
target = EngeePhased.RadarTarget(
    Model="Swerling2", # модель флуктуации
    MeanRCS=tgtrcs, # среднее значение ЭПР цели
    OperatingFrequency=fc # несущая частота
);

分销环境

接下来,我们将在雷达和每个目标之间建立一个分配通道。

In [ ]:
channel = EngeePhased.FreeSpace(
    SampleRate=waveform.SampleRate, # частота дискретизации
    TwoWayPropagation=true, # двунаправленное распространение сигнала
    OperatingFrequency=fc # несущая частота
);

信号合成

让我们设置在接收器中产生噪声的初始值,以便我们可以重现相同的结果。

In [ ]:
release!(receiver) # сброс внутреннего состояния объекта (измненеие )
receiver.SeedSource = "Property"; # изменение тип модели генерации шума
receiver.Seed = 2024; # задание начального состояния генератора тепловых шумов

fast_time_grid =  unigrid(0,1/fs,1/prf,"[)") # сетка быстрого времени
slow_time_grid = (0:num_pulse_int-1)./prf; # сетка медленного времени

# Выделение памяти для результирующих данных
rxpulses = zeros(ComplexF64,length(fast_time_grid),num_pulse_int);

for m = 1:num_pulse_int
    
    # Обновление пложения радара и целей
    sensorpos,sensorvel = sensormotion(1/prf);
    tgtpos,tgtvel = tgtmotion(1/prf);

    # Расчет углов по дальности от радара до целей  
    global tgtrng,tgtang = rangeangle(tgtpos,sensorpos);
    
    # Моделирование распространения сигнала от радара до целей
    pulse = waveform(); # генератор ЛЧМ-сигнала
    txsig,txstatus = transmitter(pulse); # усилитель передающего сигнала
    txsig = radiator(txsig,tgtang); # излучатель сгенерированного сигнала в среду
    txsig = channel(txsig,sensorpos,tgtpos,sensorvel,tgtvel); # среда распространения

    # Отражение сигнала от целей с учетом ЭПР
    tgtsig = target(txsig,true);
    
    # Прием и предварительного усиление отраженного сигнала
    rxsig = collector(tgtsig,tgtang); # приемная антенна
    rxpulses[:,m] = receiver(rxsig, .!(txstatus.>0) ); # предусилитель
end

4. 确定范围估计

检测阈值的计算

检测阈值是使用噪声信息计算的,同时考虑到累积脉冲的数量。 请注意,在负载系统中,如上例所示,噪声带宽是采样频率的一半。 我们将阈值与前两个脉冲一起绘制。

In [ ]:
noise_bw = receiver.SampleRate/2;
npower = noisepow(noise_bw,
    receiver.NoiseFigure,receiver.ReferenceTemperature);
threshold = npower * db2pow(npwgnthresh(pfa,num_pulse_int,"noncoherent"));

pulseplotnum = 2;
RadarPulsePlot(rxpulses,threshold,fast_time_grid,slow_time_grid,pulseplotnum)
Out[0]:

该图显示脉冲非常宽,这可能导致较差的范围分辨率。 此外,第二和第三目标完全被噪声掩盖。

一致的过滤

与矩形波形的情况一样,接收到的脉冲首先通过匹配滤波器以提高SNR。 匹配滤波器在处理期间提供增益,这进一步增加了检测阈值。 此外,用于高频信号的匹配滤波器的一个附加优点是它在时域中压缩波形,使得滤波脉冲变得窄得多,从而导致更好的范围分辨率。

In [ ]:
matchingcoeff = getMatchedFilter(waveform);
matchedfilter = EngeePhased.MatchedFilter(
    CoefficientsSource="Property",
    Coefficients=matchingcoeff,
    GainOutputPort=true
);
rxpulses, mfgain = matchedfilter(rxpulses);
threshold = threshold * DSP.db2pow(mfgain);

要补偿匹配滤波器中的延迟,请使用buffer函数。

In [ ]:
matchingdelay = size(matchingcoeff,1)-1;
rxpulses = buffer(rxpulses[(matchingdelay+1):end][:,:],size(rxpulses,1));

然后将时变增益应用于信号,以便对所有范围使用恒定阈值。

In [ ]:
range_gates = prop_speed*fast_time_grid/2; 
lambda = prop_speed/fc;

tvg = EngeePhased.TimeVaryingGain(
    RangeLoss=2*fspl(Vector(range_gates),lambda),
    ReferenceLoss=2*fspl(max_range,lambda));
rxpulses = tvg(rxpulses);

不连贯的积累

现在,有必要不连贯地累积接收脉冲以进一步提高SNR。

In [ ]:
rxpulses = pulsint(rxpulses,"noncoherent");
RadarPulsePlot(rxpulses,threshold,fast_time_grid,slow_time_grid,1)
Out[0]:

积累后,数据准备好进行最后阶段的检测。 从上图中,我们可以看到没有误报。

消除目标范围

最后,基于累积的脉冲执行阈值确定。 检测电路识别峰值,然后将它们的位置转换为目标的范围。

In [ ]:
_,range_detect = findpeaks(rxpulses,"MinPeakHeight",sqrt(threshold));

真实和估计的目标范围如下:

In [ ]:
true_range = round.(tgtrng;sigdigits=4)
println("Истинная дальность: $(true_range) м")
Истинная дальность: [2025.0 6519.0 6845.0] м
In [ ]:
range_estimates = round.(range_gates[range_detect];sigdigits=4)
print("Оценка дальности: $(range_estimates) м")
Оценка дальности: [2025.0, 6525.0, 6850.0] м

请注意,这些范围估计基于雷达系统可以实现的范围分辨率是准确的,在本例中为50m。

结论

在此示例中,我们使用来自LFM的信号类型来确定范围。 使用这种类型的信号,可以降低所需的峰值发射功率,实现目标波动模型-Swerling-2的更长检测范围(8km)。