Адаптивное формирование луча при воздействии помехи
В этом примере демонстрируется применение алгоритмов адаптивного формирование луча MVDR и LCMV в условиях двух помеховых сигналов.
Вспомогательные функции
# запуск симуляцик системной модели
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 с заданной весовой матрицей в заданном направлении;
Структурная схема системы приведена ниже.

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])
# подключение файла с параметрами модели
include("$(@__DIR__)/ParamBeamformerI.jl");
3. Запуск модели
С помощью функции run_model
запустим симуляцию системной модели Beamformer_Interference
. Залогированные результаты симуляции запишем в переменную out
.
out = run_model("Beamformer_Interference", @__DIR__) # запуск модели
4. Считывание выходных данных
С помощью функции calc_array_out
считаем данные из переменной out
для каждого залогированного выхода.
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. Визуализация результатов работы модели
Визуализация результатов возможна двумя способами:
- во вкладке "графики" (с помощью выбора типа графиков "построение массива")
- в скрипте с использованием полученных данных в результате симуляции
С помощью первого способа визуализируем результат модели для выходов с применением формирования луча и без него:

На рисунках показан выход 3 заданных формирователей луча: PhaseShift, MVDR и LCMV. Можно заметить, что классический формирователь луча с фазовым сдвигом не справляет с задачей детекции цели на фоне помехи т.к. амплитуда помехи много больше полезного сигнала и простого увеличения отношения сигнал-шум не достаточно.
Выходной график меняется если использьвать алгоритм формирования луча MVDR и LCMV: после обработки сигнала формируется пик, соотвествующий истинному положению цели.
Аналогично, можно визуализировать результаты моделирования с помощью второго способа. Для построения в скрипте воспользуемся вспомогательной функцией plot_result
:
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)
Сравнивая полученные графики, можно заметить, что результирующие изображения идентичны
Заключение
В примере было проведено сравнение простого и адаптивных формирователей лучей на фоне сильной помеховой составляющей. Результаты показали, что обычный формирователй с фазовым сдвигом "PhaseShift Beamformer" не способен обнаружить полезный сигнал, в таких случаях необходимо прибегнуть к более продвинутым алгоритма формирования "MVDR" или "LCMV"