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); }
private void AddZToCharts(TensorCurve z) { MainImpedanceChart.ChartElements.Clear(); MainPhaseChart.ChartElements.Clear(); AddImpedanceChart.ChartElements.Clear(); AddPhaseChart.ChartElements.Clear(); Func <TensorCurve, int, int, bool, Point[]> getPoints = (t, x, y, mag) => { var points = new Point[t.SourceFrequencies.Length]; for (int i = 0; i < points.Length; i++) { var v = t.SourceTensors[i][x, y]; points[i] = new Point(1.0 / t.SourceFrequencies[i], mag ? v.Magnitude : (v.Phase) / Math.PI * 180.0); } return(points); }; var xy = new PointsChartElement { Color = GetNextColor(MainImpedanceChart, _mainColors) }; xy.Points.AddRange(getPoints(z, 0, 1, true)); MainImpedanceChart.ChartElements.Add(xy); var yx = new PointsChartElement { Color = GetNextColor(MainImpedanceChart, _mainColors) }; yx.Points.AddRange(getPoints(z, 1, 0, true)); MainImpedanceChart.ChartElements.Add(yx); RefreshBorders(MainImpedanceChart); MainImpedanceChart.Canvas.Refresh(); var xyP = new PointsChartElement { Color = GetNextColor(MainPhaseChart, _mainColors) }; xyP.Points.AddRange(getPoints(z, 0, 1, false)); MainPhaseChart.ChartElements.Add(xyP); var yxP = new PointsChartElement { Color = GetNextColor(MainPhaseChart, _mainColors) }; yxP.Points.AddRange(getPoints(z, 1, 0, false)); MainPhaseChart.ChartElements.Add(yxP); RefreshBorders(MainPhaseChart); MainPhaseChart.Canvas.Refresh(); var xx = new PointsChartElement { Color = GetNextColor(AddImpedanceChart, _mainColors) }; xx.Points.AddRange(getPoints(z, 0, 0, true)); AddImpedanceChart.ChartElements.Add(xx); var yy = new PointsChartElement { Color = GetNextColor(AddImpedanceChart, _mainColors) }; yy.Points.AddRange(getPoints(z, 1, 1, true)); AddImpedanceChart.ChartElements.Add(yy); RefreshBorders(AddImpedanceChart); AddImpedanceChart.Canvas.Refresh(); var xxP = new PointsChartElement { Color = GetNextColor(AddPhaseChart, _mainColors) }; xxP.Points.AddRange(getPoints(z, 0, 0, false)); AddPhaseChart.ChartElements.Add(xxP); var yyP = new PointsChartElement { Color = GetNextColor(AddPhaseChart, _mainColors) }; yyP.Points.AddRange(getPoints(z, 1, 1, false)); AddPhaseChart.ChartElements.Add(yyP); RefreshBorders(AddPhaseChart); AddPhaseChart.Canvas.Refresh(); }
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); }