Engee 文档
Notebook

多目标雷达系统中距离和多普勒频率数据的建模和可视化

此示例演示如何对雷达系统进行建模,并使用calc_range_dopper_visual函数在Engee中随时间推移可视化范围和多普勒强度数据。 距离时间和多普勒时间强度计通过显示目标的距离和多普勒参数随时间的变化来帮助检测环境中的目标。

使用的函数

In [ ]:
# функция для прогона модели
function run_model( name_model, path_to_folder ) 
    Path = path_to_folder * "/" * name_model * ".engee"
    if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
        model = engee.open( name_model ) # Открыть модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
        # engee.close( name_model, force=true ); # Закрыть модель
    else
        model = engee.load( Path, force=true ) # Загрузить модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
        # engee.close( name_model, force=true ); # Закрыть модель
    end
    return model_output
end;

# функция построения динамическогой визуализации изменения дальности и частоты Доплера
function calc_range_doppler_visual(out_range,out_doppler,time_simulation,paramRadarVisual) 
    gr()
    out_doppler .= 20log10.(out_doppler .+ eps(1.0))
    max_doppler = maximum(out_doppler)
    out_doppler.= map(x-> x> max_doppler-5 ? x : max_doppler-5,out_doppler)
    num_step = ceil(Int64,size(out_range,3)/20) # шаг по отсчетам в симуляции

    # Выделение памяти для заполнения данных симуляции
    viz_Range = fill(NaN,size(out_range)...)
    viz_Doppler = fill(NaN,size(out_doppler)...)

    # Задание осей для построения динамического графика
    x_axis_range = Vector(range(start=0,stop=paramRadarVisual.max_range,length=size(viz_Range,1)))
    y_axis_range = Vector(range(start=0,stop=time_simulation,length=size(viz_Range,3)))
    x_axis_doppler = Vector(range(start=paramRadarVisual.DopplerOff,
        stop=-paramRadarVisual.DopplerOff,length=size(viz_Doppler,1)))
    y_axis_doppler = Vector(range(start=0,stop=time_simulation,length=size(viz_Doppler,3)))

    plot_range = heatmap(ylabel="Время,с", xlabel="Дальность,м",font_family="Computer Modern",
        title="Изменение дальности целей во времени",title_font=font(12,"Computer Modern"),
        colorbar_title="Мощность, мкВт",color=:viridis,size = (600,400))
    plot_doppler = heatmap(ylabel="Время,с", xlabel="Частота Доплера, Гц",font_family="Computer Modern",
        title="Изменение частоты Доплера целей во времени",title_font=font(12,"Computer Modern"),
        colorbar_title="Мощность, дбВт",color=:viridis,size = (600,400))

    @info "Построение визуализации изменения дальности целей от времени..." 

    anim1 = @animate for i in 1:num_step:size(viz_Range,3)
        @info "$(round(100*i/size(viz_Range,3))) %"
        viz_Range[:,:,1:i] .= out_range[:,:,1:i]*1e6
        heatmap!(plot_range,x_axis_range,y_axis_range,permutedims(viz_Range[:,1,:]),colorscale= :haline)
        (i+num_step > size(viz_Range,3)) && (heatmap!(plot_range,x_axis_range,y_axis_range,
            permutedims(out_range[:,1,:]*1e6),colorscale= :haline); @info "100.0 %")
    end
    @info "Построение визуализации изменения частоты Доплера от времени ..."
    anim2 = @animate for i in 1:num_step:size(viz_Doppler,3)
         @info "$(round(100*i/size(viz_Doppler,3))) %"
        viz_Doppler[:,:,1:i] .= out_doppler[:,:,1:i]
        heatmap!(plot_doppler,x_axis_doppler,y_axis_doppler,permutedims(viz_Doppler[:,1,:]),colorscale= :haline)
        (i+num_step > size(viz_Doppler,3)) && (heatmap!(plot_doppler,x_axis_doppler,y_axis_doppler,
            permutedims(out_doppler[:,1,:]),colorscale= :haline); @info "100.0 %")
    end
    return anim1,anim2
end;

1. 模型结构的描述

让我们仔细看看模型的结构图:

发射器(Transmitter)

*波形矩形:产生矩形脉冲序列的探测信号源;
*发射器:生成的矩形脉冲的放大器;
*窄带TX阵列:形成方向图的发射天线元件(或天线阵列);

物体(平台)的移动

平台的子系统模拟雷达的运动,以及目标。 雷达和目标的位置和速度由自由空间块用于模拟传播,并由范围角块用于计算信号在目标位置的入射角。

*雷达平台:用于模拟雷达运动。 雷达安装在位于原点的静止平台上。
*目标平台:用于模拟目标运动。
*范围角度:用于模拟目标运动。

image.png
通道和目标

*自由空间:信号传播到目标并返回接收器的自由空间,经历与到目标的距离成比例的衰减;
*Target:根据雷达截面(rcs)反映入射信号的目标模型。
*接收器(接收器前置放大器):从目标反射的信号到达接收天线阵列,并通过添加接收器自身的热噪声进行放大。

接收器(Receiver)

*窄带Rx阵列:模拟天线接收的信号。
*接收器前置放大器-放大来自目标的接收信号并添加其自身的热噪声。
*范围处理子系统-执行一致滤波以提高SNR,然后块(时变增益)执行可调增益以补偿范围损失并不连贯地集成10个脉冲。

image_3.png

多普勒处理子系统-接收信号每包累积10个脉冲,然后进行FFT以估计目标的多普勒频率(速度)。

image_4.png

该模型的运行方案如下图所示。:
image.png

数字处理由以下元素组成:
image_2.png

基于框图,我们开发了下图所示的雷达模型。

image_2.png

2. 输入参数的初始化

要初始化模型的输入参数,我们将连接文件"ParamRadarVisual。jl"。 如果您需要更改参数值,请打开此文件并编辑必要的参数。

In [ ]:
include("$(@__DIR__)/ParamRadarVisual.jl")
paramRadarVisual = calcParamRadarVisual();
pulse_length = paramRadarVisual.pulse_length*100; # Длительность импульса

发射器和接收器的天线阵列的灵活配置在模型中是可能的,包括:元件类型,天线阵列几何形状(模型使用1个各向同性辐射器,如下所示):

image_2.png

3. 启动模型

定义模型的run函数run_model并运行模型的仿真:

In [ ]:
run_model("RadarSystemVisualExample", @__DIR__);
Building...
Progress 0%
Progress 5%
Progress 8%
Progress 13%
Progress 18%
Progress 23%
Progress 28%
Progress 33%
Progress 38%
Progress 43%
Progress 48%
Progress 53%
Progress 58%
Progress 63%
Progress 68%
Progress 73%
Progress 78%
Progress 83%
Progress 88%
Progress 93%
Progress 98%
Progress 100%
Progress 100%

模拟结果可以使用图形类型**"强度图"可视化**:

image_2.png

在距离-时间图的图形上,您可以看到3个目标:一个正在接近雷达,第二个正在移开,3个静止不动。 此外,在范围-多普勒图上观察到多普勒频率的估计。

动态可视化的结果显示在视频"VizualizeDiagramm。gif"

4. 读取输出数据

我们从工作区计算必要的变量(在我们的例子中RangeDoppler):

In [ ]:
out_Range = zeros(Float64,size(Range.value[1],1),size(Range.value[2],2),length(Range.value))
[out_Range[:,:,i] = collect(Range.value[i]) for i in eachindex(Range.value)]

out_Doppler = zeros(Float64,size(Doppler.value[1],1),size(Doppler.value[2],2),length(Doppler.value))
[out_Doppler[:,:,i] = collect(Doppler.value[i]) for i in eachindex(Doppler.value)]

time_simulation = Range.time[end];

5. 显示结果

使用先前计算的数据,我们将通过多普勒范围和频率构建系统响应的可视化。 为此,请调用calc_range_dopper_visual函数。:

In [ ]:
# сохранения анимации в переменных anim_range,anim_doppler
anim_range,anim_doppler = calc_range_doppler_visual(out_Range,out_Doppler,time_simulation,paramRadarVisual)
# Сохранение визуализации отклика в файле формата .gif
gif(anim_range, "Visual_Range.gif", fps = 1)
gif(anim_doppler, "Visual_Doppler.gif", fps = 1);
[ Info: Построение визуализации изменения дальности целей от времени...
[ Info: 0.0 %
[ Info: 5.0 %
[ Info: 10.0 %
[ Info: 15.0 %
[ Info: 20.0 %
[ Info: 25.0 %
[ Info: 30.0 %
[ Info: 35.0 %
[ Info: 40.0 %
[ Info: 45.0 %
[ Info: 50.0 %
[ Info: 55.0 %
[ Info: 60.0 %
[ Info: 65.0 %
[ Info: 70.0 %
[ Info: 75.0 %
[ Info: 80.0 %
[ Info: 85.0 %
[ Info: 90.0 %
[ Info: 95.0 %
[ Info: 100.0 %
[ Info: Построение визуализации изменения частоты Доплера от времени ...
[ Info: 0.0 %
[ Info: 5.0 %
[ Info: 10.0 %
[ Info: 15.0 %
[ Info: 20.0 %
[ Info: 25.0 %
[ Info: 30.0 %
[ Info: 35.0 %
[ Info: 40.0 %
[ Info: 45.0 %
[ Info: 50.0 %
[ Info: 55.0 %
[ Info: 60.0 %
[ Info: 65.0 %
[ Info: 70.0 %
[ Info: 75.0 %
[ Info: 80.0 %
[ Info: 85.0 %
[ Info: 90.0 %
[ Info: 95.0 %
[ Info: 100.0 %
[ Info: Saved animation to /user/start/examples/radars/radarsystemvisualexample/Visual_Range.gif
[ Info: Saved animation to /user/start/examples/radars/radarsystemvisualexample/Visual_Doppler.gif

保存文件后,当前文件夹的内容中会出现2个Visual_Range文件。gif和Visual_Doppler.gif,它存储多普勒范围和频率随时间变化的动态:

image_2.png

可视化的例子如下:

In [ ]:
gif(anim_range, "Visual_Range.gif", fps = 1)
[ Info: Saved animation to /user/start/examples/radars/radarsystemvisualexample/Visual_Range.gif
Out[0]:
No description has been provided for this image
In [ ]:
gif(anim_doppler, "Visual_Doppler.gif", fps = 1)
[ Info: Saved animation to /user/start/examples/radars/radarsystemvisualexample/Visual_Doppler.gif
Out[0]:
No description has been provided for this image

结论

因此,该示例演示了在Engee环境中雷达系统的设计,以及有关范围和多普勒频率随时间变化的信息的计算和可视化。

示例中使用的块