/// <summary> /// 清除粗差 /// </summary> /// <param name="satMwAmbiguityBaseInfo"></param> /// <returns></returns> private DataInfo cleanMwData(DDWideLineAmbiCycles satMwAmbiguityBaseInfo) { int count = satMwAmbiguityBaseInfo.MwDic.Count; //MW值是取观测值均值,其方差即是观测值均值的方差,不是观测值的方差,所以下面要还原为观测值的方差,剔除超出观测值三倍中误差以为的数据 double det0 = Math.Sqrt(satMwAmbiguityBaseInfo.GetDataVariance()); double average = satMwAmbiguityBaseInfo.GetDataAverage(); DataInfo cleanDataInfo = new DataInfo(); List <double> newMwDataList = new List <double>(); // = new Dictionary<SatelliteNumber, List<double>>(); double total = 0.0; foreach (var item in satMwAmbiguityBaseInfo.MwDic) { if ((item.Value) <= (average + 3 * det0) && (item.Value) >= (average - 3 * det0)) { newMwDataList.Add(item.Value); total += item.Value; } else { continue; } } double newAverage = total / newMwDataList.Count; total = 0.0; int n = newMwDataList.Count; for (int i = 0; i < n; i++) { total += (newMwDataList[i] - newAverage) * (newMwDataList[i] - newAverage); } cleanDataInfo.obsDataCount = n; cleanDataInfo.obsDataAverage = newAverage; cleanDataInfo.obsDataAverageVariance = (total / n) / n; cleanDataInfo.obsDataVariance = total / (n); return(cleanDataInfo); }
/// <summary> /// 固定宽巷模糊度(fix wide-lane ambiguity),以周为单位,波长是86cm /// 通过原始观测值构建宽巷观测值,取整固定 /// </summary> /// <param name="rovReceiverInfo"></param> /// <param name="refReceiverInfo"></param> /// <param name="fixedIntWideLineAmbiCycles"></param> /// <returns></returns> private bool tryFixWideLaneAmbguity(EpochInformation rovReceiverInfo, EpochInformation refReceiverInfo, out Vector fixedIntWideLineAmbiCycles) { Vector Vector = new Vector(); fixedIntWideLineAmbiCycles = new Vector(); List <string> paraNames = new List <string>(); foreach (var prn in rovReceiverInfo.EnabledPrns) { if (prn == CurrentBasePrn) { continue; } string paramName = prn.ToString() + "-" + CurrentBasePrn + Gnsser.ParamNames.PhaseLengthSuffix; if (!DoubleDifferWideLaneAmbiCyclesDic.ContainsKey(paramName)) { DoubleDifferWideLaneAmbiCyclesDic.Add(paramName, new DDWideLineAmbiCycles()); } EpochSatellite rovRoveSatInfo = rovReceiverInfo[prn]; EpochSatellite rovBaseSatInfo = rovReceiverInfo[CurrentBasePrn]; EpochSatellite refRoveSatInfo = refReceiverInfo[prn]; EpochSatellite refBaseSatInfo = refReceiverInfo[CurrentBasePrn]; //新弧段的判断,若有周跳、断裂等发生,重新计算新弧段MW平均值 if (rovRoveSatInfo.IsUnstable == true || rovBaseSatInfo.IsUnstable == true || refRoveSatInfo.IsUnstable == true || refBaseSatInfo.IsUnstable == true || Math.Abs(DoubleDifferWideLaneAmbiCyclesDic[paramName].lastEpoch - rovRoveSatInfo.RecevingTime) > MinArcGap) { DoubleDifferWideLaneAmbiCyclesDic[paramName] = new DDWideLineAmbiCycles();//是清零,而后再继续 } if (rovRoveSatInfo.Polar.Elevation < 30 || rovBaseSatInfo.Polar.Elevation < 30 || refRoveSatInfo.Polar.Elevation < 30 || refBaseSatInfo.Polar.Elevation < 30 ) //|| Math.Abs(DoubleDifferWideLaneAmbiCyclesDic[paramName].lastEpoch - rovRoveSatInfo.RecevingTime) > MinArcGap { continue; //是继续,而不是清零! } //double SatCurrentMwValue = SatCurrentInfo.Combinations.MwPhaseCombinationValue; //以周为单位,波长是86cm //var freqA = SatCurrentInfo.FrequenceA.Frequence; //var freqB = SatCurrentInfo.FrequenceB.Frequence; //double f1 = SatCurrentInfo.FrequenceA.Frequence.Value; //double f2 = SatCurrentInfo.FrequenceB.Frequence.Value; //double L1 = SatCurrentInfo.FrequenceA.PhaseRange.Value; //double L2 = SatCurrentInfo.FrequenceB.PhaseRange.Value; //double P1 = SatCurrentInfo.FrequenceA.PseudoRange.Value; //double P2 = SatCurrentInfo.FrequenceB.PseudoRange.Value; //double L11 = SatCurrentInfo.FrequenceA.PhaseRange.CorrectedValue + SatCurrentInfo.ApproxPhaseRangeA.Correction; //double L22 = SatCurrentInfo.FrequenceB.PhaseRange.CorrectedValue + SatCurrentInfo.ApproxPhaseRangeB.Correction; //double P11 = SatCurrentInfo.FrequenceA.PseudoRange.CorrectedValue + SatCurrentInfo.ApproxPseudoRangeA.Correction; //double P22 = SatCurrentInfo.FrequenceB.PseudoRange.CorrectedValue + SatCurrentInfo.ApproxPseudoRangeB.Correction; ////double L111=SatCurrentInfo.FrequenceA //double e = f1 / (f1 - f2); //double f = f2 / (f1 - f2); //double c = f1 / (f1 + f2); //double d = f2 / (f1 + f2); //double SatCurrentMwValue2 = SatCurrentInfo.Combinations.MwRangeCombination.Value / SatCurrentInfo.Combinations.MwRangeCombination.Frequence.WaveLength; //以周为单位,波长是86cm //double value = e * L1 - f * L2 - c * P1 - d * P2; //米为单位啊 //double value1 = e * L11 - f * L22 - c * P11 - d * P22;//米为单位啊 //double SatCurrentMwValue222 = value / SatCurrentInfo.Combinations.MwRangeCombination.Frequence.WaveLength; double SatCurrentMwValue = (rovRoveSatInfo.MwCycle - refRoveSatInfo.MwCycle) - (rovBaseSatInfo.MwCycle - refBaseSatInfo.MwCycle); DoubleDifferWideLaneAmbiCyclesDic[paramName].MwDic.Add(rovRoveSatInfo.ReceiverTime, SatCurrentMwValue); DoubleDifferWideLaneAmbiCyclesDic[paramName].lastEpoch = rovRoveSatInfo.ReceiverTime; // //根据Ge的论文,为避免估计偏差,AR不采纳观测时间小于20分钟的,同时中误差大于0.2周的也不用 if (DoubleDifferWideLaneAmbiCyclesDic[paramName].MwDic.Count <= 40) { continue; } //根据Ge的论文,为避免估计偏差,AR不采纳观测时间小于20分钟的,同时中误差大于0.2周的也不用 if (DoubleDifferWideLaneAmbiCyclesDic[paramName].MwDic.Count > 260) { // } #region 剔除大于3倍中误差的观测数据 DataInfo DDMwAverage = cleanMwData(DoubleDifferWideLaneAmbiCyclesDic[paramName]); #endregion double floatWL, vW; //variance of wide-lane ambiguity vW = DDMwAverage.obsDataAverageVariance; // /(lam_WL * lam_WL)); double dW = DDMwAverage.obsDataVariance; // /(lam_WL * lam_WL)); // MW值是取观测值均值,其方差即是观测值均值的方差,不是观测值的方差,所以下面要还原为观测值的方差,剔除超出观测值三倍方差以为的数据 if (Math.Sqrt(DDMwAverage.obsDataAverageVariance) > 0.4 || //|| Math.Sqrt(rovRoveMwAverage.obsDataVariance) > 0.1 DDMwAverage.obsDataCount < 40)//|| Math.Sqrt(vW) > 0.2|| Math.Sqrt(dW) > 0.2)//) { continue; } //wide-lane ambiguity(以周为单位) floatWL = (DDMwAverage.obsDataAverage);// / lam_WL;// +wlbias[sat1.PRN - 1] - wlbias[sat2.PRN - 1]; //就近取整,最接近BW的整数 int intWL = (int)Math.Floor(floatWL + 0.5); double intWL0 = Math.Round(floatWL); if (intWL0 != intWL) { throw new Exception("宽巷模糊度固定是取最接近实数的整数!此时没有取成功!"); } //validation of integer wide-lane ambiguity // if (Math.Abs(NW - BW) <= thresar2 && conffunc(NW, BW, Math.Sqrt(vW)) >= thresar1) if (conffunc(intWL, floatWL, Math.Sqrt(vW)) > thresar1 && Math.Abs(intWL - floatWL) < 0.25) //实数宽巷模糊度与其最近整数之差小于0.25周,剔除明显粗差影响 { Vector.Add(intWL, paramName); paraNames.Add(paramName); } } fixedIntWideLineAmbiCycles = Vector; fixedIntWideLineAmbiCycles.ParamNames = paraNames; if (fixedIntWideLineAmbiCycles.Count > 0) { return(true); } return(false); }