/*
* File: FourierTransformTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Jun 8, 2009, Sandia Corporation.
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
* license for use of this work by or on behalf of the U.S. Government.
* Export of this program may require a license from the United States
* Government. See CopyrightHistory.txt for complete details.
*
*/
package gov.sandia.cognition.math.signals;
import gov.sandia.cognition.math.ComplexNumber;
import gov.sandia.cognition.util.ObjectUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import junit.framework.TestCase;
import java.util.Random;
/**
* Unit tests for FourierTransformTest.
*
* @author krdixon
*/
public class FourierTransformTest
extends TestCase
{
/**
* Random number generator to use for a fixed random seed.
*/
public Random random = new Random( 1 );
/**
* Default tolerance of the regression tests, {@value}.
*/
public double EPS = 1e-5;
/**
* Tests for class FourierTransformTest.
* @param testName Name of the test.
*/
public FourierTransformTest(
String testName)
{
super(testName);
}
/**
* Tests the constructors of class FourierTransformTest.
*/
public void testConstructors()
{
System.out.println( "Constructors" );
FourierTransform fft = new FourierTransform();
assertNotNull( fft );
}
public void testKnown1()
{
System.out.println( "DFT" );
ArrayList<Double> x = new ArrayList<Double>( Arrays.asList(
1.0, 2.0, -1.0 ) );
ComplexNumber[] y = FourierTransform.discreteFourierTransform(x);
System.out.println( "DFT: " + ObjectUtil.toString(y) );
// I calculated these by hand, using the definition of the DFT
assertTrue( y[0].equals( new ComplexNumber( 2.0, 0.0 ), EPS ) );
assertTrue( y[1].equals( new ComplexNumber( 0.5, -2.598076 ), EPS ) );
assertTrue( y[2].equals( new ComplexNumber( 0.5, 2.598076 ), EPS ) );
}
/**
* Test of evaluate method, of class FourierTransform.
*/
public void testEvaluate1()
{
System.out.println("evaluate1");
FourierTransform fft = new FourierTransform();
ArrayList<Double> x1 = new ArrayList<Double>( Arrays.asList(
1.0, 0.0, 1.0, 0.0 ) );
List<ComplexNumber> y1 = fft.evaluate(x1);
assertEquals( x1.size(), y1.size() );
assertEquals( new ComplexNumber( 2.0, 0.0 ), y1.get(0) );
assertEquals( new ComplexNumber( 0.0, 0.0 ), y1.get(1) );
assertEquals( new ComplexNumber( 2.0, 0.0 ), y1.get(2) );
assertEquals( new ComplexNumber( 0.0, 0.0 ), y1.get(3) );
ComplexNumber[] ydft = FourierTransform.discreteFourierTransform(x1);
assertEquals( ydft.length, y1.size() );
for( int i = 0; i < ydft.length; i++ )
{
assertTrue( ydft[i].equals( y1.get(i), EPS ) );
}
}
/**
* Test of evaluate method, of class FourierTransform.
*/
public void testEvaluate2()
{
System.out.println("evaluate2");
FourierTransform fft = new FourierTransform();
ArrayList<Double> x = new ArrayList<Double>( Arrays.asList(
1.0, 0.0, 0.0, 1.0 ) );
List<ComplexNumber> y = fft.evaluate(x);
assertEquals( x.size(), y.size() );
assertTrue( y.get(0).equals( new ComplexNumber( 2.0, 0.0 ), EPS ) );
assertTrue( y.get(1).equals( new ComplexNumber( 1.0, 1.0 ), EPS ) );
assertTrue( y.get(2).equals( new ComplexNumber( 0.0, 0.0 ), EPS ) );
assertTrue( y.get(3).equals( new ComplexNumber( 1.0,-1.0 ), EPS ) );
ComplexNumber[] ydft = FourierTransform.discreteFourierTransform(x);
assertEquals( ydft.length, y.size() );
for( int i = 0; i < ydft.length; i++ )
{
assertTrue( ydft[i].equals( y.get(i), EPS ) );
}
}
/**
* Test of evaluate method, of class FourierTransform.
*/
public void testEvaluate3()
{
System.out.println("evaluate3");
FourierTransform fft = new FourierTransform();
ArrayList<Double> x = new ArrayList<Double>( Arrays.asList(
1.0, 0.0, 0.0, -2.0, 0.0 ) );
List<ComplexNumber> y = fft.evaluate(x);
ComplexNumber[] ydft = FourierTransform.discreteFourierTransform(x);
assertEquals( ydft.length, y.size() );
for( int i = 0; i < ydft.length; i++ )
{
assertTrue( ydft[i].equals( y.get(i), EPS ) );
}
assertEquals( x.size(), y.size() );
assertTrue( y.get(0).equals( new ComplexNumber( -1.0, 0.0 ), EPS ) );
assertTrue( y.get(1).equals( new ComplexNumber( 2.618033988749895, -1.175570504584946 ), EPS ) );
assertTrue( y.get(2).equals( new ComplexNumber( 0.381966011250104, 1.902113032590307 ), EPS ) );
assertTrue( y.get(3).equals( new ComplexNumber( 0.381966011250104, -1.902113032590307 ), EPS ) );
assertTrue( y.get(4).equals( new ComplexNumber( 2.618033988749895, 1.175570504584946 ), EPS ) );
}
/**
* Test of evaluate method, of class FourierTransform.
*/
public void testEvaluate4()
{
System.out.println("evaluate3");
FourierTransform fft = new FourierTransform();
ArrayList<Double> x = new ArrayList<Double>( Arrays.asList(
1.0, 2.0, 3.0, -1.0, -2.0, -3.0, 0.0, 1.0 ) );
List<ComplexNumber> y = fft.evaluate(x);
ComplexNumber[] ydft = FourierTransform.discreteFourierTransform(x);
assertEquals( ydft.length, y.size() );
for( int i = 0; i < ydft.length; i++ )
{
assertTrue( ydft[i].equals( y.get(i), EPS ) );
}
assertEquals( x.size(), y.size() );
assertTrue( y.get(0).equals( new ComplexNumber( 1.0, 0.0 ), EPS ) );
assertTrue( y.get(1).equals( new ComplexNumber( 7.949747468305832, -5.121320343559642), EPS ) );
assertTrue( y.get(2).equals( new ComplexNumber(-4.0, 1.0 ), EPS ) );
assertTrue( y.get(3).equals( new ComplexNumber(-1.949747468305830, 0.878679656440355), EPS ) );
assertTrue( y.get(4).equals( new ComplexNumber( 3.0, 0.0 ), EPS ) );
assertTrue( y.get(5).equals( new ComplexNumber(-1.949747468305830, -0.878679656440355), EPS ) );
assertTrue( y.get(6).equals( new ComplexNumber(-4.0, -1.0 ), EPS ) );
assertTrue( y.get(7).equals( new ComplexNumber( 7.949747468305832, 5.121320343559642), EPS ) );
}
/**
* Test of inverse method
*/
public void testInverse1()
{
System.out.println( "inverse1" );
ArrayList<Double> x = new ArrayList<Double>( Arrays.asList(
1.0, 2.0, 3.0, -1.0, -2.0, -3.0, 0.0, 1.0 ) );
FourierTransform fft = new FourierTransform();
List<ComplexNumber> xfft = fft.evaluate(x);
ArrayList<Double> xhat = FourierTransform.inverse(xfft);
assertEquals( xfft.size(), xhat.size() );
assertEquals( x.size(), xhat.size() );
assertEquals( x.size(), xhat.size() );
for( int i = 0; i < xhat.size(); i++ )
{
assertEquals( x.get(i), xhat.get(i), EPS );
}
}
/**
* Test of evaluate method, of class FourierTransform.
*/
public void testInverse2()
{
System.out.println("inverse2");
FourierTransform fft = new FourierTransform();
ArrayList<Double> x = new ArrayList<Double>( Arrays.asList(
1.0, 0.0, 0.0, -2.0, 0.0 ) );
List<ComplexNumber> xfft = fft.evaluate(x);
FourierTransform.Inverse ifft = new FourierTransform.Inverse();
ArrayList<Double> xhat = ifft.evaluate(xfft);
assertEquals( xfft.size(), xhat.size() );
assertEquals( x.size(), xhat.size() );
for( int i = 0; i < xhat.size(); i++ )
{
assertEquals( x.get(i), xhat.get(i), EPS );
}
}
public void testInverseRandom()
{
System.out.println( "Inverse Random" );
FourierTransform fft = new FourierTransform();
FourierTransform.Inverse ifft = new FourierTransform.Inverse();
int num = random.nextInt(100) + 100;
ArrayList<Double> x = new ArrayList<Double>( num );
for( int i = 0; i < num; i++ )
{
x.add( random.nextGaussian() );
}
List<ComplexNumber> xfft = fft.evaluate(x);
ArrayList<Double> xhat = ifft.evaluate(xfft);
assertEquals( xfft.size(), xhat.size() );
assertEquals( x.size(), xhat.size() );
for( int i = 0; i < num; i++ )
{
assertEquals( x.get(i), xhat.get(i), EPS );
}
}
}