Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }