/// <summary> /// 钟差探测与修复器 /// </summary> /// <param name="maxBreakingSecond"></param> public ClockJumpCorrector2(double maxBreakingSecond) { int windowSize = 5; WindowA = new TimeNumeralWindowData(windowSize, maxBreakingSecond); MaxRmsTimes = 8; }
/// <summary> /// 注册数据 /// </summary> /// <param name="paramName"></param> /// <param name="time"></param> /// <param name="val"></param> /// <param name="isBreakTime">是否重新记录,如发生了周跳</param> public void Regist(string paramName, Time time, double val, bool isBreakTime) { TimePeriod period = null; TimeNumeralWindowData winData = null; var last = this.GetLastTimePeriod(paramName); if (last != null) { winData = GetWindowData(last); if (winData.Count > 0) { var differ = Math.Abs(winData.AverageValue - val); if (differ > MaxDiffer) { //重新建立分区 period = base.Regist(paramName, time, true); winData = GetWindowData(period); } } } if (period == null)//新建 { period = base.Regist(paramName, time, isBreakTime); winData = GetWindowData(period); } //最后都要添加 winData.Add(time, val); }
/// <summary> /// 获取窗口 /// </summary> /// <param name="prn"></param> /// <param name="frequenceType"></param> /// <returns></returns> public TimeNumeralWindowData GetBufferValues(SatelliteNumber prn, FrequenceType frequenceType) { TimeNumeralWindowData window = new TimeNumeralWindowData(WindowSize); var buffer = this.Buffers; //首先从过去的 var lastWindowOfP1 = LastWindowDataManager.GetOrCreate(BuildKey(prn, frequenceType)); window.Add(lastWindowOfP1); //然后从bufffer里面提取另一半 var bufferOfEpoches = buffer.GetSubList(0, HalfWindowSize); foreach (var epoch in bufferOfEpoches) { if (epoch.Contains(prn)) { var sat = epoch[prn]; var time = epoch.ReceiverTime; var p = sat[frequenceType].PseudoRange.Value;//原始数据 window.Add(time, p); } } return(window); }
/// <summary> /// 提取绑定的窗口数据 /// </summary> /// <param name="period"></param> /// <returns></returns> public TimeNumeralWindowData GetWindowData(TimePeriod period) { TimeNumeralWindowData data = null; if (period.Tag == null) { data = new TimeNumeralWindowData(100000, MaxGapSecond * 2); period.Tag = data; } else { data = period.Tag as TimeNumeralWindowData; } return(data); }
public TimePeriod GetTimePeriod(string key, TimeNumeralWindowData manager) { var vals = Get(key); foreach (var item in vals) { var data = item.Tag as TimeNumeralWindowData; if (data == null) { continue; } if (data == manager) { return(item); } } return(null); }
/// <summary> /// 数据多项式平滑器 /// </summary> /// <param name="maxEpochCount"></param> /// <param name="name"></param> public TimedSmoothValueBuilder(int maxEpochCount, string name) { this.Name = name; NumeralWindowData = new TimeNumeralWindowData(maxEpochCount, 5 * 60); this.Order = 2; }