basic_dsp 0.2.1

Digital signal processing based on 1xN (one times N) or Nx1 vectors in real or complex number space. Vectors come with basic arithmetic, convolution, Fourier transformation and interpolation operations.
Documentation
#![feature(test)]
#![feature(box_syntax)] 
extern crate test;
extern crate basic_dsp;
extern crate num;

pub mod tools;

#[cfg(test)]
mod bench {
	use test::Bencher;
	use basic_dsp::{
		DataVector,
        DataVectorDomain,
        GenericVectorOperations,
		RealVectorOperations,
		DataVector32,
		RealTimeVector32,
        RealTimeVector64,
        Operation};
	use num::complex::Complex32;
    use tools::{VectorBox, DEFAULT_DATA_SIZE, Size};
	
    #[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>>::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>>::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];
			let result = DataVector32::from_array_no_copy(false, DataVectorDomain::Time, data);
			return result.delta();;
			});
	}
	
	#[bench]
	fn multi_operations_vector_32_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<DataVector32>::new(Size::Small, true);
		b.iter(|| {
			vector.execute(|v|  
				{
					  v.perform_operations(
						&[Operation::AddReal(1.0),
						Operation::AddComplex(Complex32::new(1.0, 1.0)),
						Operation::MultiplyComplex(Complex32::new(-1.0, 1.0))])
				})
		});
	}
    
    #[bench]
	fn real_offset_32s_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.real_offset(100.0) } )
		});
	}
    
    #[bench]
	fn real_offset_32m_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Medium);
		b.iter(|| {
			vector.execute_res(|v|  { v.real_offset(100.0) } )
		});
	}
    
    #[bench]
	fn real_offset_32l_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Large);
		b.iter(|| {
			vector.execute_res(|v|  { v.real_offset(100.0) } )
		});
	}
    
    #[bench]
	fn real_offset_64s_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector64>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.real_offset(100.0) } )
		});
	}
    
    #[bench]
	fn real_scale_32m_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Medium);
		b.iter(|| {
			vector.execute_res(|v|  { v.real_scale(2.0) } )
		});
	}
    
    #[bench]
	fn real_abs_32s_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.abs() } )
		});
    }
    
    #[bench]
	fn real_square_32s_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.square() } )
		});
    }
    
    #[bench]
	fn real_root_32s_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.root(3.0) } )
		});
    }
    
    #[bench]
	fn real_power_32s_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.power(3.0) } )
		});
    }
    
    #[bench]
	fn real_logn_32s_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.logn() } )
		});
    }
    
    #[bench]
	fn real_logn_32s_reference(b: &mut Bencher)
	{
		let mut vector = VectorBox::<Vec<f32>>::new(Size::Small);
		b.iter(|| {
			vector.execute(|v|  { real_logn_reference32(v) } )
			});
    }
    
    #[bench]
	fn real_logn_32m_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Medium);
		b.iter(|| {
			vector.execute_res(|v|  { v.logn() } )
		});
    }
    
    #[bench]
	fn real_logn_32l_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Large);
		b.iter(|| {
			vector.execute_res(|v|  { v.logn() } )
		});
    }
    
    #[bench]
	fn real_expn_32s_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.expn() } )
		});
    }
    
    #[bench]
	fn wrap_32s_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.wrap(10.0) } )
		});
    }
    
    #[bench]
	fn unwrap_32s_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.unwrap(10.0) } )
		});
    }
    
    #[bench]
	fn diff_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.diff_with_start() } )
		});
    }
    
    #[bench]
	fn cum_sum_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v|  { v.cum_sum() } )
		});
    }
    
    #[bench]
	fn real_vector_multiplication_32s_benchmark(b: &mut Bencher)
	{
		let mut vector = VectorBox::<RealTimeVector32>::new(Size::Small);
		b.iter(|| {
			vector.execute_res(|v| {
                let len = v.len(); 
                let operand = RealTimeVector32::from_constant(0.0, len);
                v.multiply_vector(&operand) 
            } )
		});
	}
}