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(); 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(); var x2 = new List(); var y = new List(); 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); } } }