예제 #1
0
        MatrixValue fft(MatrixValue x)
        {
            var length = x.Length;

            if (length == 1)
            {
                return(x.Clone());
            }

            // Cooley-Tukey FFT
            if (length % 2 != 0)
            {
                throw new YAMPDifferentLengthsException(length, "2^n");
            }

            // even fft
            var even = new MatrixValue(length / 2, 1);

            for (var k = 1; k <= even.Length; k++)
            {
                even[k] = x[2 * k];
            }

            var q = fft(even);

            // odd fft;
            var odd = even;

            for (var k = 1; k <= odd.Length; k++)
            {
                odd[k] = x[2 * k - 1];
            }

            var r = fft(odd);

            // combine
            var y = new MatrixValue(length, 1);

            for (var k = 1; k <= odd.Length; k++)
            {
                var value = -2 * (k - 1) * Math.PI / length;
                var wk    = new ScalarValue(Math.Cos(value), Math.Sin(value));
                y[k] = q[k] + (wk * r[k]);
                y[k + odd.Length] = q[k] - (wk * r[k]);
            }

            return(y);
        }
예제 #2
0
파일: FFT.cs 프로젝트: FlorianRappl/YAMP
        MatrixValue fft(MatrixValue x)
        {
            var length = x.Length;

            if (length == 1)
            {
                return x.Clone();
            }

            // Cooley-Tukey FFT
            if (length % 2 != 0)
                throw new YAMPDifferentLengthsException(length, "2^n");

            // even fft
            var even = new MatrixValue(length / 2, 1);

            for (var k = 1; k <= even.Length; k++)
            {
                even[k] = x[2 * k];
            }

            var q = fft(even);

            // odd fft;
            var odd = even;

            for (var k = 1; k <= odd.Length; k++)
            {
                odd[k] = x[2 * k - 1];
            }

            var r = fft(odd);

            // combine
            var y = new MatrixValue(length, 1);

            for (var k = 1; k <= odd.Length; k++)
            {
                var value = -2 * (k - 1) * Math.PI / length;
                var wk = new ScalarValue(Math.Cos(value), Math.Sin(value));
                y[k] = q[k] + (wk * r[k]);
                y[k + odd.Length] = q[k] - (wk * r[k]);
            }

            return y;
        }
예제 #3
0
        MatrixValue ifft2d(MatrixValue input)
        {
            var output = input.Clone();

            // Rows first:
            var x = new MatrixValue(output.DimensionY, 1);

            for (var h = 1; h <= output.DimensionX; h++)
            {
                for (var i = 1; i <= output.DimensionY; i++)
                {
                    x[i] = output[i, h];
                }

                x = ifft(x);

                for (int i = 1; i <= output.DimensionY; i++)
                {
                    output[i, h] = x[i];
                }
            }

            //Columns last
            var y = new MatrixValue(output.DimensionX, 1);

            for (int h = 1; h <= output.DimensionY; h++)
            {
                for (int i = 1; i <= output.DimensionX; i++)
                {
                    y[i] = output[h, i];
                }

                y = ifft(y);

                for (int i = 1; i <= output.DimensionX; i++)
                {
                    output[h, i] = y[i];
                }
            }

            return(output);
        }
예제 #4
0
        /// <summary>
        /// Creates a new Givens decomposition.
        /// </summary>
        /// <param name="A">The matrix to decompose.</param>
        public GivensDecomposition(MatrixValue A)
            : base(A)
        {
            var Q = MatrixValue.One(m);
            var R = A.Clone();

            // Main loop.
            for (int j = 1; j < n; j++)
            {
                for (int i = m; i > j; i--)
                {
                    var a = R[i - 1, j];
                    var b = R[i, j];
                    var G = MatrixValue.One(m);

                    var beta = (a * a + b * b).Sqrt();
                    var s    = -b / beta;
                    var c    = a / beta;

                    G[i - 1, i - 1] = c.Conjugate();
                    G[i - 1, i]     = -s.Conjugate();
                    G[i, i - 1]     = s;
                    G[i, i]         = c;

                    R = G * R;
                    Q = Q * G.Adjungate();
                }
            }

            for (int j = 0; j < n; j++)
            {
                if (R[j + 1, j + 1] == ScalarValue.Zero)
                {
                    FullRank = false;
                }
            }

            r = R;
            q = Q;
        }
예제 #5
0
        /// <summary>
        /// Creates a new Givens decomposition.
        /// </summary>
        /// <param name="A">The matrix to decompose.</param>
        public GivensDecomposition(MatrixValue A)
            : base(A)
        {
            var Q = MatrixValue.One(m);
            var R = A.Clone();

            // Main loop.
            for (int j = 1; j < n; j++)
            {
                for (int i = m; i > j; i--)
                {
                    var a = R[i - 1, j];
                    var b = R[i, j];
                    var G = MatrixValue.One(m);

                    var beta = (a * a + b * b).Sqrt();
                    var s = -b / beta;
                    var c = a / beta;

                    G[i - 1, i - 1] = c.Conjugate();
                    G[i - 1, i] = -s.Conjugate();
                    G[i, i - 1] = s;
                    G[i, i] = c;

                    R = G * R;
                    Q = Q * G.Adjungate();
                }
            }

            for (int j = 0; j < n; j++)
            {
                if (R[j + 1, j + 1] == ScalarValue.Zero)
                    FullRank = false;
            }

            r = R;
            q = Q;
        }
예제 #6
0
파일: FFT.cs 프로젝트: FlorianRappl/YAMP
        MatrixValue fft2d(MatrixValue input)
        {
            var output = input.Clone();

            // Rows first:
            var x = new MatrixValue(output.DimensionY, 1);

            for (var h = 1; h <= output.DimensionX; h++)
            {
                for (var i = 1; i <= output.DimensionY; i++)
                {
                    x[i] = output[i, h];
                }

                x = fft(x);

                for (var i = 1; i <= output.DimensionY; i++)
                {
                    output[i, h] = x[i];
                }
            }

            //Columns last
            var y = new MatrixValue(output.DimensionX, 1);

            for (var h = 0; h < output.DimensionY; h++)
            {
                for (var i = 1; i <= output.DimensionX; i++)
                {
                    y[i] = output[h, i];
                }

                y = fft(y);

                for (var i = 1; i <= output.DimensionX; i++)
                {
                    output[h, i] = y[i];
                }
            }

            return output;
        }