private static void CalcolaFrequenzaDebug(TimeReference elapsed, TimeReference now) { if (!elapsed.IsLowResZero) { mDebugFrequency = elapsed.CalculateHiResFrequency(); } }
private static void ApplicaNuovaFrequenza(TimeReference delta) { long mNewFrequency = delta.CalculateHiResFrequency(); //applica la media geometrica tra vecchia e nuova frequenza //compensa l'oscillazione del valore dovuta al fatto che la mNewFrequency una volta viene in eccesso e una volta viene in difetto //ed è ugualmente veloce verso numeri grossi e verso numeri piccoli (a differenza della media aritmetica) long mCompFrequency = mCurrentFrequency == 0 ? mNewFrequency : (long)(Math.Sign(mNewFrequency) * Math.Sqrt(Math.Abs((double)mCurrentFrequency * mNewFrequency))); #if timedebug double TimeError = (delta.HiResNano - delta.LowResNano) / (double)NANO_IN_MILLI; long TargetFrequency = (long)Math.Round(mOriginalFrequency * testmultiplier); long anew = Math.Abs(mCompFrequency); long atar = Math.Abs(TargetFrequency); double PercError = (anew > atar) ? (anew - atar) * 100.0 / anew : -(atar - anew) * 100.0 / atar; if (mCorrectionCount == 0) { System.Diagnostics.Debug.WriteLine(" TIME \t ERROR \t OLD \t NEW \t COM \t TARGET \t DELAY \tWINDOW SIZE"); } System.Diagnostics.Debug.WriteLine(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:00.000}\t{1:+00.00000;-00.00000}\t{2:000000000}\t{3:000000000}\t{4:000000000}\t{5:000000000}\t{6:+00.0;-00.0}ms\t[LR {7}ms HR {8:0.00}ms REF {9:0.00}ms]", DateTime.Now.Subtract(startDT).TotalSeconds, PercError, mCurrentFrequency, mNewFrequency, mCompFrequency, TargetFrequency, TimeError, delta.LowRes, delta.HiResNano / (double)NANO_IN_MILLI, delta.ReferenceNano / (double)NANO_IN_MILLI)); #else double TimeError = (delta.HiResNano - delta.LowResNano) / (double)NANO_IN_MILLI; System.Diagnostics.Debug.WriteLine($"CLOCK CORRECTION:\t{mCurrentFrequency:000000000}\t{mNewFrequency:000000000}\t{mCompFrequency:000000000}\t{TimeError:0.00}ms\tΔHiRes\t{delta.HiRes}\tΔLowRes\t{delta.LowRes}"); #endif mCurrentFrequency = mCompFrequency; mCorrectionCount++; }
private static void ApplicaNuovaFrequenza(TimeReference elapsed, TimeReference now) { long newfreq = elapsed.CalculateHiResFrequency(); #if timedebug long target = (long)Math.Round(mOriginalFrequency * testmultiplier); System.Diagnostics.Debug.WriteLine(String.Format("{0} -> {1} target {2} err {3:+0.00000;-0.00000}% trigger with {4:+00.000;-00.000}", mCurrentFrequency, newfreq, target, (newfreq - target) * 100.0 / target, elapsed.Error)); #else System.Diagnostics.Debug.WriteLine(String.Format("{0} -> {1}", mCurrentFrequency, newfreq)); #endif AssignFrequency(newfreq, now.HiRes); #if timedebug AlignmentCount++; #endif }