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

Адаптивное формивание луча при воздействии помехи

В этом примере демонстрируется применение алгоритмов адаптивного формирование луча MVDR и LCMV в условиях двух помеховых сигналов.

Вспомогательные функции

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_array_out(out, name)
    array = zeros(eltype(out[name].value[1]),size(out[name].value[1],1),size(out[name].value[2],2),length(out[name].value))
    [array[:,:,i] = collect(out[name].value[i]) for i in eachindex(out[name].value)]
    return array
end

# построение выходных графиков
default(titlefontsize=11,top_margin=-1Plots.mm,guidefont=10,
   fontfamily = "Computer Modern",colorbar_titlefontsize=8,bottom_margin = -6Plots.mm
)

function plot_result(out, title, number, t_step = 0.3)
    t = Vector(0:t_step/size(out, 1):t_step*(1-1/size(out, 1)))*1e3 # сетка времени в мс
    plot(t, out[:, 1, number], label = title, title = title,size=(500,150))
    plot!(t, out_ref_pulse[:, 1, number], label = "Эталонный сигнал", 
        xlabel = "Время (мс)", уlabel = "Амплитуда (В)"
    )
end;

1. Описание структуры модели

Модель иллюстрирует формирование луча при наличии двух мешающих сигналов, поступающих с азимутальных углов 30 и 50 градусов. Амплитуды мешающих сигналов намного больше амплитуды импульса. Уровень шума установлен на -50 дБВт, чтобы подчеркнуть только влияние помех. К принимаемому сигналу применяются алгоритмы формирования луча PhaseShift, MVDR и LCMV, и сравниваются их результаты.


Структурная схема модели базируется на примере модели классическое формирование луча с добавлением новых блоков:

  • Генератор ПСП - имитируют помеховую компоненту, имеющую нормальный закон распределения
  • Направление распространения - задает направление приема полезного сигнала и помеховых сигналов в блоке Приемная антенная решетка
  • Формирователь MVDR - реализует алгоритм формирования MVDR в заданном направлении;
  • Формирователь LCMV - реализует алгоритм формирования LCMV с заданной весовой матрицей в заданном направлении;

Структурная схема системы приведена ниже.

image_3.png

2. Инициализация параметров модели

Параметров модели задаются в файле ParamBeamformarI.jl с помощью вспомогательной функции calcParamBeamformerI. Эта функция выполняется один раз при загрузке модели. Она экспортирует в рабочую область структуру, на поля которой ссылаются диалоговые панели модели. Чтобы изменить какие-либо параметры, либо измените значения в структуре из командной строки, либо отредактируйте вспомогательную функцию и перезапустите ее для обновления структуры параметров.

Параметры модели

# параметры РЛС
propSpeed = physconst("LightSpeed") # Скорость распространения (м/с)
fc = 100e6 # Несущая частота (Гц)
lambda = propSpeed/fc # Длина волны (м)

# Параметры антенной решетки
NumElements = 10 # количество элементов
ElementSpacing = 0.5*lambda # расстояние между элементами (м)
Antenna = EngeePhased.ULA(NumElements=10,ElementSpacing=0.5*lambda)

# Параметры зондирующего сигнала
fs  = 1000; # частота дискретизации 1 кГц
prf = 1/0.3; # частота следования импульсов (Гц)

# Приемное устройство
NoisePower = 1/db2pow(50); # Мощность шума (Вт)
Gain = 0.0 # Усиление (дБ))
LossFactor = 0.0 # Потери в приемнике (дБ)

# Матрица весов для формирователя луча LCMV
steeringvec = EngeePhased.SteeringVector(SensorArray=Antenna)
cMatrix = steeringvec(fc,[43 45 47])
In [ ]:
# подключение файла с параметрами модели
include("$(@__DIR__)/ParamBeamformerI.jl");

3. Запуск модели

С помощью функции run_model запустим симуляцию системной модели Beamformer_Interference. Залогированные результаты симуляции запишем в переменную out.

In [ ]:
out = run_model("Beamformer_Interference", @__DIR__) # запуск модели
Building...
Progress 0%
Progress 10%
Progress 20%
Progress 60%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    "PhaseShift" => WorkspaceArray{Matrix{Float64}}("Beamformer_Interference/PhaseShift")
,
    "LCMV" => WorkspaceArray{Matrix{Float64}}("Beamformer_Interference/LCMV")
,
    "MVDR" => WorkspaceArray{Matrix{Float64}}("Beamformer_Interference/MVDR")
,
    "ReferencePulse" => WorkspaceArray{Vector{Float64}}("Beamformer_Interference/ReferencePulse")

)

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

С помощью функции calc_array_out считаем данные из переменной out для каждого залогированного выхода.

In [ ]:
out_ref_pulse = calc_array_out(out, "ReferencePulse") # Эталонный импульс
out_lcmv = calc_array_out(out, "LCMV") # Формиватель луча LCMV
out_mvdr = calc_array_out(out, "MVDR") # Формиватель луча MVDR
out_phase_shift = calc_array_out(out, "PhaseShift"); # Формиватель луча PhaseShift

5. Визуализация результатов работы модели

Визуализация результатов возможна двумя способами:

  • во вкладке "графики" (с помощью выбора типа графиков "построение массива")
  • в скрипте с использованием полученных данных в результате симуляции

С помощью первого способа визуализируем результат модели для выходов с применением формирования луча и без него:

beam_interf.png

На рисунках показан выход 3 заданных формирователей луча: PhaseShift, MVDR и LCMV. Можно заметить, что классический формирователь луча с фазовым сдвигом не справляет с задачей детекции цели на фоне помехи т.к. амплитуда помехи много больше полезного сигнала и простого увеличения отношения сигнал-шум не достаточно.

Выходной график меняется если использьвать алгоритм формирования луча MVDR и LCMV: после обработки сигнала формируется пик, соотвествующий истинному положению цели.

Аналогично, можно визуализировать результаты моделирования с помощью второго способа. Для построения в скрипте воспользуемся вспомогательной функцией plot_result:

In [ ]:
num_puls = length(collect(out["ReferencePulse"]).time) # извлечение номера последнего импульса
plot_result(out_phase_shift, "Формиватель PhaseShift", num_puls, t_step) |> display
plot_result(out_mvdr, "Формиватель MVDR", num_puls, t_step) |> display
plot_result(out_lcmv, "Формиватель LCMV", num_puls, t_step)
Out[0]:

Сравнивая полученные графики, можно заметить, что результирующие изображения идентичны

Заключение

В примере было проведено сравнение простого и адаптивных формирователей лучей на фоне сильной помеховой составляющей. Результаты показали, что обычный формирователй с фазовым сдвигом "PhaseShift Beamformer" не способен обнаружить полезный сигнал, в таких случаях необходимо прибегнуть к более продвинутым алгоритма формирования "MVDR" или "LCMV"