Beispiel #1
0
        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);
        }
Beispiel #2
0
        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();
        }
Beispiel #3
0
        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);
        }