apsis-rs/crates/rf/apsis-antenna/src/lib.rs

55 lines
2.2 KiB
Rust

//! Antenna radiation patterns and gain models.
//!
//! An antenna does not radiate equally in every direction. This crate models
//! how the gain varies with angle for the two shapes that appear in almost
//! every satellite link: a parabolic reflector, whose beam is a narrow
//! pencil, and an idealised element with a broad pattern.
//!
//! Three beam width conventions are used in practice and they are not
//! interchangeable:
//!
//! - The half power beam width is the angle between the two directions where
//! the gain has fallen to half its peak, which is three decibels down.
//! - The null to null beam width is the angle between the first two zeros on
//! either side of the main lobe. It is roughly twice the half power width
//! for a uniformly illuminated aperture.
//! - The first sidelobe level is the peak gain outside the main lobe. For a
//! uniformly illuminated circular aperture it is about minus 17.6 dB.
//!
//! Every function here takes or returns angles in radians and gains as
//! [`Gain`], so a result can be fed straight into a link budget.
//!
//! Sources:
//!
//! - Parabolic aperture gain: `G = eta (pi D / lambda)^2`, where `eta` is
//! the aperture efficiency, typically between 0.55 and 0.70 for a
//! well adjusted dish.
//! - Half power beam width of a circular aperture: `theta = k lambda / D`
//! with `k` about 1.02 for uniform illumination and close to 1.2 for
//! typical illumination tapers.
//! - The idealised element pattern: ITU-R Recommendation M.1853, which gives
//! `G = -min(12 (theta / theta_0)^2, G_0)` for the co-polar pattern of a
//! simple Earth station antenna.
//!
//! ```
//! use apsis_antenna::ParabolicAperture;
//!
//! // A three meter dish at twelve gigahertz has a peak gain near 50 dBi.
//! let dish = ParabolicAperture {
//! diameter: 3.0,
//! efficiency: 0.65,
//! };
//! let peak = dish.peak_gain(0.025).expect("valid wavelength");
//! assert!(peak.dbi().expect("positive") > 45.0);
//! assert!(peak.dbi().expect("positive") < 50.0);
//! ```
#![forbid(unsafe_code)]
#![deny(missing_docs)]
mod parabolic;
mod pattern;
pub use parabolic::{ParabolicAperture, beam_width, floor_angle};
pub use pattern::{ElementPattern, Pattern, mask_gain, off_axis_attenuation};