public List <double> Remove(List <double> Data, ref Stack <ITransformation> Transforms)
        {
            List <double> retVal = null;

            List <ITrendRemover> removers = new List <ITrendRemover>();

            removers.Add(new Linear());
            removers.Add(new Exponential());
            removers.Add(new Logarithmic());
            removers.Add(new Power());
            removers.Add(new Poly(2));
            removers.Add(new Poly(3));
            removers.Add(new Poly(4));

            double          lowestError          = Double.MaxValue;
            ITransformation lowestTransformation = null;

            _scoringStrategy.StartNewTransformation(Data, null);

            foreach (ITrendRemover remover in removers)
            {
                Stack <ITransformation> transforms = new Stack <ITransformation>();
                List <double>           thisData   = remover.Remove(Data, ref transforms);

#if DEBUG
                StringBuilder sbCompDecycle = new StringBuilder();

                for (int i = 0; i < thisData.Count; i++)
                {
                    sbCompDecycle.AppendLine(String.Format("{0},{1}", Data[i], thisData[i]));
                }
#endif

                _scoringStrategy.AddTransformedValues(thisData);
                _scoringStrategy.Score();

                double error = _scoringStrategy.LowestError;

                if (error < lowestError)
                {
                    lowestError          = error;
                    lowestTransformation = transforms.Pop();
                    retVal = (List <double>)Utilities.DeepClone(thisData);
                }
            }

            if (lowestTransformation != null)
            {
                Transforms.Push(lowestTransformation);
            }

            return(retVal);
        }
Exemple #2
0
        public List <double> Remove(List <double> Data, ref Stack <ITransformation> Transforms)
        {
            if (Transforms == null)
            {
                Transforms = new Stack <ITransformation>();
            }

            double        bestError     = Double.MaxValue;
            List <double> detrendedData = null;

            List <double> data = (List <double>)Utilities.DeepClone(Data);

            do
            {
                detrendedData = RemoveBestLengthBestShiftedCycle(data, ref Transforms);

                if (detrendedData != null)
                {
                    _recursiveScoringStrategy.StartNewTransformation(data, Transforms.Peek());
                    _recursiveScoringStrategy.CurrentTransformedData = detrendedData;
                    _recursiveScoringStrategy.Score();

                    double error = _recursiveScoringStrategy.LowestError;

                    if (error < bestError)
                    {
                        bestError = error;
                    }
                    else
                    {
                        Transforms.Pop();
                        detrendedData = (List <double>)Utilities.DeepClone(data);
                        break;
                    }
                }

#if DEBUG
                StringBuilder sb = new StringBuilder();
                sb.AppendLine(String.Format("{0},{1}", "Original", "Ehler"));

                for (int i = 0; i < detrendedData.Count; i++)
                {
                    double d  = Data[(Data.Count - detrendedData.Count) + i];
                    double dt = detrendedData[i];

                    sb.AppendLine(String.Format("{0},{1}", d, dt));
                }
#endif
                data = (List <double>)Utilities.DeepClone(detrendedData);
            }while (_isRecursive);

            return(detrendedData);
        }
Exemple #3
0
        private List <double> RemoveBestPhaseShiftedCycle(List <double> Data, out ITransformation Transform, out double Error)
        {
            double[] cycle = GetCycle((Double[])Data.ToArray());

            for (int phase = (_maxCycleDelay * -1); phase < _maxCycleDelay; phase++)
            {
                List <double> decycledData = new List <double>();

                double lastX = 0.0;
                for (int i = 0; i < Data.Count; i++)
                {
                    if (((i + phase) < cycle.Length) && ((i + phase) >= 0))
                    {
                        decycledData.Add(Data[i] - cycle[i + phase]);
                        lastX = i + phase;
                    }
                }

                if (decycledData.Count < _minLength)
                {
                    continue;
                }

                _phaseShiftScoringStrategy.StartNewTransformation(Data, new EhlerTransformation(cycle, (int)lastX));
                int decycleIndex = 0;

                for (int i = 0; i < Data.Count; i++)
                {
                    if (((i + phase) < cycle.Length) && ((i + phase) >= 0))
                    {
                        _phaseShiftScoringStrategy.AddTransformedValue(decycledData[decycleIndex++]);
                    }
                }

                _phaseShiftScoringStrategy.Score();
            }

            Error     = _phaseShiftScoringStrategy.LowestError;
            Transform = _phaseShiftScoringStrategy.BestTransform;

            return(_phaseShiftScoringStrategy.BestTransformedData);
        }
Exemple #4
0
        public List <double> Remove(
            List <double> Data,
            ref Stack <ITransformation> Transforms)
        {
            if (Transforms == null)
            {
                Transforms = new Stack <ITransformation>();
            }

            var n = Data.Count;

            if (_fourierType == FourierType.FFT && ((n & (n - 1)) != 0))
            {
                throw new ApplicationException("for FFT data size needs to be a power of two");
            }

            List <Wave> waves = null;

            double[] t;

            DoFourier(Data, out waves, out t);


            double[] mags = new double[waves.Count];
            for (int i = 0; i < waves.Count; i++)
            {
                Wave wave = waves[i];
                mags[i] = (int)Math.Floor(wave.Magnitude);
            }

            double stdDevOfMags = Utilities.StandardDeviation(new List <double>(mags));

            _scoringStrategy.StartNewTransformation(Data, null);

            List <double> decycledData         = (List <double>)Utilities.DeepClone(Data);
            List <double> previousDecycledData = (List <double>)Utilities.DeepClone(decycledData);
            double        lowestError          = 0.0;

            double[] compositeWaveValues = new double[Data.Count];
            int      indexOfLowest       = 0;

            for (int i = 0; i < waves.Count; i++)
            {
                double frequency = waves[i].Frequency;
                double magnitude = waves[i].Magnitude;
                double phase     = waves[i].Phase;

                //if (magnitude / stdDevOfMags < _spectrumPeakStdDevs)
                //    break;

                for (int j = 0; j < decycledData.Count; j++)
                {
                    compositeWaveValues[j] += Math.Cos((2 * Math.PI * frequency * t[j]) + phase) * magnitude;
                    decycledData[j]        -= compositeWaveValues[j];
                    _scoringStrategy.AddTransformedValue(Data[j] - compositeWaveValues[j]);
                }

                _scoringStrategy.Score();

                double error = _scoringStrategy.LowestError;

                if (error < lowestError)
                {
                    lowestError   = error;
                    indexOfLowest = i;
                    decycledData  = (List <double>)Utilities.DeepClone(Data);
                }
            }

            compositeWaveValues = new double[Data.Count];

            CompositeWave compositeWave = new CompositeWave(WaveType.Cosine);

            double lastX = 0.0;

            for (int i = 0; i <= indexOfLowest; i++)
            {
                double frequency = waves[i].Frequency;
                double magnitude = waves[i].Magnitude;
                double phase     = waves[i].Phase;

                for (int j = 0; j < decycledData.Count; j++)
                {
                    compositeWaveValues[j] += Math.Cos((2 * Math.PI * frequency * t[j]) + phase) * magnitude;
                    decycledData[j]        -= (compositeWaveValues[j] * _filterWindowForResults.ValueAt(decycledData.Count, j));

                    lastX = t[j];
                }

                compositeWave.Add(new Wave(WaveType.Cosine, frequency, magnitude, phase));
            }

            Transforms.Push(new WaveTransformation(compositeWave, lastX));

#if DEBUG
            StringBuilder sbCompDecycle = new StringBuilder();

            for (int i = 0; i < compositeWaveValues.Length; i++)
            {
                double comp    = compositeWaveValues[i] * _filterWindowForResults.ValueAt(decycledData.Count, i);
                double decycle = decycledData[i];
                sbCompDecycle.AppendLine(String.Format("{0},{1}", comp, decycle));
            }
#endif

            return(decycledData);
        }