Моделирование и визуализация данных о дальности и доплеровской частоте в радиолокационной системе при наличии нескольких целей¶
В этом примере демонстрируется, как моделировать радиолокационную систему и использовать функцию calc_range_doppler_visual для визуализации данных о дальности и доплеровской интенсивности с течением времени в Engee. Измерители дальности-времени и интенсивности доплеровского времени помогают обнаружить цель в окружающей среде, показывая, как дальность цели и доплеровский параметр изменяются с течением времени.
Используемые функции¶
# функция для прогона модели
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: используется для моделирования движения цели.
Канал (Channel) и цели (Targets)
- Free Space: свободное пространство, в котором сигнал распространяется до целей и обратно до приемника, претерпевая затухание пропорциональное расстоянию до целей;
- Target: модель цели, которая отражает падающий сигнал в соответствии с поперечным сечением радара (RCS).
- Приемник (Receiver Preamp): сигнал отраженный от целей поступает на приемную антенную решетку и усиливается с добавлением собственных тепловых шумов приемника.
Приемник (Receiver)
- Narrowband Rx Array: Имитирует сигналы, принимаемые антенной.
- Receiver Preamp - усиливает принятый сигнал от цели и добавляет собственные тепловые шумы.
- Range Processing Subsystem - Выполняет согласованную фильтрацию для улучшения SNR, далее блок (Time Varying Gain) выполняет перестраиваемое усиление для компенсации потери дальности инекогерентно интегрирует 10 импульсов.
Doppler Processing Subsystem - Принятый сигнал накапливается по 10 импульсов в пачке, за которой следует БПФ для оценки доплеровской частоты (скорости) целей.
Схема работы модели представлена на рисунке ниже:
Цифровая обработка состоит из следующих элементов:
Опираясь на структурную схему, мы разработали модель радара, показанную на рисунке ниже.
2. Инициализация входных параметров¶
Для инициализации входных параметров модели подключим файл "ParamRadarVisual.jl". Если требуется изменить значения параметров, то откройте данный файл и отредактируйте необходимые параметры
include("$(@__DIR__)/ParamRadarVisual.jl")
paramRadarVisual = calcParamRadarVisual();
pulse_length = paramRadarVisual.pulse_length*100; # Длительность импульса
В модели возможна гибкая настройка антенной решетки передатчика и приемника, включающая в себя: тип элемента, геометрию антенной решетки (в моделе используется 1 изотропный излучатель, как показано ниже):
3. Запуск модели¶
Определим функцию прогона модели run_model и запустим симуляцию модели:
run_model("RadarSystemVisualExample", @__DIR__);
4. Считывание выходных данных¶
Считаем из рабочей области необходимые переменные (в нашем случае Range и Doppler):
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:
# сохранения анимации в переменных 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);
После сохранения файлов в содержании текущей папки появятся 2 файла - Visual_Range.gif и Visual_Doppler.gif, хранящие в себе динамику изменения дальности и частоты Доплера во времени:
Примеры визуализации приведены ниже:
gif(anim_range, "Visual_Range.gif", fps = 1)
gif(anim_doppler, "Visual_Doppler.gif", fps = 1)
Заключение¶
В результате, в этом примере было продемонстрировано проектирование радиолокационной система в среде Engee, а также расчет и построение визуализации информации о дальности и доплеровской частоте меняющихся с течением времени.