コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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];
        }