klhztrader/KLHZ.Trader.Core.Math/Declisions/Utils/FFT.cs

71 lines
2.4 KiB
C#

using MathNet.Numerics;
using MathNet.Numerics.IntegralTransforms;
namespace KLHZ.Trader.Core.Math.Declisions.Utils
{
public static class FFT
{
public static void Test()
{
var da = new List<float>();
for (int i = 0; i < 1000; i++)
{
da.Add((float)System.Math.Sin(0.01 * i)+ (float)System.Math.Cos(0.01 * i));
}
var start = da.ToArray();
var arrv = da.Select(d => new Complex32(d, 0)).ToArray();
Fourier.Forward(arrv);
Fourier.Inverse(arrv);
var res = arrv.Select(a => a.Real).ToArray();
for (int i = 0; i < 1000; i++)
{
var d = res[i] - start[i];
}
}
public static TimeSpan CaclHarmonycPeriod(TimeSpan signalLength, int signalLengthItems, int harmonyNumber)
{
var fdiscretisation = signalLengthItems /signalLength.TotalSeconds ;
var fharm = harmonyNumber * fdiscretisation / signalLengthItems;
return TimeSpan.FromSeconds(1/fharm);
}
public static double CalcCurrentPhase(Complex32[] spectr, int harmonyNumber)
{
var item = spectr[harmonyNumber];
return System.Math.Atan(item.Imaginary / item.Real);
}
public static (double min, double max) CalcPhaseRange(double aSin, double aCos, double initPhase, double maxLevel)
{
var x = new List<double>();
var x2 = new List<double>();
var y = new List<double>();
for (double i = 0; i <= 10 * System.Math.PI; i += 0.0001)
{
var _2pi = 2 * System.Math.PI;
var df = ((i / _2pi) % 1) * _2pi;
x.Add(df);
y.Add(aSin * System.Math.Sin(i + initPhase) + aCos * System.Math.Cos(i + initPhase));
}
var prevI = -1;
var max = y.Max();
for (int i = 0; i < y.Count; i++)
{
if (y[i] > (1 - maxLevel) * max && (i - prevI == 1 || prevI < 0))
{
x2.Add(x[i]);
prevI = i;
}
}
var minPhase = x2.Min();
var maxPhase = x2.Max();
return (minPhase, maxPhase);
}
}
}