Module uavnoma.generate_values
This module contains functions to generate simulation parameters.
Expand source code
"""
This module contains functions to generate simulation parameters.
"""
import numpy as np
from numpy import sqrt
import math
def random_position_uav(number_UAV, radius_UAV, uav_height):
"""Returns a random UAV position based on 3D Cartesian coordinates.
x_r: x-axis | y_r: y-axis | z_r: height
`theta_r:` randomly generates an angle
`rho_r:` radius in meter of flight trajectory UAV
`rho_u:` radius in meter of the area where users are distributed
Arguments:
number_UAV -- number of UAV.
radius_UAV -- flight trajectory of the UAV in meters.
uav_height -- average flight height
Return:
x_r, y_r, z_r -- position in the x-axis, y-axis and height of the UAV.
"""
theta_r = np.random.rand(number_UAV, 1) * (math.pi * 2)
rho_r = radius_UAV
x_r = rho_r * np.cos(theta_r)
y_r = rho_r * np.sin(theta_r)
z_r = np.random.uniform(uav_height - 5.0, uav_height + 5.0)
return x_r, y_r, z_r
def random_position_users(number_users, radiusUser):
"""Returns a random ground users position based on 2D Cartesian coordinates.
x_u: x-axis | y_u: y-axis | height is not considered
`theta_u:` randomly generates an angle
`rho_u:` radius in meter of the area where users are distributed
Arguments:
number_users -- number of users.
radiusUser -- distribution radius of users in the cell in meters.
Return:
x_u, y_u -- position in the x-axis and y-axis of the n-th user.
"""
theta_u = (np.random.rand(number_users, 1)) * (math.pi * 2)
rho_u = np.sqrt(np.random.rand(number_users, 1)) * radiusUser
x_u = rho_u * np.cos(theta_u)
y_u = rho_u * np.sin(theta_u)
return x_u, y_u
def fading_rician(K, P_los):
"""Returns the mean and standard deviation to model fading from the Rician distribution.
Arguments:
K -- Rician factor.
P_los -- power of line-of-sight path and scattered paths.
Return:
s, sigma -- mean and standard deviation to model fading from the Rician distribution.
"""
# Fading modeled by Rician distribution
s = np.sqrt(K / (K + 1) * P_los) # Non-Centrality Parameter (mean)
sigma = P_los / np.sqrt(2 * (K + 1)) # Standard deviation
return (s, sigma)
def generate_channel(
s, sigma, number_user, user_X, user_Y, uav_X, uav_Y, uav_Z, path_loss
):
"""Returns the channel gains of the users over Rician Fading. The channel gains are sorted to identify
the primary user and secondary user.
`small_scale_fading:` calculating Rician fading channel gains with complex Gaussian random variables with mean=s and variance=sigma.
`large_scale_fading:` large-scale fading
`distance:` calculating distance between UAV and users.
`h_n:` calculates channel coefficients based on the distance.
`channelGain:` calculates the channel gains and sorting in descending order.
Primary user: channelGain[0] -> min value
Secondary user: channelGain[1] -> max value
Arguments:
s -- non-Centrality Parameter (mean).
sigma -- standard deviation.
number_user -- number of user.
user_X -- position axis x of n-th user.
user_Y -- position axis y of n-th user.
uav_X -- position axis x of UAV.
uav_Y -- position axis y of UAV.
uav_z -- UAV height.
path_loss -- path loss exponent.
Return:
channel_primary -- channel gain of the primary user.
channel_secondary -- channel gain of the secondary user.
"""
# Initializing auxiliary arrays to store channel coefficients and distance between UAV and users, respectively:
h_n = np.zeros(number_user)
distance = np.zeros(number_user)
for uu in range(number_user):
# Generate small scale fading according to Rician Distribution
small_scale_fading = np.sqrt(
(np.random.normal(s, sigma) ** 2)
+ 1j * (np.random.normal(0, sigma) ** 2)
)
# Normalized distance
distance[uu] = np.sqrt(
(user_X[uu] - uav_X) ** 2 + (user_Y[uu] - uav_Y) ** 2 + uav_Z ** 2
)
# Generate path loss atenuation
large_scale_fading = sqrt( (distance[uu])**( path_loss))
# Generate channel coefficients
h_n[uu] = (
np.abs(small_scale_fading / large_scale_fading )
** 2
)
channel_primary = np.min(h_n)
channel_secondary = np.max(h_n)
return channel_primary, channel_secondary
Functions
def fading_rician(K, P_los)-
Returns the mean and standard deviation to model fading from the Rician distribution.
Arguments
K – Rician factor.
P_los – power of line-of-sight path and scattered paths.
Return
s, sigma – mean and standard deviation to model fading from the Rician distribution.
Expand source code
def fading_rician(K, P_los): """Returns the mean and standard deviation to model fading from the Rician distribution. Arguments: K -- Rician factor. P_los -- power of line-of-sight path and scattered paths. Return: s, sigma -- mean and standard deviation to model fading from the Rician distribution. """ # Fading modeled by Rician distribution s = np.sqrt(K / (K + 1) * P_los) # Non-Centrality Parameter (mean) sigma = P_los / np.sqrt(2 * (K + 1)) # Standard deviation return (s, sigma) def generate_channel(s, sigma, number_user, user_X, user_Y, uav_X, uav_Y, uav_Z, path_loss)-
Returns the channel gains of the users over Rician Fading. The channel gains are sorted to identify the primary user and secondary user.
small_scale_fading:calculating Rician fading channel gains with complex Gaussian random variables with mean=s and variance=sigma.large_scale_fading:large-scale fadingdistance:calculating distance between UAV and users.h_n:calculates channel coefficients based on the distance.channelGain:calculates the channel gains and sorting in descending order.Primary user: channelGain[0] -> min value Secondary user: channelGain[1] -> max valueArguments
s – non-Centrality Parameter (mean).
sigma – standard deviation.
number_user – number of user.
user_X – position axis x of n-th user.
user_Y – position axis y of n-th user.
uav_X – position axis x of UAV.
uav_Y – position axis y of UAV.
uav_z – UAV height.
path_loss – path loss exponent.
Return
channel_primary – channel gain of the primary user.
channel_secondary – channel gain of the secondary user.
Expand source code
def generate_channel( s, sigma, number_user, user_X, user_Y, uav_X, uav_Y, uav_Z, path_loss ): """Returns the channel gains of the users over Rician Fading. The channel gains are sorted to identify the primary user and secondary user. `small_scale_fading:` calculating Rician fading channel gains with complex Gaussian random variables with mean=s and variance=sigma. `large_scale_fading:` large-scale fading `distance:` calculating distance between UAV and users. `h_n:` calculates channel coefficients based on the distance. `channelGain:` calculates the channel gains and sorting in descending order. Primary user: channelGain[0] -> min value Secondary user: channelGain[1] -> max value Arguments: s -- non-Centrality Parameter (mean). sigma -- standard deviation. number_user -- number of user. user_X -- position axis x of n-th user. user_Y -- position axis y of n-th user. uav_X -- position axis x of UAV. uav_Y -- position axis y of UAV. uav_z -- UAV height. path_loss -- path loss exponent. Return: channel_primary -- channel gain of the primary user. channel_secondary -- channel gain of the secondary user. """ # Initializing auxiliary arrays to store channel coefficients and distance between UAV and users, respectively: h_n = np.zeros(number_user) distance = np.zeros(number_user) for uu in range(number_user): # Generate small scale fading according to Rician Distribution small_scale_fading = np.sqrt( (np.random.normal(s, sigma) ** 2) + 1j * (np.random.normal(0, sigma) ** 2) ) # Normalized distance distance[uu] = np.sqrt( (user_X[uu] - uav_X) ** 2 + (user_Y[uu] - uav_Y) ** 2 + uav_Z ** 2 ) # Generate path loss atenuation large_scale_fading = sqrt( (distance[uu])**( path_loss)) # Generate channel coefficients h_n[uu] = ( np.abs(small_scale_fading / large_scale_fading ) ** 2 ) channel_primary = np.min(h_n) channel_secondary = np.max(h_n) return channel_primary, channel_secondary def random_position_uav(number_UAV, radius_UAV, uav_height)-
Returns a random UAV position based on 3D Cartesian coordinates.
x_r: x-axis | y_r: y-axis | z_r: heighttheta_r:randomly generates an anglerho_r:radius in meter of flight trajectory UAVrho_u:radius in meter of the area where users are distributedArguments
number_UAV – number of UAV.
radius_UAV – flight trajectory of the UAV in meters.
uav_height – average flight height
Return
x_r, y_r, z_r – position in the x-axis, y-axis and height of the UAV.
Expand source code
def random_position_uav(number_UAV, radius_UAV, uav_height): """Returns a random UAV position based on 3D Cartesian coordinates. x_r: x-axis | y_r: y-axis | z_r: height `theta_r:` randomly generates an angle `rho_r:` radius in meter of flight trajectory UAV `rho_u:` radius in meter of the area where users are distributed Arguments: number_UAV -- number of UAV. radius_UAV -- flight trajectory of the UAV in meters. uav_height -- average flight height Return: x_r, y_r, z_r -- position in the x-axis, y-axis and height of the UAV. """ theta_r = np.random.rand(number_UAV, 1) * (math.pi * 2) rho_r = radius_UAV x_r = rho_r * np.cos(theta_r) y_r = rho_r * np.sin(theta_r) z_r = np.random.uniform(uav_height - 5.0, uav_height + 5.0) return x_r, y_r, z_r def random_position_users(number_users, radiusUser)-
Returns a random ground users position based on 2D Cartesian coordinates.
x_u: x-axis | y_u: y-axis | height is not consideredtheta_u:randomly generates an anglerho_u:radius in meter of the area where users are distributedArguments
number_users – number of users.
radiusUser – distribution radius of users in the cell in meters.
Return
x_u, y_u – position in the x-axis and y-axis of the n-th user.
Expand source code
def random_position_users(number_users, radiusUser): """Returns a random ground users position based on 2D Cartesian coordinates. x_u: x-axis | y_u: y-axis | height is not considered `theta_u:` randomly generates an angle `rho_u:` radius in meter of the area where users are distributed Arguments: number_users -- number of users. radiusUser -- distribution radius of users in the cell in meters. Return: x_u, y_u -- position in the x-axis and y-axis of the n-th user. """ theta_u = (np.random.rand(number_users, 1)) * (math.pi * 2) rho_u = np.sqrt(np.random.rand(number_users, 1)) * radiusUser x_u = rho_u * np.cos(theta_u) y_u = rho_u * np.sin(theta_u) return x_u, y_u