pub struct GoodThomasAlgorithmDoubleButterfly<T> { /* private fields */ }
Expand description
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);
Implementations
sourceimpl<T: FFTnum> GoodThomasAlgorithmDoubleButterfly<T>
impl<T: FFTnum> GoodThomasAlgorithmDoubleButterfly<T>
sourcepub fn new(
width_fft: Arc<dyn FFTButterfly<T>>,
height_fft: Arc<dyn FFTButterfly<T>>
) -> Self
pub fn new(
width_fft: Arc<dyn FFTButterfly<T>>,
height_fft: Arc<dyn FFTButterfly<T>>
) -> Self
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
sourceimpl<T: FFTnum> FFT<T> for GoodThomasAlgorithmDoubleButterfly<T>
impl<T: FFTnum> FFT<T> for GoodThomasAlgorithmDoubleButterfly<T>
sourceimpl<T> IsInverse for GoodThomasAlgorithmDoubleButterfly<T>
impl<T> IsInverse for GoodThomasAlgorithmDoubleButterfly<T>
sourcefn is_inverse(&self) -> bool
fn is_inverse(&self) -> bool
Returns false if this instance computes forward FFTs, true for inverse FFTs
Auto Trait Implementations
impl<T> !RefUnwindSafe for GoodThomasAlgorithmDoubleButterfly<T>
impl<T> Send for GoodThomasAlgorithmDoubleButterfly<T>
impl<T> Sync for GoodThomasAlgorithmDoubleButterfly<T>
impl<T> Unpin for GoodThomasAlgorithmDoubleButterfly<T>
impl<T> !UnwindSafe for GoodThomasAlgorithmDoubleButterfly<T>
Blanket Implementations
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more