Пример #1
0
        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);
        }
Пример #2
0
        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));
        }
Пример #3
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);
        }
Пример #4
0
        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)));
        }
Пример #5
0
        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));
        }
Пример #7
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);
        }