protected override void Update() { // samples // A B // Parent -2 -1 // Intergal -1 [Add] double value = 0; double timeA = -1; double timeB = -1; int countI = this.GetSampleCount(); if (countI > 0) { var sA = this.GetSample(-1); value = sA.value; timeA = sA.time; } int countP = _original.GetSampleCount(); Debug.Assert(countP > 0); if (countP == 1) { var sB = _original.GetSample(-1); timeB = sB.time; } else { var sA = _original.GetSample(-2); var sB = _original.GetSample(-1); Debug.Assert(countI == 0 || timeA == sA.time); timeB = sB.time; double S = (timeB - timeA) * (sA.value + sB.value) / 2 * _scale; //value += S; #if true value = value + S; #else double dt = timeB - timeA; // (0.. //double c = Math.Pow(0.001, dt * 1); double c = Math.Exp(-dt * 3); // c==1 if dt==0 value = (value * c) + S * (1.0 - c); Debug.WriteLine("Integrate: dt {0:0.0000} S {1:0.0000} c {2:0.0000} value {3}", dt, S, c, value); #endif } base.Add(timeB, value); }
protected override void Update() { double value = 0; var s1 = _original.GetSample(-1); var s2 = _original.GetSample(-2); Debug.Assert(s1.IsValid()); if (s2.IsValid()) { value = (s1.value - s2.value) / (s1.time - s2.time) * _scale; } Add(s1.time, value); }
protected override void Update() { var s1 = _original.GetSample(-1); var s2 = _original.GetSample(-2); Debug.Assert(s1.IsValid()); if (s2.IsValid()) { int sign = Math.Sign(s1.value - s2.value); if (_lastSign != sign) { if (_lastSign != 0) // s2 was an extrema - collect its time and sign { Add(s2.time, _lastSign); } _lastSign = sign; } } }
protected override void Update() { var sO = _original.GetSample(-2); var sE = _extremas.GetSample(-1); if (sO.IsValid() && sE.IsValid()) { if (sE.time == sO.time && sE.value == _sign) { base.Add(sO.time, sO.value); } } }
public void DrawSignal(Image image, double currentTime, double timeSpan, SignalSamples signal, Color color, double scaleY = 1.0) { int segmentLimit = 200; //!!! configure var poses = new List <Point>(); for (int i = 1; i <= segmentLimit; ++i) { var s = signal.GetSample(-i); if (!s.IsValid()) { break; // no more samples } double t = s.time - currentTime; Point pos = new Point((float)t, (float)(s.value * scaleY)); poses.Insert(0, pos); if (t < -timeSpan) { break; // gone out of view } } DrawSignal(image, poses.ToArray(), color); }