Browse Source

Split transform into forward and inverse

master
Ivan Ukhov 9 years ago
parent
commit
c57f70fbf3
  1. 26
      src/lib.rs
  2. 8
      tests/lib.rs

26
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;

8
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);
}
Loading…
Cancel
Save