示例#1
0
文件: Fourier.cs 项目: Xornent/simula
        /// <summary>
        /// Applies the inverse Fast Fourier Transform (iFFT) to a two dimensional data in form of a matrix.
        /// </summary>
        /// <param name="spectrum">Sample matrix, where the iFFT is evaluated in place</param>
        /// <param name="options">Fourier Transform Convention Options.</param>
        public static void Inverse2D(Matrix <Complex> spectrum, FourierOptions options = FourierOptions.Default)
        {
            var rowMajorArray = spectrum.AsRowMajorArray();

            if (rowMajorArray != null)
            {
                InverseMultiDim(rowMajorArray, new[] { spectrum.RowCount, spectrum.ColumnCount }, options);
                return;
            }

            var columnMajorArray = spectrum.AsColumnMajorArray();

            if (columnMajorArray != null)
            {
                InverseMultiDim(columnMajorArray, new[] { spectrum.ColumnCount, spectrum.RowCount }, options);
                return;
            }

            // Fall Back
            columnMajorArray = spectrum.ToColumnMajorArray();
            InverseMultiDim(columnMajorArray, new[] { spectrum.ColumnCount, spectrum.RowCount }, options);
            var denseStorage = new DenseColumnMajorMatrixStorage <Complex>(spectrum.RowCount, spectrum.ColumnCount, columnMajorArray);

            denseStorage.CopyToUnchecked(spectrum.Storage, ExistingData.Clear);
        }
示例#2
0
文件: Fourier.cs 项目: Xornent/simula
        /// <summary>
        /// Applies the forward Fast Fourier Transform (FFT) to a two dimensional data in form of a matrix.
        /// </summary>
        /// <param name="samples">Sample matrix, where the FFT is evaluated in place</param>
        /// <param name="options">Fourier Transform Convention Options.</param>
        public static void Forward2D(Matrix <Complex> samples, FourierOptions options = FourierOptions.Default)
        {
            var rowMajorArray = samples.AsRowMajorArray();

            if (rowMajorArray != null)
            {
                ForwardMultiDim(rowMajorArray, new[] { samples.RowCount, samples.ColumnCount }, options);
                return;
            }

            var columnMajorArray = samples.AsColumnMajorArray();

            if (columnMajorArray != null)
            {
                ForwardMultiDim(columnMajorArray, new[] { samples.ColumnCount, samples.RowCount }, options);
                return;
            }

            // Fall Back
            columnMajorArray = samples.ToColumnMajorArray();
            ForwardMultiDim(columnMajorArray, new[] { samples.ColumnCount, samples.RowCount }, options);
            var denseStorage = new DenseColumnMajorMatrixStorage <Complex>(samples.RowCount, samples.ColumnCount, columnMajorArray);

            denseStorage.CopyToUnchecked(samples.Storage, ExistingData.Clear);
        }
示例#3
0
        /// <summary>
        /// Applies the inverse Fast Fourier Transform (iFFT) to a two dimensional data in form of a matrix.
        /// </summary>
        /// <param name="spectrum">Sample matrix, where the iFFT is evaluated in place</param>
        /// <param name="options">Fourier Transform Convention Options.</param>
        public static void Inverse2D(Matrix <Complex> spectrum, FourierOptions options = FourierOptions.Default)
        {
            // since dense matrix data is column major, we switch rows and columns

            var denseStorage = spectrum.Storage as DenseColumnMajorMatrixStorage <Complex>;

            if (denseStorage == null)
            {
                var samplesColumnMajor = spectrum.ToColumnWiseArray();
                InverseMultiDim(samplesColumnMajor, new[] { spectrum.ColumnCount, spectrum.RowCount }, options);
                denseStorage = new DenseColumnMajorMatrixStorage <Complex>(spectrum.RowCount, spectrum.ColumnCount, samplesColumnMajor);
                denseStorage.CopyToUnchecked(spectrum.Storage, ExistingData.Clear);
                return;
            }

            InverseMultiDim(denseStorage.Data, new[] { spectrum.ColumnCount, spectrum.RowCount }, options);
        }
示例#4
0
        /// <summary>
        /// Applies the inverse Fast Fourier Transform (iFFT) to a two dimensional data in form of a matrix.
        /// </summary>
        /// <param name="spectrum">Sample matrix, where the iFFT is evaluated in place</param>
        /// <param name="options">Fourier Transform Convention Options.</param>
        public static void Inverse2D(Matrix<Complex> spectrum, FourierOptions options = FourierOptions.Default)
        {
            // since dense matrix data is column major, we switch rows and columns

            var denseStorage = spectrum.Storage as DenseColumnMajorMatrixStorage<Complex>;
            if (denseStorage == null)
            {
                var samplesColumnMajor = spectrum.ToColumnWiseArray();
                InverseMultiDim(samplesColumnMajor, new[] { spectrum.ColumnCount, spectrum.RowCount }, options);
                denseStorage = new DenseColumnMajorMatrixStorage<Complex>(spectrum.RowCount, spectrum.ColumnCount, samplesColumnMajor);
                denseStorage.CopyToUnchecked(spectrum.Storage, ExistingData.Clear);
                return;
            }

            InverseMultiDim(denseStorage.Data, new[] { spectrum.ColumnCount, spectrum.RowCount }, options);
        }