discrete_transforms 0.1.3

Library for Discrete Transforms
Documentation
use std::f64;
use num_traits::float::Float;

#[derive(Debug)]
pub struct Dct1D {
    input: Vec<f64>
}

impl Dct1D {
    pub fn new() -> Dct1D {
        Dct1D {
            input: vec![]
        }
    }

    pub fn set_input(&mut self, input: Vec<f64>) -> &mut Self {
        self.input = input;

        self
    }

    pub fn forward(&mut self) -> Vec<f64> {
        let pi = f64::consts::PI;
        let mut output: Vec<f64> = Vec::new();

        for u in 0..8 {
            let mut coefficient: f64 = 0.0;

            for x in 0..8 {
                coefficient += self.input[x] * (u as f64 * pi / 16.0 * (2.0 * x as f64 + 1.0)).cos();
            }

            let cu = if u == 0 {
                1.0 / 2.0.sqrt()
            }
            else {
                1.0
            };

            coefficient = coefficient / 2.0 * cu;

            output.push(coefficient);
        }

        output
    }

    pub fn inverse(&mut self) -> Vec<f64> {
        let pi = f64::consts::PI;
        let mut output: Vec<f64> = Vec::new();

        for x in 0..8 {
            let mut output_temp: f64 = 0.0;

            for u in 0..8 {
                let cu = if u == 0 {
                    1.0 / 2.0.sqrt()
                }
                else {
                    1.0
                };

                output_temp += (u as f64 * pi / 16.0 * (2.0 * x as f64 + 1.0)).cos() * self.input[u] * cu;
            }

            output_temp /= 2.0;

            output.push(output_temp);
        }

        output
    }

}