Source code for comyx.propagation.pathloss
from __future__ import annotations
from typing import Any
import numpy as np
import numpy.typing as npt
from ..utils import pow2db
NDArrayFloat = npt.NDArray[np.floating[Any]]
[docs]
def get_pathloss(
distance: float,
type: str,
frequency: float,
*args,
**kwargs,
) -> NDArrayFloat:
"""Get path loss in dB.
Reference:
alpha: Path loss exponent.
p0: Reference path loss at 1m.
Log Distance:
d0: The breakpoint distance.
alpha: The path loss exponent.
sigma: The shadow fading standard deviation.
Args:
distance: Distance between transmitter and receiver.
type: Path loss model type. ("reference", "friis", "log-distance")
frequency: Frequency of the signal.
*args: Positional arguments for the path loss model.
**kwargs: Keyword arguments for the path loss model.
Returns:
Path loss in dB.
"""
if type == "reference":
return reference(distance, *args, **kwargs)
if type == "friis":
return friis(distance, frequency)
elif type == "log-distance":
return log_distance(distance, frequency, *args, **kwargs)
else:
raise NotImplementedError(f"Path loss model {type} not implemented.")
def reference(distance: float, alpha: float, p0: float) -> NDArrayFloat:
"""General path loss model.
Args:
distance: Distance between transmitter and receiver.
alpha: Path loss exponent.
p0: Reference path loss at 1m.
Returns:
loss: Path loss in dB.
"""
loss = p0 + 10 * alpha * np.log10(distance)
return np.array(loss)
def friis(distance: float, frequency: float) -> NDArrayFloat:
"""Friis path loss model.
Args:
distance: Distance between transmitter and receiver.
frequency: Frequency of the signal.
Returns:
loss: Path loss in dB.
"""
lambda_ = 3e8 / frequency
loss = 20 * np.log10(4 * np.pi * distance / lambda_)
return loss
def log_distance(
distance: float, frequency: float, d0: float, alpha: float, sigma: float
) -> NDArrayFloat:
"""Log distance path loss model.
Args:
distance: Distance between transmitter and receiver.
frequency: Frequency of the signal.
d0: Break distance.
alpha: Path loss exponent.
sigma: Shadow fading standard deviation.
Returns:
loss: Path loss in dB.
"""
lambda_ = 3e8 / frequency
loss_break = 20 * np.log10(4 * np.pi * d0 / lambda_)
loss = (
loss_break + 10 * alpha * np.log10(distance / d0) + np.random.normal(0, sigma)
)
return loss
__all__ = ["get_pathloss"]