init
This commit is contained in:
71
DataPRO/FftSharp/Experimental.cs
Normal file
71
DataPRO/FftSharp/Experimental.cs
Normal file
@@ -0,0 +1,71 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace FftSharp
|
||||
{
|
||||
[Obsolete("This module is for educational purposes only")]
|
||||
public static class Experimental
|
||||
{
|
||||
// An easy-to-read (but non-optimized) implementation of the FFT algorithm
|
||||
private static Complex[] FFTsimple(Complex[] input)
|
||||
{
|
||||
Complex[] output = new Complex[input.Length];
|
||||
|
||||
int H = input.Length / 2;
|
||||
Complex[] evens = new Complex[H];
|
||||
Complex[] odds = new Complex[H];
|
||||
for (int i = 0; i < H; i++)
|
||||
{
|
||||
evens[i] = input[2 * i];
|
||||
odds[i] = input[2 * i + 1];
|
||||
}
|
||||
odds = FFTsimple(odds);
|
||||
evens = FFTsimple(evens);
|
||||
|
||||
double mult1 = -2 * Math.PI / input.Length;
|
||||
for (int i = 0; i < H; i++)
|
||||
{
|
||||
double radians = mult1 * i;
|
||||
odds[i] *= new Complex(Math.Cos(radians), Math.Sin(radians));
|
||||
}
|
||||
|
||||
for (int i = 0; i < H; i++)
|
||||
{
|
||||
output[i] = evens[i] + odds[i];
|
||||
output[i + H] = evens[i] - odds[i];
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
// Compute the forward or inverse discrete Fourier Transform (not using the fast FFT algorithm)
|
||||
public static Complex[] DFT(Complex[] input, bool inverse = false)
|
||||
{
|
||||
int N = input.Length;
|
||||
double mult1 = (inverse) ? 2 * Math.PI / N : -2 * Math.PI / N;
|
||||
double mult2 = (inverse) ? 1.0 / N : 1.0;
|
||||
Console.WriteLine($"REAL {mult1} {mult2}");
|
||||
|
||||
Complex[] output = new Complex[N];
|
||||
for (int k = 0; k < N; k++)
|
||||
{
|
||||
output[k] = new Complex(0, 0);
|
||||
for (int n = 0; n < N; n++)
|
||||
{
|
||||
double radians = n * k * mult1;
|
||||
Complex temp = new Complex(Math.Cos(radians), Math.Sin(radians));
|
||||
temp *= input[n];
|
||||
output[k] += temp * mult2;
|
||||
}
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
public static Complex[] DFT(double[] input, bool inverse = false)
|
||||
{
|
||||
return DFT(Transform.MakeComplex(input), inverse);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user