private void AddToChart(string name, StackPanel legend, ChartControl chart, TimeSeriesDouble ts, Color color) { if (ts != null) { var e = new LineChartElement { Color = color }; for (int i = 0; i < ts.Data.Count; i++) { e.Points.Add(new Point(i / ts.SampleRate / 3600.0, ts.Data[i])); } chart.ChartElements.Add(e); var t = new TextBlock(); t.Text = name; t.FontWeight = FontWeights.Bold; t.FontSize = 16; t.Margin = new Thickness(0, 0, 6, 0); t.Foreground = new SolidColorBrush(color); legend.Children.Add(t); } chart.Canvas.Refresh(); RefreshBorders(chart); }
public static TimeSeriesDouble GetDerivate(TimeSeriesDouble ts) { var d = new double[ts.Data.Count - 1]; for (int i = 0; i < d.Length; i++) { d[i] = (ts.Data[i + 1] - ts.Data[i]) * ts.SampleRate; } return(new TimeSeriesDouble(ts.SampleRate, ts.StartTime, d)); }
private TimeSeriesDouble[][] Generate(TimeSeriesDouble[][] baseTs, TensorCurve tensorCurve, int window, int step, bool acFilter) { var res = new TimeSeriesDouble[tensorCurve.OutputsNumber][]; res[0] = new TimeSeriesDouble[baseTs[0].Length]; res[1] = new TimeSeriesDouble[baseTs[0].Length]; for (int i = 0; i < baseTs[0].Length; i++) { var o = Generate(new[] { baseTs[0][i], baseTs[1][i] }, tensorCurve, window, step, acFilter, p => { }); res[0][i] = o[0]; res[1][i] = o[1]; } return(res); }
public static Tuple <TimeSeriesDouble, TimeSeriesDouble> Rotate(TimeSeriesDouble x, TimeSeriesDouble y, double radAngle) { var xNew = new double[x.Data.Count]; var yNew = new double[y.Data.Count]; var cos = Math.Cos(radAngle); var sin = Math.Sin(radAngle); for (int i = 0; i < x.Data.Count; i++) { xNew[i] = x.Data[i] * cos + y.Data[i] * sin; yNew[i] = -x.Data[i] * sin + y.Data[i] * cos; } return(new Tuple <TimeSeriesDouble, TimeSeriesDouble>(new TimeSeriesDouble(x.SampleRate, x.StartTime, xNew), new TimeSeriesDouble(y.SampleRate, y.StartTime, yNew))); }
private TimeSeriesDouble[] Cut(TimeSeriesDouble[] ts, int window, int step) { var res = new TimeSeriesDouble[ts.Length]; for (int i = 0; i < ts.Length; i++) { var length = ts[i].Data.Count; var realLength = length - (length - window) % step; var newAr = new double[realLength]; for (int e = 0; e < realLength; e++) { newAr[e] = ts[i].Data[e]; } res[i] = new TimeSeriesDouble(ts[i].SampleRate, ts[i].StartTime, newAr); } return(res); }
public static PowerSpectra Run(TimeSeriesDouble data, int window, Action <double> progress) { while (3 * window > data.Data.Count) { window /= 2; } var startF = 5; var endF = window / 2 - 5; var f = Fft.GetFrequencies(window, data.SampleRate, startF, endF); var mag = Calculate(data.Data, window, window / 4, startF, endF, progress); //var c = 1 / Math.Sqrt(data.SampleRate); //mag = Array.ConvertAll(mag, x => x * c); progress(100.0); return(new PowerSpectra(f, mag.Item1, mag.Item2)); }
private TimeSeriesDouble[] Generate(TimeSeriesDouble[] baseTs, TensorCurve tensorCurve, int window, int step, bool acFilter, Action <double> progress) { if (tensorCurve.InputsNumber != baseTs.Length) { throw new ArgumentException(); } var sampleRate = baseTs[0].SampleRate; var sp = new IEnumerable <Complex[]> [baseTs.Length]; for (int i = 0; i < baseTs.Length; i++) { sp[i] = FftTapping.Forward(baseTs[i].Data, window, step, progress); } var spZip = sp[0].Zip(sp[1], (x, y) => new[] { x, y }); var d1 = new double[baseTs[0].Data.Count]; var m1 = new double[baseTs[0].Data.Count]; var d2 = new double[baseTs[1].Data.Count]; var m2 = new double[baseTs[1].Data.Count]; int counter = 0; foreach (var s in spZip) { var cSp = tensorCurve.Apply(s, window, sampleRate); FftTapping.BackOneWindow(d1, m1, cSp[0], window, step * counter); FftTapping.BackOneWindow(d2, m2, cSp[1], window, step * counter); counter++; } FftTapping.NormalizeAfterBackLoop(d1, m1); FftTapping.NormalizeAfterBackLoop(d2, m2); // удаление пограничных значений if (d1.Length > 40) { var avg01 = Statistic.Average(d1, 20, 30); var avg02 = Statistic.Average(d2, 20, 30); var avgN1 = Statistic.Average(d1, d1.Length - 30, d1.Length - 20); var avgN2 = Statistic.Average(d2, d2.Length - 30, d2.Length - 20); for (int i = 0; i < 20; i++) { d1[i] = avg01; d2[i] = avg02; d1[d1.Length - i - 1] = avgN1; d2[d2.Length - i - 1] = avgN2; } } if (acFilter) { RemoveAc(d1, window); RemoveAc(d2, window); } RemoveDc(d1); RemoveDc(d2); var res = new TimeSeriesDouble[tensorCurve.OutputsNumber]; res[0] = new TimeSeriesDouble(sampleRate, baseTs[0].StartTime, d1); res[1] = new TimeSeriesDouble(sampleRate, baseTs[0].StartTime, d2); progress(100.0); return(res); }