C# FFT2 D Example

[TOC]

using System;
using System.Globalization;
using System.Threading;
using System.Text;

using CenterSpace.NMath.Core;

namespace CenterSpace.NMath.Core.Examples.CSharp
{
  /// <summary>
  /// .NET example in C# showing how to use the 2D Fast Fourier Transform (FFT) classes.
  /// </summary>
  class FFT2DExample
  {

    static void Main(string[] args)
    {

      #region forward 2D 6x4 complex FFT using matrices

      //
      // Compute a small out-of-place forward complex 2D FFT matrices.
      //

      // Create some random signal data.
      RandomNumberGenerator rand = new RandGenMTwist(4230987);
      DoubleComplexMatrix data2Dcomplex = new DoubleComplexMatrix(new DoubleMatrix(6, 4, rand), new DoubleMatrix(6, 4, rand));

      // Create the 2D forward complex FFT instance & the fft resultant matrix.
      DoubleComplexForward2DFFT cfft6x4 = new DoubleComplexForward2DFFT(6, 4);
      DoubleComplexMatrix cfftdata = new DoubleComplexMatrix(cfft6x4.Rows, cfft6x4.Columns);

      // Compute the 2D FFT.
      cfft6x4.FFT(data2Dcomplex, ref cfftdata);

      // Display results.
      Console.WriteLine("2D 6x4 complex FFT result: \n");
      for (int r = 0; r < cfft6x4.Rows; r++)
      {
        for (int c = 0; c < cfft6x4.Columns; c++)
        {
          Console.Write(String.Format("({0,5:0.00},{1,5:0.00}) ", cfftdata[r, c].Real, cfftdata[r, c].Imag));
        }
        Console.WriteLine();
      }
      Console.WriteLine("-----------------------------------\n");

      #endregion

      #region forward 5x5 2D real FFT using matrices

      //
      // Compute a small out-of-place forward 2D FFT in the real plane using matrices.
      //

      // Create a signal matrix using a random number generator.
      RandomNumberGenerator rand2 = new RandGenMTwist(4230987);
      DoubleMatrix data2D = new DoubleMatrix(5, 5, rand2);

      // Create the 2D forward real FFT instance & the fft resultant matrix.
      DoubleForward2DFFT fft5x5 = new DoubleForward2DFFT(5, 5);
      DoubleMatrix fftdata = new DoubleMatrix(fft5x5.Rows, fft5x5.Columns);

      // Compute the 2D FFT.
      fft5x5.FFT(data2D, ref fftdata);

      // Now retrieve the unpacked fft result.
      // (The results are packed because the input data is in the real domain, but the output
      // is in the complex domain.  Using the complex-conjugate symmety of a real fft,  we can pack 
      // the fft back into an array of the same size as the input.)
      // First get a data reader to read the packed fft result.
      DoubleSymmetric2DSignalReader reader2D = fft5x5.GetSignalReader(ref fftdata);
      DoubleComplexMatrix result = reader2D.UnpackFullToMatrix();

      // Display results.
      Console.WriteLine("2D 5x5 real FFT result: \n ");
      for (int r = 0; r < fft5x5.Rows; r++)
      {
        for (int c = 0; c < fft5x5.Columns; c++)
        {
          Console.Write(String.Format("({0,5:0.00},{1,5:0.00}) ", result[r, c].Real, result[r, c].Imag));
        }
        Console.WriteLine();
      }
      Console.WriteLine("-----------------------------------\n");

      #endregion

      Console.WriteLine();
      Console.WriteLine("Finished. Press Enter Key.");
      Console.Read();
    }
  }
}

[TOC]