signal_processing 0.3.0

A signal processing library.
Documentation
use num::{traits::FloatConst, Float};

use crate::quantities::{List, ListOrSingle, Lists};

pub trait PeakToRms<'a, T>: Lists<T>
where
    T: Float
{
    fn peak_to_rms(&'a self) -> Self::RowsMapped<T>;
}

impl<'a, T, L> PeakToRms<'a, T> for L
where
    L: Lists<T, RowView<'a>: List<T>> + 'a,
    T: Float + FloatConst + 'a
{
    fn peak_to_rms(&'a self) -> Self::RowsMapped<T>
    {
        let one = T::one();
        let two = one + one;
        let p2p2rms = T::FRAC_1_SQRT_2()/two;

        self.map_rows_to_owned(|x| {
            let x = x.to_vec();
            let p2p = x.iter()
                .map(|&x| x)
                .reduce(T::max)
                .unwrap_or(T::zero())
            - x.into_iter()
                .reduce(T::min)
                .unwrap_or(T::zero());
            p2p*p2p2rms
        })
    }
}