Esempio n. 1
0
        public override IList <double> Execute(IList <double> source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            var result = Context?.GetArray <double>(source.Count) ?? new double[source.Count];

            if (result.Length > 1)
            {
                var localExecuteContext = new LocalExecuteContext(Period);
                for (var i = 0; i < result.Length; i++)
                {
                    result[i] = Calc(localExecuteContext, source[i], i);
                }
            }
            return(result);
        }
Esempio n. 2
0
        public override IList <double> Execute(IList <double> source)
        {
            var result = Context.GetArray <double>(source.Count);

            if (result.Length > 0)
            {
                if (result.Length <= 6)
                {
                    source.CopyTo(result, 0);
                }
                else
                {
                    using (var executeContext = new LocalExecuteContext(source, Context))
                        for (var i = 0; i < result.Length; i++)
                        {
                            result[i] = Execute(executeContext, i);
                        }
                }
            }
            return(result);
        }
Esempio n. 3
0
        private double Calc(LocalExecuteContext localExecuteContext, double source, int index)
        {
            if (index == 0)
            {
                localExecuteContext.LastSource = source;
                return(0);
            }
            var m = source - localExecuteContext.LastSource;

            localExecuteContext.LastSource = source;

            var m1 = m > 0 ? m : 0;
            var m2 = m < 0 ? -m : 0;

            if (Period > 1)
            {
                if (localExecuteContext.M1.Count == Period)
                {
                    localExecuteContext.Osc1 -= localExecuteContext.M1.Dequeue();
                    localExecuteContext.Osc2 -= localExecuteContext.M2.Dequeue();
                }
                localExecuteContext.M1.Enqueue(m1);
                localExecuteContext.M2.Enqueue(m2);

                localExecuteContext.Osc1 += m1;
                localExecuteContext.Osc2 += m2;
            }
            else
            {
                localExecuteContext.Osc1 = m1;
                localExecuteContext.Osc2 = m2;
            }
            var oscSum = localExecuteContext.Osc1 + localExecuteContext.Osc2;
            var result = oscSum != 0 ? (localExecuteContext.Osc1 - localExecuteContext.Osc2) / oscSum * 100 : 0;

            return(result);
        }
Esempio n. 4
0
        private double Execute(LocalExecuteContext localExecuteContext, int index)
        {
            var source = localExecuteContext.Source;

            if (index < 6)
            {
                return(localExecuteContext.LastMama = localExecuteContext.LastFama = source[index]);
            }

            var smooth     = localExecuteContext.Smooth;
            var detrender  = localExecuteContext.Detrender;
            var i1         = localExecuteContext.I1;
            var q1         = localExecuteContext.Q1;
            var lastI2     = localExecuteContext.LastI2;
            var lastQ2     = localExecuteContext.LastQ2;
            var lastPeriod = localExecuteContext.LastPeriod;
            var lastPhase  = localExecuteContext.LastPhase;
            var lastRe     = localExecuteContext.LastRe;
            var lastIm     = localExecuteContext.LastIm;
            var lastMama   = localExecuteContext.LastMama;
            var lastFama   = localExecuteContext.LastFama;

            ShiftBuffer(smooth);
            ShiftBuffer(detrender);
            ShiftBuffer(i1);
            ShiftBuffer(q1);

            smooth[6]    = (4 * source[index] + 3 * source[index - 1] + 2 * source[index - 2] + source[index - 3]) / 10;
            detrender[6] = (.0962 * smooth[6] + .5769 * smooth[4] - .5769 * smooth[2] - .0962 * smooth[0]) *
                           (.075 * lastPeriod + .54);

            //Compute InPhase and Quadrature components
            q1[6] = (.0962 * detrender[6] + .5769 * detrender[4] - .5769 * detrender[2] - .0962 * detrender[0]) *
                    (.075 * lastPeriod + .54);
            i1[6] = detrender[3];

            //Advance the phase of I1 and Q1 by 90 degrees
            var jI = (.0962 * i1[6] + .5769 * i1[4] - .5769 * i1[2] - .0962 * i1[0]) * (.075 * lastPeriod + .54);
            var jQ = (.0962 * q1[6] + .5769 * q1[4] - .5769 * q1[2] - .0962 * q1[0]) * (.075 * lastPeriod + .54);

            //Phasor addition for 3 bar averaging)
            var i2 = i1[6] - jQ;
            var q2 = q1[6] + jI;

            //Smooth the I and Q components before applying the discriminator
            i2 = .2 * i2 + .8 * lastI2;
            q2 = .2 * q2 + .8 * lastQ2;

            //Homodyne Discriminator
            var re = i2 * lastI2 + q2 * lastQ2;
            var im = i2 * lastQ2 - q2 * lastI2;

            re = .2 * re + .8 * lastRe;
            im = .2 * im + .8 * lastIm;

            var period = 0D;

            if (im != 0 && re != 0)
            {
                period = 2 * Math.PI / Math.Atan2(im, re);
            }

            if (period > 1.5 * lastPeriod)
            {
                period = 1.5 * lastPeriod;
            }
            else if (period < .67 * lastPeriod)
            {
                period = .67 * lastPeriod;
            }

            if (period < 6)
            {
                period = 6;
            }
            else if (period > 50)
            {
                period = 50;
            }

            period = .2 * period + .8 * lastPeriod;
            //smoothPeriod = .33 * period + .67 * smoothPeriod[index - 1];

            var phase = 0D;

            if (i1[6] != 0)
            {
                phase = Math.Atan2(q1[6], i1[6]) * 180 / Math.PI;
            }

            var deltaPhase = Math.Max(1, lastPhase - phase);
            var alpha      = Math.Max(SlowLimit, FastLimit / deltaPhase);
            var mama       = alpha * source[index] + (1 - alpha) * lastMama;
            var result     = m_isMama ? mama : (localExecuteContext.LastFama = .5 * alpha * mama + (1 - .5 * alpha) * lastFama);

            localExecuteContext.LastI2     = i2;
            localExecuteContext.LastQ2     = q2;
            localExecuteContext.LastPeriod = period;
            localExecuteContext.LastPhase  = phase;
            localExecuteContext.LastRe     = re;
            localExecuteContext.LastIm     = im;
            localExecuteContext.LastMama   = mama;
            return(result);
        }
Esempio n. 5
0
 protected override void ClearExecuteContext()
 {
     m_localExecuteContext = null;
 }
Esempio n. 6
0
 protected override void InitExecuteContext()
 {
     m_localExecuteContext = new LocalExecuteContext(new ShrinkedList <double>(7), Context);
 }
Esempio n. 7
0
 protected override void InitExecuteContext()
 {
     m_localExecuteContext = new LocalExecuteContext(Period);
 }