import logging
import os
from math import log10
from .constants import SPEED_OF_LIGHT
[docs]def lin_to_db(val):
"""Linear value to decibels
Args:
val : Linear scale value.
Returns:
Corresponding value in decibels.
"""
return 10 * log10(val)
[docs]def db_to_lin(val_db):
"""Decibels to linear value
Args:
val : Value in decibels.
Returns:
Corresponding value in linear scale.
"""
return 10**(val_db / 10)
[docs]def dbw_to_dbm(val_dbw):
"""Convert dBW to dBm
Args:
val_dbw : Value in dBW (decibels above 1 Watt).
Returns:
Value in dBm (decibels above 1 milliwatt).
"""
return val_dbw + 30
[docs]def dbm_to_dbw(val_dbm):
"""Convert dBm to dBW
Args:
val_dbm : Value in dBm (decibels above 1 milliwatt).
Returns:
Value in dBW (decibels above 1 Watt).
"""
return val_dbm - 30
[docs]def wavelength(freq):
"""Compute the radio wavelength for a given frequency
Args:
freq : Radio frequency in Hz.
Returns:
Wavelength in meters.
"""
return SPEED_OF_LIGHT / freq
def _format_unit(value, thresholds, units):
"""Generate "value unit" string with an adequately scaled unit
Select the highest unit that keeps the scaled value above unit. If none of
the scaled values are above unit, output the lowest value (based on the
lowest threshold).
For example, consider the scaling of a bit rate of 1e4 bps with thresholds
of 1e6 for Mbps, 1e3 for kbps, and 1 for bps. The implementation scans the
thresholds in descending order, i.e., starting from 1e6, then 1e3, then
1. In the given example, the value of 1e4 is equivalent to 0.01 Mbps, which
is below unit (i.e., < 1). Hence, this first threshold is not suitable, and
the implementation proceeds to the next. The next threshold is of 1e3
(kbps) and results in 10 kbps. This value is above unit. Hence, the loop
stops there and output 10 kbps.
Args:
value : Value to output as a string accompanied by the unit.
thresholds : List of thresholds used to select the appropriate unit.
units : List of strings with the units corresponding to each threshold.
Returns:
"value unit" string.
"""
original_value = value
zipped = zip(thresholds, units)
for t, u in sorted(zipped, key=lambda t: t[0], reverse=True):
value = original_value / t
unit = u
if (original_value >= t):
break
return "{:.2f} {}".format(value, unit)
[docs]def log_result(parameter, value):
"""Log parameter-value result
Args:
parameter : Parameter to log.
value : Corresponding value.
"""
logging.info("{:30s} | {:30s}".format(parameter, value))
[docs]def get_home_dir():
"""Get the user's home directory even if running with sudo"""
sudo_user = os.environ.get('SUDO_USER')
user = sudo_user if sudo_user is not None else ""
return os.path.expanduser("~" + user)
[docs]def get_default_lb_dir():
"""Get the default directory for link-budget-specific files"""
return os.path.join(get_home_dir(), ".link-budget")