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

Формивание луча на основе фазового сдвига

В этом примере показано, как применить классическое формирование луча с учетом фазового сдвига к узкополосному сигналу, принимаемому антенной решеткой. Модель системы включает в себя собственный шум приемного устройства.

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

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

# построение выходных графиков
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)))*10^3 # сетка времени в мс
    plot(t, out[:, 1, number], label = title, title = title,size=(500,250))
    plot!(t, out_ref_pulse[:, 1, number], label = "Эталонный сигнал", 
        xlabel = "Время (мс)", уlabel = "Амплитуда (В)"
    )
end;

На рисунках показан выход одиночного элемента (без формирования луча) с опорным импульсом и выход формирователя луча вместе с опорным импульсом. Когда принимаемый сигнал не сформирован по лучу, импульс не может быть обнаружен из-за шума. Изображение выхода формирователя луча показывает, что сформированный лучом сигнал намного больше шума. Выходной SNR примерно в 10 раз больше, чем сигнал, принятый на одну антенну, поскольку 10-элементная решетка дает коэффициент усиления 10.

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

Модель имитирует прием прямоугольного импульса со смещенной задержкой на 10-элементную равномерно линейную антенную решетку (АР). Источник импульса расположен по направлению: азимутальный угол 45 градусов и угол места 0 градусов. На каждом элементе решетки к сигналу добавляется шум мощностью 0,5 Вт. Затем применяется формирователь луча, учитывающий фазовый сдвиг между элементами АР. В примере сравнивается выход формирователя луча с сигналом, принятым одним элементов антенны.

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

image_3.png

Реализация системы состоит из моделирования принимаймого сигнала, приема сигнала и обработки сигнала. Каждому этапу модели соответствуют следующие блоки:

Моделирование сигналов:

  • Генератор прямоугольных импульсов (Rectangular) - Создает прямоугольные импульсы.

  • Задержка (Offset waveform) - Блок задержки задерживает каждый импульс на 150 отсчетов.

Прием сигнала:

  • Прием узкополосного излучения с использованием фазированной решетки (Narrowband Rx Array) - моделирует сигналы, принимаемые на АР. Первым входом в этот блок является вектор-столбец, содержащий принятые импульсы. Предполагается, что импульсы являются узкополосными с несущей частотой, равной рабочей частоте, указанной в диалоговой панели блока. Второй вход "Ang" задает направление падения импульсов. Конфигурация антенной решетки создается в вкладке "Sensor Array" диалоговой панели блока. Каждый столбец выходных данных соответствует сигналу, принятому на каждом элементе антенной решетки.

  • Предусилитель приемника (Receiver Preamp) - реализует предварительное усиление принятого сигнала АР. Блок учитывает собственный тепловой шум приемного устройства.

  • Направление прихода сигнала (Signal direction) - задает направление прихода импульсов к блоку Narrowband Rx Array.

Обработка сигналов:

  • Направление формирования луча (Angle to beamform) - Блок Constant задает формирователю луча направление прихода сигнала.

  • Фазовый сдвиг формирователя луча (Phase Shift Beamformer) - выполняет узкополосное формирование луча с учетом фазового сдвига для каждого элемента антенной решетки.

Характеристики антенной решетки можно задать во вкладке Sensor Array блока "Phase Shift Beamformer". Пример параметризированной инициализации линейной антенной решетки из 10 элементов представлен на рисунке ниже.

snimok_ekrana_2025_03_21_152100.png

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

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

image.png

In [ ]:
# подключение файла с параметрами модели
include("$(@__DIR__)/ParamBeamformer.jl");

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

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

In [ ]:
out = run_model("Beamformer_with_noise", @__DIR__) # запуск модели
Building...
Progress 0%
Progress 10%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    "Эталонный_импульс" => WorkspaceArray{Vector{Float64}}("Beamformer_with_noise/Эталонный_импульс")
,
    "После_формирования" => WorkspaceArray{Matrix{Float64}}("Beamformer_with_noise/После_формирования")
,
    "Без_формирования" => WorkspaceArray{Vector{Float64}}("Beamformer_with_noise/Без_формирования")

)

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

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

In [ ]:
out_ref_pulse = calc_array_out(out, "Эталонный_импульс")
out_beamformer = calc_array_out(out, "После_формирования")
out_not_beamformer = calc_array_out(out, "Без_формирования");

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

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

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

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

newplot_1.png newplot_2.png

На рисунках показан выход одиночного элемента (без формирования луча) с опорным импульсом и выход формирователя луча вместе с опорным импульсом. Когда принимаемый сигнал не сформирован по лучу, импульс не может быть обнаружен из-за шума.

Ситуация меняется если использьвать алгоритм формирования луча: нижний график демонстрирует, что сигнал, сформированный лучом, заметно больше шума. Такой результат достигается с помощью того, что выходное отношение сигнал-шум возрастает соразмерно количеству антенных элементов (примерно в 10 раз) по сравнению с сигналом до применения алгорима.

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

In [ ]:
num_puls = length(collect(out["Эталонный_импульс"]).time) # извлечение номера последнего импульса
plot_result(out_not_beamformer, "Без формирования", num_puls, t_step) |> display
plot_result(out_beamformer, "После формирования", num_puls, t_step)
Out[0]:

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

Заключение

В примере был рассмотрен алгоритм формирования луча,учитывающий фазовый сдвиг между антенными элементами ("Phase Shift Beamformer"). Использование алгоритма в приемном тракте позволило успешно продетектировать полезный сигнал на фоне собственного шума приемника.