Engee documentation
Notebook

Antenna patterns (part 3)

The example demonstrates the application of an algorithm for weighting antenna elements to improve antenna pattern (DN) characteristics.

Connecting libraries and auxiliary functions

In [ ]:
using Pkg; Pkg.add("Statistics");Pkg.add("SpecialFunctions")
using SpecialFunctions,Statistics

Let's connect the file "helper_weight_failed_array.jl" with additional functions using the function include:

In [ ]:
include("$(@__DIR__)/helper_weight_failed_array.jl")
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
Out[0]:
viewURA (generic function with 1 method)

Initial antenna parameters

Before modelling the DND we set the basic parameters of the antenna elements:

In [ ]:
fc = 300e6 # частота излучения антенны
c = 3e8 # скорость распространения сигнала
lambda = c/fc # длина волны
freq_rng = [50e6 1000e6] # частотный диапазон антенны

azim_ang = reshape(Vector(-180:180),1,:) # диапазон азимутальных углов
elev_ang = reshape(Vector(-90:90),1,:); # диапазон по углу места

We choose an isotropic element as the antenna array element:

In [ ]:
element = EngeePhased.IsotropicAntennaElement(
    FrequencyRange = freq_rng, # частотный диапазон
    BackBaffled=false # обратное рассеяние
)
Out[0]:
IsotropicAntennaElement: FrequencyRange=[5.0e7 1.0e9] BackBaffled=false

Let's choose rectangular antenna array geometry URA. Let's set 2 identical antenna arrays: sURA - will be the reference AR without weighting, sURAweight - with weighting.

In [ ]:
size_array = [16 16] # размер антенной решетки

sURA = EngeePhased.URA(
    Size = size_array,
    ElementSpacing = [lambda/2 lambda/2] # задание расстояние между элементами
)
# дублирование антенной решетки
sURAweightElements = deepcopy(sURA) 
Out[0]:
URA:
    Element=IsotropicAntennaElement: FrequencyRange=[0.0 1.0e20] BackBaffled=false
    Size=[16 16]
    ElementSpacing=[0.5 0.5]
    Lattice=Rectangular
    ArrayNormal=x
    Taper=1

Additionally, using the function calcElemetPosition we calculate the position of antenna elements

In [ ]:
pos_array = calcElemetPosition(sURA)
Out[0]:
3×256 Matrix{Float64}:
  0.0    0.0    0.0    0.0    0.0   …   0.0    0.0    0.0    0.0    0.0
 -3.75  -3.75  -3.75  -3.75  -3.75      3.75   3.75   3.75   3.75   3.75
  3.75   3.25   2.75   2.25   1.75     -1.75  -2.25  -2.75  -3.25  -3.75

Visualise the AR in space using the function viewURA

In [ ]:
viewURA(pos_array) 
Out[0]:

1. Weighting of the rectangular antenna array

As a weighted function we choose the Taylor window function "TaylorSpectrumWindow"

In [ ]:
nbar = 3 # количество боковых лепестков постоянного уровня
sll = -25 # максимальный уровень боковых лепестков (дБ)

weight = zeros(size_array...) # выделение памяти под весовые коэффициенты

# Расчет весовых коэффициентов и взвешивание АР sURAweightElements
[weight[i,:].=TaylorSpectrumWindow(size_array[1],nbar, -sll) for i in 1:(size_array[2])]
sURAweightElements.Taper  = weight
Out[0]:
16×16 Matrix{Float64}:
 0.524908  0.605639  0.74989  0.928736  …  0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736  …  0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736  …  0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736     0.74989  0.605639  0.524908
 0.524908  0.605639  0.74989  0.928736  …  0.74989  0.605639  0.524908

Let's build the surface of the weighted function:

In [ ]:
surface(weight,title="Оконная функция Гаусса")
Out[0]:

This window strengthens the influence of the central elements and weakens the lateral ones, which improves the directional properties of the AR. Next, we plot the cross section of the directional diagram in the azimuthal plane before and after weighting:

In [ ]:
plot_pattern2_arrray(sURA,sURAweightElements,c,fc,["Без взвешивания" "После взвешивания"])
Out[0]:

It can be seen from the graph that the directional pattern after weighting has a significantly lower level of side lobes compared to the unweighted pattern.

2. simulation of element failure

When assessing the reliability of a radar system, it is useful to analyse how resistant the AR geometry is to the failure of random antenna elements. With the help of weighting it is possible to simulate the situation of failure of random elements of the antenna array.

Using the function rand set the probability of 10% of failure of any element of the antenna array

In [ ]:
release!(sURA) # обновление системного объекта АР
sURAfailedElements = deepcopy(sURA)  # дублирование антенной решетки

# Имитация выхода из строя элементов с вероятностью 10%
sURAfailedElements.Taper  = Float64.(rand(size_array...) .> 0.1)
Out[0]:
16×16 Matrix{Float64}:
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  …  1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  0.0  0.0  1.0  1.0  1.0  1.0  1.0     1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0     1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  0.0     0.0  1.0  1.0  1.0  1.0  1.0  1.0
 0.0  1.0  1.0  1.0  1.0  0.0  1.0  1.0     1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  …  1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  0.0  1.0  0.0  1.0  1.0  1.0     1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  0.0  1.0  0.0  1.0  0.0     1.0  1.0  1.0  1.0  1.0  1.0  0.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  0.0     1.0  1.0  1.0  1.0  1.0  1.0  1.0
 0.0  1.0  1.0  0.0  1.0  1.0  1.0  1.0     1.0  1.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  0.0  1.0  1.0  …  1.0  1.0  1.0  1.0  1.0  1.0  0.0
 1.0  0.0  1.0  1.0  1.0  1.0  1.0  1.0     0.0  1.0  1.0  1.0  1.0  1.0  1.0
 0.0  0.0  1.0  1.0  1.0  1.0  1.0  1.0     0.0  0.0  1.0  1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0     1.0  1.0  1.0  0.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0     0.0  1.0  1.0  1.0  0.0  0.0  1.0
 1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  …  1.0  1.0  1.0  1.0  1.0  1.0  0.0
In [ ]:
num_element = prod(size_array) # всего элементов

# количество сломанных элементов
num_failed_element = length(sURAfailedElements.Taper[sURAfailedElements.Taper.==0]) 

# вывод статистики сломанных элементов
println("Общее количество элементов: $(num_element)")
println("Количество сломанных элементов: $(num_failed_element) ($(round(num_failed_element/num_element*100)) %) ")
Общее количество элементов: 256
Количество сломанных элементов: 31 (12.0 %) 

To visualise the broken elements, we will use the previously mentioned function viewURA with the flag true of the parameter is_failed

In [ ]:
viewURA(
    pos_array; # координаты элементов
    is_failed=true, # флаг учета сломанных элементов
    weight = sURAfailedElements.Taper # коэффициенты работы элементов
)
Out[0]:

The figure shows that the broken elements are distributed randomly over the antenna array geometry.

Now, let us analyse the effect of the broken elements:

In [ ]:
plot_pattern2_arrray(sURA,sURAfailedElements,c,fc,["При полной работе" "После выхода из строя"])
Out[0]:

The graph shows that the main lobe remained almost unchanged, while the level of the side lobes increased slightly.

Conclusion

Thus, in the final part devoted to the construction of the DN of antenna elements and AR, the method of weighting the elements of the antenna array was considered, which allows to improve the directional characteristics of the antenna. Also, this method allowed us to model and evaluate the degree of influence of failure of individual elements with a given probability of failure.