use std::f64::consts::PI;
#[must_use]
#[inline]
pub fn fabry_perot_finesse_coefficient(reflectance: f64) -> f64 {
4.0 * reflectance / ((1.0 - reflectance) * (1.0 - reflectance))
}
#[must_use]
#[inline]
pub fn fabry_perot_finesse(reflectance: f64) -> f64 {
PI * reflectance.sqrt() / (1.0 - reflectance)
}
#[must_use]
#[inline]
pub fn fabry_perot_transmittance(
wavelength: f64,
thickness: f64,
n: f64,
angle: f64,
reflectance: f64,
) -> f64 {
let delta = 4.0 * PI * n * thickness * angle.cos() / wavelength;
let f_coeff = fabry_perot_finesse_coefficient(reflectance);
1.0 / (1.0 + f_coeff * (delta / 2.0).sin().powi(2))
}
#[must_use]
#[inline]
pub fn fabry_perot_fsr(thickness_m: f64, n: f64) -> f64 {
299_792_458.0 / (2.0 * n * thickness_m)
}
#[must_use]
#[inline]
pub fn fabry_perot_fsr_wavelength(wavelength: f64, thickness: f64, n: f64) -> f64 {
wavelength * wavelength / (2.0 * n * thickness)
}
#[must_use]
#[inline]
pub fn fabry_perot_resolving_power(
wavelength: f64,
thickness: f64,
n: f64,
reflectance: f64,
) -> f64 {
let order = 2.0 * n * thickness / wavelength;
let finesse = fabry_perot_finesse(reflectance);
order * finesse
}