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. 战术和技术特点

在案例研究"模拟雷达接收机的测试信号"中,设计了一种单静态脉冲雷达来模拟雷达接收机的测试信号,以满足下列要求: 1.最小有效散射面积(EDA):1$м^2$ ,无波动; 2. 无差别目标探测的最大距离:5 千米; 3. 正确瞄准概率 (VPO):0.9; 4. 误报概率 (FAP):$10^{-6}$ 。

加载雷达系统对象:

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

新要求

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

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

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

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

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

与现有设计的 30 kHz PSF 相比,新的 PSF 更小,为 18.737 kHz。因此,脉冲间隔时间更长。请注意,这只是雷达软件中微不足道的改动,而且硬件成本相当低廉。

In [ ]:
waveform.PRF = prf;

接下来,由于目标是使用Swerling-2模型描述的,因此有必要使用Schnidman 方程(而不是 Albersham 方程)来计算达到给定 VPO 和 VLT 所需的 ROS。施尼德曼方程假定使用非相干累积的二次探测器。累积脉冲数为 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.现有雷达设备的设计能产生峰值功率约为 5200 瓦的脉冲。虽然大多数设计都会在所需功率之上留出一些余量,但现有系统不太可能提供 8 倍的功率; 2.更换设备以输出如此大的功率非常昂贵。因此,必须对现有设计进行修改,采用更先进的信号处理技术,以达到新的目标。

线性频率调制(LFM)信号

降低功耗的方法之一是使用矩形信号以外的信号。例如,线性调频信号可以使用比矩形信号更长的脉冲持续时间。因此,所需的峰值发射功率就会降低。

让我们来看看 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]:

从图中可以看出,脉冲非常宽,这可能会导致测距分辨率较低。此外,第二和第三个目标完全被噪声掩盖。

一致过滤

与矩形波形一样,接收到的脉冲首先经过匹配滤波器,以提高有效值。匹配滤波器可提供处理增益,进一步提高检测阈值。此外,匹配滤波器对低频调制信号的另一个优势是,它可以压缩时域波形,使滤波后的脉冲变得更窄,从而提高量程分辨率。

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

要补偿匹配滤波器的延迟,可使用缓冲器功能。

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);

不连贯累积

现在,有必要对接收到的脉冲进行非相干累加,以进一步提高有效值。

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] м

请注意,根据雷达系统可达到的测距分辨率(在本例中为 50 米),这些测距估计值是准确的。

结论

在本例中,我们使用了低频调制信号类型进行测距探测。通过使用这种信号,我们能够降低所需的峰值发射功率,从而使目标波动模型Swerling-2的探测距离更远(8 千米)。