71 lines
2.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|