Beam Steering

using Plots;
gr();

using ArrayRadiation


# Place elements symmetrically around zero
element_separation_λ = 1/2;
element_count = 64;
r = ArrayRadiation.linear_array(element_count, element_separation_λ)


angleRad = LinRange(π / 2, -π / 2, 501);
angleDeg = rad2deg.(angleRad);

k_xyz = 2π*Kspace.elevation2k_hat.(angleRad)

element_gain_approximation = AntennaElement.cos_taper.(angleRad)

"""
Inter-element phase shift for scanning in direction θ [rad].
"""
α(θ, d_λ) = 2π*d_λ*sin(θ);

# Angles at which to scan the array.
scan_angles = LinRange(-π / 2, π / 2, 81);

# Use Hanning element weights.
Wp = Window.cosine_q(element_count, 2)

plt1 = plot();

anim = @animate for (index, scan_angle) in enumerate(scan_angles)

	phase_increment = α(scan_angle, 1/2)
	W_ang = LinRange(0, (element_count - 1) * phase_increment, element_count)

	# Antenna element complex weight
	W = Wp.*exp.(im .* W_ang) # Example of pointing to an angle.

	# Map K-space gain calculation function.
	GΩ(k) = ArrayRadiation.Kspace.gain_1D(k, 1, r, W)

	GΩ_lin = broadcast(GΩ, k_xyz).*element_gain_approximation
	GΩ_dB = broadcast(ArrayRadiation.DspUtility.pow2db, abs.(GΩ_lin))

	plot(angleDeg, GΩ_dB,
		xlabel = "Angle [deg]",
		ylabel = "GΩ [dB]",
		title  = "Array Gain",
		ylims  = (-80, 20),
		reuse  = true,
		legend = false
		)
end

gif(anim, "array_scan.gif", fps = 10)
Example block output