[][src]Struct rustfft::algorithm::GoodThomasAlgorithmDoubleButterfly

pub struct GoodThomasAlgorithmDoubleButterfly<T> { /* fields omitted */ }

Implementation of the Good-Thomas Algorithm, specialized for the case where both inner FFTs are butterflies

This algorithm factors a size n FFT into n1 * n2, where GCD(n1, n2) == 1

Conceptually, this algorithm is very similar to the Mixed-Radix FFT, except because GCD(n1, n2) == 1 we can do some number theory trickery to reduce the number of floating-point multiplications and additions. It typically performs better than Mixed-Radix Double Butterfly Algorithm, especially at small sizes.

// Computes a forward FFT of size 56, using the Good-Thoma Butterfly Algorithm
use std::sync::Arc;
use rustfft::algorithm::GoodThomasAlgorithmDoubleButterfly;
use rustfft::algorithm::butterflies::{Butterfly7, Butterfly8};
use rustfft::FFT;
use rustfft::num_complex::Complex;
use rustfft::num_traits::Zero;

let mut input:  Vec<Complex<f32>> = vec![Zero::zero(); 56];
let mut output: Vec<Complex<f32>> = vec![Zero::zero(); 56];

// we need to find an n1 and n2 such that n1 * n2 == 56 and GCD(n1, n2) == 1
// n1 = 7 and n2 = 8 satisfies this
let inner_fft_n1 = Arc::new(Butterfly7::new(false));
let inner_fft_n2 = Arc::new(Butterfly8::new(false));

// the good-thomas FFT length will be inner_fft_n1.len() * inner_fft_n2.len() = 56
let fft = GoodThomasAlgorithmDoubleButterfly::new(inner_fft_n1, inner_fft_n2);
fft.process(&mut input, &mut output);

Methods

impl<T: FFTnum> GoodThomasAlgorithmDoubleButterfly<T>[src]

pub fn new(
    width_fft: Arc<dyn FFTButterfly<T>>,
    height_fft: Arc<dyn FFTButterfly<T>>
) -> Self
[src]

Creates a FFT instance which will process inputs/outputs of size width_fft.len() * height_fft.len()

GCD(n1.len(), n2.len()) must be equal to 1

Trait Implementations

impl<T: FFTnum> FFT<T> for GoodThomasAlgorithmDoubleButterfly<T>[src]

impl<T> IsInverse for GoodThomasAlgorithmDoubleButterfly<T>[src]

impl<T> Length for GoodThomasAlgorithmDoubleButterfly<T>[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.