From c57f70fbf3c2935b80beebcfae3494bf73b947ea Mon Sep 17 00:00:00 2001 From: Ivan Ukhov Date: Sun, 21 Jun 2015 06:55:04 -0400 Subject: [PATCH] Split transform into forward and inverse --- src/lib.rs | 26 ++++++++++++-------------- tests/lib.rs | 8 ++++---- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index e3f8b2b..a5b9995 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,25 +1,23 @@ #![feature(step_by)] -/// A direction of the Fourier transform. -pub enum Direction { - /// From the time domain to the frequency domain. - Forward, - /// From the frequency domain to the time domain. - Inverse, +/// Perform the Fourier transform. +#[inline(always)] +pub fn forward(data: &mut [f64]) { + transform(data, 1.0); } -/// Perform the Fourier transform. -pub fn transform(data: &mut [f64], direction: Direction) { +/// Perform the inverse Fourier transform. +#[inline(always)] +pub fn inverse(data: &mut [f64]) { + transform(data, -1.0); +} + +fn transform(data: &mut [f64], isign: f64) { use std::f64::consts::PI; let n = data.len() / 2; let nn = n << 1; - let isign = match direction { - Direction::Forward => 1.0, - Direction::Inverse => -1.0, - }; - let mut j = 1; for i in (1..nn).step_by(2) { if j > i { @@ -60,7 +58,7 @@ pub fn transform(data: &mut [f64], direction: Direction) { mmax = istep; } - if let Direction::Inverse = direction { + if isign == -1.0 { let scale = 1.0 / n as f64; for i in 0..(2 * n) { data[i] *= scale; diff --git a/tests/lib.rs b/tests/lib.rs index 40dd210..453e8c1 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -4,15 +4,15 @@ extern crate fft; mod fixtures; #[test] -fn transform_forward() { +fn forward() { let mut data = fixtures::TIME_DATA.to_vec(); - fft::transform(&mut data, fft::Direction::Forward); + fft::forward(&mut data); assert::close(&data, &fixtures::FREQUENCY_DATA[..], 1e-13); } #[test] -fn transform_inverse() { +fn inverse() { let mut data = fixtures::FREQUENCY_DATA.to_vec(); - fft::transform(&mut data, fft::Direction::Inverse); + fft::inverse(&mut data); assert::close(&data, &fixtures::TIME_DATA[..], 1e-13); }