basic_dsp 0.5.2

Digital signal processing based on real or complex vectors in time or frequency domain. Vectors come with basic arithmetic, convolution, Fourier transformation and interpolation operations. The vectors are optimized for sizes of a couple of thousand elements or more. The same operations are provdided for matrices. For complete matrix algebra this lib is intended to be used in combination with other matrix libs. Please refer to the documentation for more information about this.
Documentation
#![feature(test)]
#![feature(box_syntax)]
extern crate test;
extern crate basic_dsp;

pub mod tools;

#[cfg(test)]
mod real {
    use test::Bencher;
    use basic_dsp::*;
    use tools::*;

    #[inline(never)]
    pub fn add_offset_reference32(mut array: Vec<f32>, offset: f32) -> Vec<f32> {
        let mut i = 0;
        while i < array.len() {
            array[i] = array[i] + offset;
            i += 1;
        }

        array
    }

    #[inline(never)]
    pub fn add_offset_reference64(mut array: Vec<f64>, offset: f64) -> Vec<f64> {
        let mut i = 0;
        while i < array.len() {
            array[i] = array[i] + offset;
            i += 1;
        }

        array
    }

    #[bench]
    fn real_offset_32s_reference(b: &mut Bencher) {
        let mut vector = VectorBox::<Vec<f32>, f32>::new(Size::Small);
        b.iter(|| vector.execute(|v, _| add_offset_reference32(v, 100.0)));
    }

    #[bench]
    fn real_offset_64s_reference(b: &mut Bencher) {
        let mut vector = VectorBox::<Vec<f64>, f64>::new(Size::Small);
        b.iter(|| vector.execute(|v, _| add_offset_reference64(v, 100.0)))
    }

    #[inline(never)]
    pub fn real_logn_reference32(mut array: Vec<f32>) -> Vec<f32> {
        let mut i = 0;
        while i < array.len() {
            array[i] = array[i].ln();
            i += 1;
        }

        array
    }

    #[bench]
    fn vector_creation_32_benchmark(b: &mut Bencher) {
        b.iter(|| {
            let data = vec![0.0; DEFAULT_DATA_SIZE];
            data.to_real_time_vec();
        });
    }

    #[bench]
    fn real_offset_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.offset(100.0);
                v
            })
        });
    }

    #[bench]
    fn real_offset_32m_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Medium);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.offset(100.0);
                v
            })
        });
    }

    #[bench]
    fn real_offset_32l_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Large);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.offset(100.0);
                v
            })
        });
    }

    #[bench]
    fn real_offset_64s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime64Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.offset(100.0);
                v
            })
        });
    }

    #[bench]
    fn real_scale_32m_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Medium);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.scale(10.0);
                v
            })
        });
    }

    #[bench]
    fn real_scale_with_mapping_32m_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Medium);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.map_inplace((), &|v, _, _| 2.0 * v);
                v
            })
        });
    }

    #[bench]
    fn real_abs_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.abs();
                v
            })
        });
    }

    #[bench]
    fn real_square_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.square();
                v
            })
        });
    }

    #[bench]
    fn real_root_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.root(3.0);
                v
            })
        });
    }

    #[bench]
    fn real_power_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.powf(3.0);
                v
            })
        });
    }

    #[bench]
    fn real_log_32s_reference(b: &mut Bencher) {
        let mut vector = VectorBox::<Vec<f32>, f32>::new(Size::Small);
        b.iter(|| vector.execute(|v, _| real_logn_reference32(v)));
    }

    #[bench]
    fn real_log_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.ln();
                v
            })
        });
    }

    #[bench]
    fn real_log_32m_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Medium);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.ln();
                v
            })
        });
    }

    #[bench]
    fn real_log_32l_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Large);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.ln();
                v
            })
        });
    }

    #[bench]
    fn real_log_approx_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.ln_approx();
                v
            })
        });
    }

    #[bench]
    fn real_exp_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.exp();
                v
            })
        });
    }

    #[bench]
    fn real_exp_approx_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.exp_approx();
                v
            })
        });
    }

    #[bench]
    fn wrap_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.wrap(10.0);
                v
            })
        });
    }

    #[bench]
    fn unwrap_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.unwrap(10.0);
                v
            })
        });
    }

    #[bench]
    fn diff_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.diff_with_start();
                v
            })
        });
    }

    #[bench]
    fn cum_sum_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.cum_sum();
                v
            })
        });
    }

    #[bench]
    fn real_vector_multiplication_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                let len = v.len();
                let operand = vec!(0.0; len).to_real_time_vec();
                v.mul(&operand).unwrap();
                v
            })
        });
    }

    #[bench]
    fn real_sin_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.sin();
                v
            })
        });
    }

    #[bench]
    fn real_sin_approx_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.sin_approx();
                v
            })
        });
    }

    #[bench]
    fn real_sin_32m_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Medium);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.sin();
                v
            })
        });
    }

    #[bench]
    fn real_sin_64s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime64Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.sin();
                v
            })
        });
    }

    #[bench]
    fn swap_halves_32m_even_benchmark(b: &mut Bencher) {
        let mut vector = Gen32Box::with_size(10000);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.swap_halves();
                v
            })
        });
    }

    #[bench]
    fn swap_halves_32m_odd_benchmark(b: &mut Bencher) {
        let mut vector = Gen32Box::with_size(10000);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.swap_halves();
                v
            })
        });
    }

    #[bench]
    fn reverse_32s_benchmark(b: &mut Bencher) {
        let mut vector = RealTime32Box::new(Size::Small);
        b.iter(|| {
            vector.execute(|mut v, _| {
                v.reverse();
                v
            })
        });
    }
}