X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-core%2Fsrc%2Fdsp%2Fwindow.rs;h=eb350e3ecbd319208e8b9312a90cecaad6f31358;hb=4e034a32d947e1ef5f357cc2477d6f1c3b8454a9;hp=42b6b6d1d556f4918006b15ac51428fd26c2a102;hpb=5641dccfbf2a70d589cf094a0d4ed5a10f919f00;p=nihav.git diff --git a/nihav-core/src/dsp/window.rs b/nihav-core/src/dsp/window.rs index 42b6b6d..eb350e3 100644 --- a/nihav-core/src/dsp/window.rs +++ b/nihav-core/src/dsp/window.rs @@ -1,31 +1,38 @@ +//! Window generating functions. use std::f32::consts; +/// Known window types. #[derive(Debug,Clone,Copy,PartialEq)] pub enum WindowType { + /// Simple square window. Square, + /// Simple sine window. Sine, + /// Kaiser-Bessel derived window. KaiserBessel(f32), } +/// Calculates window coefficients for the requested window type and size. +/// +/// Set `half` flag to calculate only the first half of the window. pub fn generate_window(mode: WindowType, scale: f32, size: usize, half: bool, dst: &mut [f32]) { match mode { WindowType::Square => { for n in 0..size { dst[n] = scale; } }, WindowType::Sine => { - let param; - if half { - param = consts::PI / ((2 * size) as f32); - } else { - param = consts::PI / (size as f32); - } + let param = if half { + consts::PI / ((2 * size) as f32) + } else { + consts::PI / (size as f32) + }; for n in 0..size { dst[n] = (((n as f32) + 0.5) * param).sin() * scale; } }, WindowType::KaiserBessel(alpha) => { let dlen = if half { size as f32 } else { (size as f32) * 0.5 }; - let alpha2 = ((alpha * consts::PI / dlen) * (alpha * consts::PI / dlen)) as f64; + let alpha2 = f64::from((alpha * consts::PI / dlen) * (alpha * consts::PI / dlen)); let mut kb: Vec = Vec::with_capacity(size); let mut sum = 0.0; @@ -45,7 +52,7 @@ pub fn generate_window(mode: WindowType, scale: f32, size: usize, half: bool, ds fn bessel_i0(inval: f64) -> f64 { let mut val: f64 = 1.0; for n in (1..64).rev() { - val *= inval / ((n * n) as f64); + val *= inval / f64::from(n * n); val += 1.0; } val