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); }
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); }
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); }
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); }
protected override void ClearExecuteContext() { m_localExecuteContext = null; }
protected override void InitExecuteContext() { m_localExecuteContext = new LocalExecuteContext(new ShrinkedList <double>(7), Context); }
protected override void InitExecuteContext() { m_localExecuteContext = new LocalExecuteContext(Period); }