Imports System Imports System.Globalization Imports System.Threading Imports System.Text Imports CenterSpace.NMath.Core Namespace CenterSpace.NMath.Examples.VisualBasic; .NET example in Visual Basic showing how to use the 1D Fast Fourier Transform (FFT) modules. Module FFT1DExample Sub Main() Simple example to compute a forward 1D real 1024 point FFT Console.WriteLine() Create some random signal data. Dim Rand As RandomNumberGenerator = New RandGenMTwist(4230987) Dim Data As New DoubleVector(1024, Rand) Create the 1D real FFT instance Dim FFT1024 As New DoubleForward1DFFT(1024) Compute the FFT This will create a complex conjugate symmetric packed result. FFT1024.FFTInPlace(Data) Ask the FFT instance for the correct reader, to unpacked the result. Dim Reader As DoubleSymmetricSignalReader = FFT1024.GetSignalReader(Data) The reader provides random access to any element in the pack fft result. Dim ThirdElement As DoubleComplex = Reader(2) Console.WriteLine() Console.WriteLine("1D real 1024 point FFT computed.") Console.WriteLine("-----------------------------------" + Environment.NewLine) Simple example to compute a backward 1D complex 1000 point FFT Create some new random signal data. Dim CData As New DoubleComplexVector(1000, Rand) Create the 1D backward complex FFT instance Dim FFT1000 As New DoubleComplexBackward1DFFT(1000) Compute the FFT Complex FFTs generated unpacked results. FFT1000.FFTInPlace(CData) Console.WriteLine("1D complex 1000 point FFT computed.") Console.WriteLine("-----------------------------------" + Environment.NewLine) Compute a small 1D real FFT out-of-place using arrays. Create the input signal data and the fft Dim Data5() As Double = {1, 2, 3, 4, 5} Dim FFT5Result(5) As Double Dim FFT5 As New DoubleForward1DFFT(5) Compute the FFT FFT5.FFT(Data5, FFT5Result) Look at packed complex-conjugate symmetric result Console.WriteLine("1D real FFT result.") Console.WriteLine() Console.WriteLine("Input data =") Console.WriteLine("[1, 2, 3, 4, 5]" + Environment.NewLine) Console.WriteLine("fft symmetric half packed = ") Console.Write("[ ") Dim I As Integer For I = 0 To 4 Console.Write("{0,4:0.00} ", FFT5Result(I)) Next Console.WriteLine(" ]" + Environment.NewLine) Ask the FFT instance for the correct reader, to unpacked the result. Dim Reader5 As DoubleSymmetricSignalReader = FFT5.GetSignalReader(FFT5Result) Console.WriteLine("fft fully unpacked (requires twice the memory)= ") Console.Write("[ ") For I = 0 To 4 Console.Write("({0,4:0.00},{1,4:0.00}) ", Reader5(I).Real, Reader5(I).Imag) Next Console.WriteLine(" ]") Console.WriteLine("-----------------------------------" + Environment.NewLine) Compute the same 1D FFT using the complex instance Create the input signal data and the fft Dim CData5 As New DoubleComplexVector("[ (1,0) (2,0) (3,0) (4,0) (5,0) ]") Dim CFFT5 As New DoubleComplexForward1DFFT(5) Show input data Console.WriteLine("1D complex FFT result.") Console.WriteLine() Console.WriteLine("Input data = ") Console.Write("[ ") For I = 0 To CData5.Length - 1 Console.Write("{0,4:0.00} ", CData5(I).Real) Next Console.WriteLine("]" + Environment.NewLine) Compute the FFT in-place. CFFT5.FFTInPlace(CData5) Look at the (unpacked) complex fft result Note that complex FFTs never create packed results. Console.WriteLine("complex fft = ") Console.Write("[ ") For I = 0 To CData5.Length - 1 Console.Write("({0,4:0.00},{1,4:0.00}) ", CData5(I).Real, CData5(I).Imag) Next Console.WriteLine(" ]") Console.WriteLine("-----------------------------------" + Environment.NewLine) Compute a forward real 1D fft and then reverse the fft Create the input signal data and the fft Dim Data4 As New DoubleVector("[ 1 2 2 1 ]") Dim FFT4Result As New DoubleVector(4) Dim FFT4Reverse As New DoubleVector(4) Build the two FFT instances fft4 is for forward real 1D FFTs. Dim FFT4 As New DoubleForward1DFFT(4) rfft4 is for reversing the complex-conjugate symmetric results of DoubleForward1DFFTs. DoubleSymmetricBackward1DFFT inputs are always assumed have this complex-conjugate symmetry. Dim RFFT4 As New DoubleSymmetricBackward1DFFT(4) Compute forward real the FFT. FFT4.FFT(Data4, FFT4Result) Now reverse the FFT, and for fft4reverse should match the original input data. RFFT4.SetScaleFactorByLength() This scaling is necessary to match data4. RFFT4.FFT(FFT4Result, FFT4Reverse) Look at the packed complex-conjugate symmetric fft result Note that complex FFTs never create packed results. Console.WriteLine("1D real forward & backward FFT results.") Console.WriteLine("Input data = ") Console.Write("[ ") For I = 0 To RFFT4.Length - 1 Console.Write("{0,4:0.00} ", Data4(I)) Next Console.WriteLine("]" + Environment.NewLine) Console.WriteLine("Complex-conjugate symmetric packed result of real fft = ") Console.Write("[ ") For I = 0 To FFT4.Length - 1 Console.Write("{0,4:0.00} ", FFT4Result(I)) Next Console.WriteLine("]" + Environment.NewLine) Console.WriteLine("Backward of real fft = ") Console.Write("[ ") For I = 0 To RFFT4.Length - 1 Console.Write("{0,4:0.00} ", FFT4Reverse(I)) Next Console.WriteLine("]") Console.WriteLine("-----------------------------------" + Environment.NewLine) Example computing a 1D FFT of an offset and strided signal. When working with strided signals, the FFT must be configured separately, and then used to create an advanced general FFT instance. Build our FFT configuration: direction: Forward, precision: Double, forward domain: REAL, Dimension: 1, Length: 4 Dim ComplexConfiguration As New FFTConfiguration(FFTDirection.FORWARD, FFTPrecision.DOUBLE, FFTDomain.REAL, 1, 4) Set up special parameters about this data set. ComplexConfiguration.DataOffset = 3 Skip three data values before starting ComplexConfiguration.DataStride = 2 Skip every other data value. ComplexConfiguration.InPlace = True This will be configured for an in-place computation. Not create the data set, with an offset of 3, and stride of 2. Dim Signal() As Double = {94423, -341, 42343, 1, -1, 2, -1, 2, -1, 1, -85, 22} Dim GFFTResult(4) As Double Now build the general FFT object using this configuration. Dim GFFT As New DoubleGeneral1DFFT(ComplexConfiguration) Now compute the FFT, it should match the previous example. GFFT.FFT(Signal, GFFTResult) Console.WriteLine("Input data = ") Console.Write("[ ") For I = 0 To Signal.Length - 1 Console.Write("{0,4:0.00} ", Signal(I)) Next Console.WriteLine("]" + Environment.NewLine) Show the results Console.WriteLine("Complex-conjugate symmetric packed result of real fft = ") Console.Write("[ ") For I = 0 To FFT4.Length - 1 Console.Write("{0,4:0.00} ", GFFTResult(I)) Next Console.WriteLine("]" + Environment.NewLine) Console.WriteLine("-----------------------------------") Console.WriteLine() Console.WriteLine("Finished. Press Enter Key.") Console.Read() End Sub End Module End Namespace← All NMath Code Examples