private static void SlowFFT(ComplexFloat[] data) { int n = data.Length; var result = new Complex[n]; var powers = new Complex[n]; var input = new Complex[n]; var array = new Complex[n]; for (int i = n; --i >= 0;) { input[i] = new Complex(data[i].Real, data[i].Imaginary); powers[i] = Complex.FromPolarCoordinates(1.0, Math.PI * 2 * i / n); } for (int i = n; --i >= 0;) { for (int j = n; --j >= 0;) { array[j] = input[j] * powers[i * j % n]; } result[i] = new Complex( AccurateSummation.GetAccurateSum(array.Select(x => x.Real)), AccurateSummation.GetAccurateSum(array.Select(x => x.Imaginary))); } for (int i = n; --i >= 0;) { data[i] = new ComplexFloat((float)result[i].Real, (float)result[i].Imaginary); } }
private static void SlowDCT2(float[] data) { int n = data.Length; double[] cos = new double[n * 4]; for (int i = n * 4; --i >= 0;) { cos[i] = Math.Cos(Math.PI * 2 / (n * 4) * i); } double[] result = new double[n]; double[] array = new double[n]; for (int i = n; --i >= 0;) { for (int j = n; --j >= 0;) { array[j] = data[j] * cos[(2 * j + 1) * i % (n * 4)]; } result[i] = AccurateSummation.GetAccurateSum(array); } double scale = Math.Sqrt(2.0); for (int i = n; --i > 0;) { data[i] = (float)(result[i] * scale); } data[0] = (float)result[0]; }