Program Listing for File comms_utils.cc

Return to documentation for file (measurements/comms_utils.cc)

#include "lupnt/measurements/comms_utils.h"

#include "lupnt/core/constants.h"

namespace lupnt {

  Real SigmaDll(const DllParams& params, Real CN0_w) {
    Real B_dll = params.B_dll;
    Real T_i = params.T_i;
    Real d = params.d;
    Real Tc = params.Tc;
    Real B_fe = params.B_fe;

    Real term_1 = B_dll / (2.0 * CN0_w);
    Real term_2 = 0.0;
    Real term_3 = 1.0 + 2.0 / (T_i * CN0_w * (2.0 - d));

    Real sigma_dll_2 = 0.0;
    if (d <= 1.0 / (Tc * B_fe)) {
      term_2 = 1.0 / (Tc * B_fe);
      term_3 = 1.0 + (1.0 / (T_i * CN0_w));
      sigma_dll_2 = term_1 * term_2 * term_3;
    } else if ((PI / (Tc * B_fe) > d) && (d > 1.0 / (Tc * B_fe))) {
      term_2 = 1.0 / (Tc * B_fe) + Tc * B_fe / (PI - 1) * pow(d - 1.0 / (Tc * B_fe), 2);
      sigma_dll_2 = term_1 * term_2 * term_3;
    } else {
      sigma_dll_2 = term_1 * d * term_3;
    }
    return sqrt(sigma_dll_2);
  }

  ArrX SigmaDll(const DllParams& params, const ArrX& CN0_w) {
    Real B_dll = params.B_dll;
    Real T_i = params.T_i;
    Real d = params.d;
    Real Tc = params.Tc;
    Real B_fe = params.B_fe;

    int n = CN0_w.rows();
    int m = CN0_w.cols();

    ArrX ones = ArrX::Ones(n, m);
    ArrX zeros = ArrX::Zero(n, m);

    ArrX term_1 = B_dll / (2.0 * CN0_w);
    ArrX term_2 = zeros;
    ArrX term_3 = 1.0 + 2.0 / (T_i * CN0_w * (2.0 - d));

    ArrX sigma_dll_2 = zeros;
    if (d <= 1.0 / (Tc * B_fe)) {
      term_2 = ones / (Tc * B_fe);
      term_3 = 1.0 + (1.0 / (T_i * CN0_w));
      sigma_dll_2 = term_1 * term_2 * term_3;
    } else if ((PI / (Tc * B_fe) > d) && (d > 1.0 / (Tc * B_fe))) {
      term_2 = ones / (Tc * B_fe) + Tc * B_fe / (PI - 1) * pow(d - 1.0 / (Tc * B_fe), 2);
      sigma_dll_2 = term_1 * term_2 * term_3;
    } else {
      sigma_dll_2 = term_1 * d * term_3;
    }
    return sigma_dll_2.sqrt();
  }

  Real SigmaPll(const PllParams& params, Real CN0_w) {
    Real B_pll = params.B_pll;
    Real T_i = params.T_i;

    Real sigma_pll_2 = B_pll / CN0_w * (1.0 + 1.0 / (2.0 * T_i * CN0_w));
    return sqrt(sigma_pll_2);
  }

  ArrX SigmaPll(const PllParams& params, const ArrX& CN0_w) {
    Real B_pll = params.B_pll;
    Real T_i = params.T_i;

    ArrX sigma_pll_2 = B_pll / CN0_w * (1.0 + 1.0 / (2.0 * T_i * CN0_w));
    return sigma_pll_2.sqrt();
  }

  Real SigmaFll(const FllParams& params, Real CN0_w) {
    Real B_fll = params.B_fll;
    Real T_i = params.T_i;

    Real CN0_F_fll_w = DecibelToDecimal(params.CN0_F_fll);
    Real F_ll = (CN0_w >= CN0_F_fll_w) ? 1.0 : 2.0;

    Real sigma_fll_2 = 4.0 * F_ll * B_fll * (1.0 + 1.0 / (T_i * CN0_w));
    return sqrt(sigma_fll_2);
  }

  ArrX SigmaFll(const FllParams& params, const ArrX& CN0_w) {
    Real B_fll = params.B_fll;
    Real T_i = params.T_i;

    ArrX ones = ArrX::Ones(CN0_w.rows(), CN0_w.cols());
    Real CN0_F_fll_w = DecibelToDecimal(params.CN0_F_fll);
    ArrX F_ll = (CN0_w >= CN0_F_fll_w).select(ones, 2.0 * ones);

    ArrX sigma_fll_2 = 4.0 * F_ll * B_fll * (1.0 + 1.0 / (T_i * CN0_w));
    return sigma_fll_2.sqrt();
  }

  Real FreeSpacePathLoss(Real dist, Real freq) {
    return 20.0 * log10((4.0 * PI * dist) / (C / freq));
  }

  ArrX FreeSpacePathLoss(const ArrX& dist, Real freq) {
    return 20.0 * ((4.0 * PI * dist) / (C / freq)).log10();
  }

  Real ParabolicAntennaGain(Real phi, Real hpbw, Real G_max) {
    return G_max - 12.0 * phi * phi / pow(hpbw, 2);
  }

  ArrX ParabolicAntennaGain(const ArrX& phi, Real hpbw, Real G_max) {
    return G_max - 12.0 * phi.square() / pow(hpbw, 2);
  }

}  // namespace lupnt