55 lines
2.2 KiB
Rust
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};
|