Документация Engee
Notebook

Моделирование и визуализация данных о дальности и доплеровской частоте в радиолокационной системе при наличии нескольких целей

В этом примере демонстрируется, как моделировать радиолокационную систему и использовать функцию calc_range_doppler_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()
    max_doppler = maximum(out_doppler)
    out_doppler.= map(x-> x> max_doppler-25 ? x : max_doppler-25,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)

  • Waveform Rectungular: источник зондирующего сигнала, генерирующий последовательность прямоугольных импульсов;
  • Transmitter: усилитель сгенерированного прямоугольного импульса;
  • Narrowband TX Array: передающий антенный элемент (или антенная решетка), формирующая диаграмму направленности;

Движение объектов (Platform)

Подсистема платформы моделирует движение радара, а также цели. Положения и скорости радара и целей используются блоком Free Space для моделирования распространения и блоком Range Angle для вычисления углов падения сигнала в местоположении цели.

  • Radar Platform: используется для моделирования движения радара. Радар установлен на стационарной платформе, расположенной в начале координат.
  • Target Platform: используется для моделирования движения цели.
  • Range Angle: используется для моделирования движения цели.

image.png

Канал (Channel) и цели (Targets)

  • Free Space: свободное пространство, в котором сигнал распространяется до целей и обратно до приемника, претерпевая затухание пропорциональное расстоянию до целей;
  • Target: модель цели, которая отражает падающий сигнал в соответствии с поперечным сечением радара (RCS).
  • Приемник (Receiver Preamp): сигнал отраженный от целей поступает на приемную антенную решетку и усиливается с добавлением собственных тепловых шумов приемника.

Приемник (Receiver)

  • Narrowband Rx Array: Имитирует сигналы, принимаемые антенной.
  • Receiver Preamp - усиливает принятый сигнал от цели и добавляет собственные тепловые шумы.
  • Range Processing Subsystem - Выполняет согласованную фильтрацию для улучшения SNR, далее блок (Time Varying Gain) выполняет перестраиваемое усиление для компенсации потери дальности инекогерентно интегрирует 10 импульсов.

image_3.png

Doppler Processing Subsystem - Принятый сигнал накапливается по 10 импульсов в пачке, за которой следует БПФ для оценки доплеровской частоты (скорости) целей.

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_model и запустим симуляцию модели:

In [ ]:
run_model("RadarSystemVisualExample", @__DIR__);
Building...
Progress 0%
Progress 0%
Progress 5%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 30%
Progress 35%
Progress 40%
Progress 45%
Progress 50%
Progress 55%
Progress 60%
Progress 65%
Progress 70%
Progress 75%
Progress 80%
Progress 85%
Progress 90%
Progress 95%
Progress 100%
Progress 100%

4. Считывание выходных данных

Считаем из рабочей области необходимые переменные (в нашем случае Range и Doppler):

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_doppler_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, а также расчет и построение визуализации информации о дальности и доплеровской частоте меняющихся с течением времени.

Блоки, использованные в примере