palmfft 1.3.1

Palm-sized Faster Fourier Transform
Documentation
pub mod bluestein; pub mod cooleytukey;
use self::{bluestein::Bluestein, cooleytukey::CooleyTukey};
use crate::{
    math::{cost_guess, good_size, largest_prime_factor},
    Complex, Result
};

pub enum CfftPlan {
    Ct(CooleyTukey),
    Bs(Bluestein)
}

impl CfftPlan {
    pub fn new(length: usize) -> Self {
        if length < 50 || largest_prime_factor(length) <= libm::sqrt(length as f64) as usize {
            return Self::Ct(CooleyTukey::new(length));
        }
        let ct_cost = cost_guess(length);
        let bs_cost = 3.0 * cost_guess(good_size(2 * length - 1));

        if bs_cost < ct_cost {
            return Self::Bs(Bluestein::new(length));
        }
        return Self::Ct(CooleyTukey::new(length));
    }

    pub fn forward(&self, data: &mut [Complex], fct: f64) -> Result {
        match self {
            Self::Ct(ct) => { ct.forward(data, fct) }
            Self::Bs(bs) => { bs.forward(data, fct) }
        }
    }

    pub fn backward(&self, data: &mut [Complex], fct: f64) -> Result {
        match self {
            Self::Ct(ct) => { ct.backward(data, fct) }
            Self::Bs(bs) => { bs.backward(data, fct) }
        }
    }

    pub fn len(&self) -> usize {
        match self {
            Self::Ct(ct) => { ct.len() }
            Self::Bs(bs) => { bs.len() }
        }
    }
}