# C# FFT2 D Example

← All NMath Code Examples

```using System;
using System.Globalization;
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 )
{
Console.WriteLine();

#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 );
var data2Dcomplex = new DoubleComplexMatrix( new DoubleMatrix( 6, 4, rand ), new DoubleMatrix( 6, 4, rand ) );

// Create the 2D forward complex FFT instance & the fft resultant matrix.
var cfft6x4 = new DoubleComplexForward2DFFT( 6, 4 );
var 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 );
var data2D = new DoubleMatrix( 5, 5, rand2 );

// Create the 2D forward real FFT instance & the fft resultant matrix.
var fft5x5 = new DoubleForward2DFFT( 5, 5 );
var 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 symmetry 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.

// 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." );