00001 using System;
00002 using System.Diagnostics;
00003
00004 namespace FFT {
00005
00006
00007
00008
00009
00010
00011 public class RecursiveFFT : IDFT
00012 {
00013
00014
00015
00016 public Complex[] DFT(Complex[] a)
00017 {
00018 Debug.Assert(a != null, "a is null");
00019 Debug.Assert(Utils.IsPowerOf2(a.Length),
00020 "length of a is not a power of 2!");
00021
00022 int n = a.Length;
00023
00024 if (n == 1) {
00025 return a;
00026 }
00027
00028
00029 Complex[] a0 = new Complex[n/2];
00030 Complex[] a1 = new Complex[n/2];
00031 for (int k = 0 ; k < n/2; k++) {
00032 a0[k] = a[2*k];
00033 a1[k] = a[2*k + 1];
00034 }
00035
00036
00037
00038 Complex[] y0 = DFT(a0);
00039 Complex[] y1 = DFT(a1);
00040
00041
00042 Complex[] y = new Complex[n];
00043 for (int k = 0 ; k < n/2; k++) {
00044 Complex twiddle = Complex.FromPolar(1,2*k*Math.PI/n);
00045
00046 y[k] = y0[k] + twiddle * y1[k];
00047 y[k+n/2] = y0[k] - twiddle * y1[k];
00048 }
00049
00050 return y;
00051
00052 }
00053
00054
00055
00056
00057 public Complex[] InverseDFT(Complex[] y)
00058 {
00059 Debug.Assert(y != null, "y is null");
00060 Debug.Assert(Utils.IsPowerOf2(y.Length),
00061 "length of y is not a power of 2!");
00062
00063 int n = y.Length;
00064
00065 if (n == 1) {
00066 return y;
00067 }
00068
00069
00070 Complex[] y0 = new Complex[n/2];
00071 Complex[] y1 = new Complex[n/2];
00072 for (int k = 0 ; k < n/2; k++) {
00073 y0[k] = y[2*k];
00074 y1[k] = y[2*k + 1];
00075 }
00076
00077
00078 Complex[] a0 = InverseDFT(y0);
00079 Complex[] a1 = InverseDFT(y1);
00080
00081
00082 Complex[] a = new Complex[n];
00083 for (int k = 0; k < n/2; k++) {
00084 Complex twiddle = Complex.FromPolar(1,-2*k*Math.PI/n);
00085
00086 a[k] = (a0[k] + twiddle*a1[k])/2;
00087 a[k+n/2] = (a0[k] - twiddle*a1[k])/2;
00088 }
00089
00090 return a;
00091
00092 }
00093
00094
00095
00096
00097
00098
00099 public override string ToString()
00100 {
00101 return "Recursive";
00102 }
00103 }
00104 }