public class FastFourierTransformer
extends java.lang.Object
implements java.io.Serializable
There are several conventions for the definition of FFT and inverse FFT, mainly on different coefficient and exponent. Here the equations are listed in the comments of the corresponding methods.
We require the length of data set to be power of 2, this greatly simplifies and speeds up the code. Users can pad the data with zeros to meet this requirement. There are other flavors of FFT, for reference, see S. Winograd, On computing the discrete Fourier transform, Mathematics of Computation, 32 (1978), 175 - 199.
Constructor and Description |
---|
FastFourierTransformer()
Construct a default transformer.
|
Modifier and Type | Method and Description |
---|---|
Complex[] |
inversetransform(Complex[] f)
Inversely transform the given complex data set.
|
Complex[] |
inversetransform(double[] f)
Inversely transform the given real data set.
|
Complex[] |
inversetransform(UnivariateRealFunction f,
double min,
double max,
int n)
Inversely transform the given real function, sampled on the given interval.
|
Complex[] |
inversetransform2(Complex[] f)
Inversely transform the given complex data set.
|
Complex[] |
inversetransform2(double[] f)
Inversely transform the given real data set.
|
Complex[] |
inversetransform2(UnivariateRealFunction f,
double min,
double max,
int n)
Inversely transform the given real function, sampled on the given interval.
|
static boolean |
isPowerOf2(long n)
Returns true if the argument is power of 2.
|
java.lang.Object |
mdfft(java.lang.Object mdca,
boolean forward)
Performs a multi-dimensional Fourier transform on a given array.
|
static double[] |
sample(UnivariateRealFunction f,
double min,
double max,
int n)
Sample the given univariate real function on the given interval.
|
static Complex[] |
scaleArray(Complex[] f,
double d)
Multiply every component in the given complex array by the
given real number.
|
static double[] |
scaleArray(double[] f,
double d)
Multiply every component in the given real array by the
given real number.
|
Complex[] |
transform(Complex[] f)
Transform the given complex data set.
|
Complex[] |
transform(double[] f)
Transform the given real data set.
|
Complex[] |
transform(UnivariateRealFunction f,
double min,
double max,
int n)
Transform the given real function, sampled on the given interval.
|
Complex[] |
transform2(Complex[] f)
Transform the given complex data set.
|
Complex[] |
transform2(double[] f)
Transform the given real data set.
|
Complex[] |
transform2(UnivariateRealFunction f,
double min,
double max,
int n)
Transform the given real function, sampled on the given interval.
|
static void |
verifyDataSet(double[] d)
Verifies that the data set has length of power of 2.
|
static void |
verifyDataSet(java.lang.Object[] o)
Verifies that the data set has length of power of 2.
|
static void |
verifyInterval(double lower,
double upper)
Verifies that the endpoints specify an interval.
|
public FastFourierTransformer()
public Complex[] transform(double[] f) throws java.lang.IllegalArgumentException
The formula is $ y_n = \Sigma_{k=0}^{N-1} e^{-2 \pi i nk/N} x_k $
f
- the real data array to be transformedjava.lang.IllegalArgumentException
- if any parameters are invalidpublic Complex[] transform(UnivariateRealFunction f, double min, double max, int n) throws FunctionEvaluationException, java.lang.IllegalArgumentException
The formula is $ y_n = \Sigma_{k=0}^{N-1} e^{-2 \pi i nk/N} x_k $
f
- the function to be sampled and transformedmin
- the lower bound for the intervalmax
- the upper bound for the intervaln
- the number of sample pointsFunctionEvaluationException
- if function cannot be evaluated
at some pointjava.lang.IllegalArgumentException
- if any parameters are invalidpublic Complex[] transform(Complex[] f) throws java.lang.IllegalArgumentException
The formula is $ y_n = \Sigma_{k=0}^{N-1} e^{-2 \pi i nk/N} x_k $
f
- the complex data array to be transformedjava.lang.IllegalArgumentException
- if any parameters are invalidpublic Complex[] transform2(double[] f) throws java.lang.IllegalArgumentException
The formula is $y_n = (1/\sqrt{N}) \Sigma_{k=0}^{N-1} e^{-2 \pi i nk/N} x_k$
f
- the real data array to be transformedjava.lang.IllegalArgumentException
- if any parameters are invalidpublic Complex[] transform2(UnivariateRealFunction f, double min, double max, int n) throws FunctionEvaluationException, java.lang.IllegalArgumentException
The formula is $y_n = (1/\sqrt{N}) \Sigma_{k=0}^{N-1} e^{-2 \pi i nk/N} x_k$
f
- the function to be sampled and transformedmin
- the lower bound for the intervalmax
- the upper bound for the intervaln
- the number of sample pointsFunctionEvaluationException
- if function cannot be evaluated
at some pointjava.lang.IllegalArgumentException
- if any parameters are invalidpublic Complex[] transform2(Complex[] f) throws java.lang.IllegalArgumentException
The formula is $y_n = (1/\sqrt{N}) \Sigma_{k=0}^{N-1} e^{-2 \pi i nk/N} x_k$
f
- the complex data array to be transformedjava.lang.IllegalArgumentException
- if any parameters are invalidpublic Complex[] inversetransform(double[] f) throws java.lang.IllegalArgumentException
The formula is $ x_k = (1/N) \Sigma_{n=0}^{N-1} e^{2 \pi i nk/N} y_n $
f
- the real data array to be inversely transformedjava.lang.IllegalArgumentException
- if any parameters are invalidpublic Complex[] inversetransform(UnivariateRealFunction f, double min, double max, int n) throws FunctionEvaluationException, java.lang.IllegalArgumentException
The formula is $ x_k = (1/N) \Sigma_{n=0}^{N-1} e^{2 \pi i nk/N} y_n $
f
- the function to be sampled and inversely transformedmin
- the lower bound for the intervalmax
- the upper bound for the intervaln
- the number of sample pointsFunctionEvaluationException
- if function cannot be evaluated
at some pointjava.lang.IllegalArgumentException
- if any parameters are invalidpublic Complex[] inversetransform(Complex[] f) throws java.lang.IllegalArgumentException
The formula is $ x_k = (1/N) \Sigma_{n=0}^{N-1} e^{2 \pi i nk/N} y_n $
f
- the complex data array to be inversely transformedjava.lang.IllegalArgumentException
- if any parameters are invalidpublic Complex[] inversetransform2(double[] f) throws java.lang.IllegalArgumentException
The formula is $x_k = (1/\sqrt{N}) \Sigma_{n=0}^{N-1} e^{2 \pi i nk/N} y_n$
f
- the real data array to be inversely transformedjava.lang.IllegalArgumentException
- if any parameters are invalidpublic Complex[] inversetransform2(UnivariateRealFunction f, double min, double max, int n) throws FunctionEvaluationException, java.lang.IllegalArgumentException
The formula is $x_k = (1/\sqrt{N}) \Sigma_{n=0}^{N-1} e^{2 \pi i nk/N} y_n$
f
- the function to be sampled and inversely transformedmin
- the lower bound for the intervalmax
- the upper bound for the intervaln
- the number of sample pointsFunctionEvaluationException
- if function cannot be evaluated
at some pointjava.lang.IllegalArgumentException
- if any parameters are invalidpublic Complex[] inversetransform2(Complex[] f) throws java.lang.IllegalArgumentException
The formula is $x_k = (1/\sqrt{N}) \Sigma_{n=0}^{N-1} e^{2 \pi i nk/N} y_n$
f
- the complex data array to be inversely transformedjava.lang.IllegalArgumentException
- if any parameters are invalidpublic static double[] sample(UnivariateRealFunction f, double min, double max, int n) throws FunctionEvaluationException, java.lang.IllegalArgumentException
The interval is divided equally into N sections and sample points are taken from min to max-(max-min)/N. Usually f(x) is periodic such that f(min) = f(max) (note max is not sampled), but we don't require that.
f
- the function to be sampledmin
- the lower bound for the intervalmax
- the upper bound for the intervaln
- the number of sample pointsFunctionEvaluationException
- if function cannot be evaluated at some pointjava.lang.IllegalArgumentException
- if any parameters are invalidpublic static double[] scaleArray(double[] f, double d)
f
- the real array to be scaledd
- the real scaling coefficientpublic static Complex[] scaleArray(Complex[] f, double d)
f
- the complex array to be scaledd
- the real scaling coefficientpublic static boolean isPowerOf2(long n)
n
- the number to testpublic static void verifyDataSet(double[] d) throws java.lang.IllegalArgumentException
d
- the data arrayjava.lang.IllegalArgumentException
- if array length is not power of 2public static void verifyDataSet(java.lang.Object[] o) throws java.lang.IllegalArgumentException
o
- the data arrayjava.lang.IllegalArgumentException
- if array length is not power of 2public static void verifyInterval(double lower, double upper) throws java.lang.IllegalArgumentException
lower
- lower endpointupper
- upper endpointjava.lang.IllegalArgumentException
- if not intervalpublic java.lang.Object mdfft(java.lang.Object mdca, boolean forward) throws java.lang.IllegalArgumentException
inversetransform2(Complex[])
and
transform2(Complex[])
in a row-column implementation
in any number of dimensions with O(N×log(N)) complexity with
N=n1×n2×n3×...×nd,
nx=number of elements in dimension x,
and d=total number of dimensions.mdca
- Multi-Dimensional Complex Array id est Complex[][][][]forward
- inverseTransform2 is preformed if this is falsejava.lang.IllegalArgumentException
- if any dimension is not a power of two"Copyright © 2010 - 2020 Adobe Systems Incorporated. All Rights Reserved"