use lox_core::units::{Angle, Decibel, Frequency};
use crate::antenna::AntennaGain;
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Transmitter {
pub frequency: Frequency,
pub power_w: f64,
pub line_loss: Decibel,
pub output_back_off: Decibel,
}
impl Transmitter {
pub fn new(
frequency: Frequency,
power_w: f64,
line_loss: Decibel,
output_back_off: Decibel,
) -> Self {
Self {
frequency,
power_w,
line_loss,
output_back_off,
}
}
pub fn eirp(&self, antenna: &impl AntennaGain, angle: Angle) -> Decibel {
antenna.gain(self.frequency, angle) + Decibel::from_linear(self.power_w)
- self.line_loss
- self.output_back_off
}
}
#[cfg(test)]
mod tests {
use lox_core::units::{DecibelUnits, FrequencyUnits};
use lox_test_utils::assert_approx_eq;
use crate::antenna::SimpleAntenna;
use super::*;
#[test]
fn test_eirp_simple() {
let antenna = SimpleAntenna {
gain: 10.0.db(),
beamwidth: Angle::degrees(10.0),
};
let tx = Transmitter::new(29.0.ghz(), 5.0, 1.0.db(), 0.0.db());
let eirp = tx.eirp(&antenna, Angle::radians(0.0));
assert_approx_eq!(eirp.as_f64(), 15.9897, atol <= 0.001);
}
#[test]
fn test_eirp_with_obo() {
let antenna = SimpleAntenna {
gain: 20.0.db(),
beamwidth: Angle::degrees(5.0),
};
let tx = Transmitter::new(29.0.ghz(), 10.0, 2.0.db(), 3.0.db());
let eirp = tx.eirp(&antenna, Angle::radians(0.0));
assert_approx_eq!(eirp.as_f64(), 25.0, atol <= 1e-10);
}
}