Пример #1
0
        /// <summary>
        ///C2C, GLONASS G2  k= -7...+12
        /// </summary>
        /// <param name="k">1-24卫星编号</param>
        /// <returns></returns>
        static public Frequence GetGlonassG2(int k)
        {
            // 7/16
            Frequence g2 = new Frequence("G2Of" + k, 1246.4375 + (k - 1) * 0.4375);

            return(g2);
        }
Пример #2
0
        /**
         *
         *  24 R01  1 R02 -4 R03  5 R04  6 R05  1 R06 -4 R07  5 R08  6 GLONASS SLOT / FRQ #
         *     R09 -2 R10 -7 R11  0 R12 -1 R13 -2 R14 -7 R15  0 R16 -1 GLONASS SLOT / FRQ #
         *     R17  4 R18 -3 R19  3 R20  2 R21  4 R22 -3 R23  3 R24  2 GLONASS SLOT / FRQ #
         */

        /// <summary>
        /// GLONASS G1
        /// </summary>
        /// <param name="k">1-24卫星编号</param>
        /// <returns></returns>
        static public Frequence GetGlonassG1(int k)
        {
            //  Frequence g1 = new Frequence("G1", 1602 + k * 9 / 16);
            Frequence g1 = new Frequence("G1Of" + k, 1602.5625 + (k - 1) * 0.5625);

            return(g1);
        }
Пример #3
0
        /// <summary>
        /// 两个频率组成新的频率。简单的线性组合
        /// 频率和载波相位都可以直接相加,而距离需要转换。
        /// </summary>
        /// <param name="factorA">系数A</param>
        /// <param name="bandA">频率A</param>
        /// <param name="factorB">系数B</param>
        /// <param name="bandB">频率B</param>
        /// <param name="name">名称</param>
        /// <returns></returns>
        public static Frequence GetCompositFreqence(double factorA, Frequence bandA, double factorB, Frequence bandB, string name = null)
        {
            double frequence = factorA * bandA.Value + factorB * bandB.Value;

            name = name ?? bandA.Name + "(" + factorA.ToString("0.00") + ")" + "_" + bandB.Name + "(" + factorA.ToString("0.00") + ")";
            Frequence band = new Frequence(name, frequence);

            return(band);
        }
Пример #4
0
        /// <summary>
        /// 通过载波作差求取的电离层与硬件延迟的系数。f1^2/(f1^2-f2^2)
        /// </summary>
        /// <param name="satelliteType"></param>
        /// <returns></returns>
        internal static double GetIonoAndDcbOfL2CoeffL1L2(SatelliteType satelliteType)
        {
            var    f1   = Frequence.GetFrequenceA(satelliteType);
            var    f2   = Frequence.GetFrequenceB(satelliteType);
            double f1f1 = f1.Value * f1.Value;
            double f2f2 = f2.Value * f2.Value;
            var    val  = 1.0 * f1f1 / (f1f1 - f2f2);

            return(val);
        }
Пример #5
0
        /// <summary>
        /// 相等否
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override bool Equals(object obj)
        {
            Frequence o = obj as Frequence;

            if (o == null)
            {
                return(false);
            }

            return(Name == (o.Name) && Value == o.Value);
        }
        /// <summary>
        /// 处理过程
        /// </summary>
        /// <param name="current"></param>
        public override void Process(RinexEpochObservation current)
        {
            if (current.Count == 0)
            {
                return;
            }

            //需要缓存支持,建立头文件
            if (this.CurrentIndex == 0 || CurrentHeader == null)
            {
                //首次建立头文件,需要缓存支持
                this.CurrentHeader = BuildOutputHeader(OldHeader);
            }


            //移除观测值为 0 的载波相位
            if (Option.IsRemoveZeroPhaseSat)
            {
                List <SatelliteNumber> tobeDeletes = new List <SatelliteNumber>();
                foreach (var sat in current)
                {
                    foreach (var item in CurrentHeader.ObsCodes)
                    {
                        if (sat.Prn.SatelliteType == item.Key)
                        {
                            foreach (var code in item.Value)
                            {
                                if (code.StartsWith("L") && sat.TryGetValue(code) == 0)
                                {
                                    tobeDeletes.Add(sat.Prn);
                                }
                            }
                        }
                    }
                }
                current.Remove(tobeDeletes);
            }


            //移除观测值为 0 的伪距
            if (Option.IsRemoveZeroRangeSat)
            {
                List <SatelliteNumber> tobeDeletes = new List <SatelliteNumber>();
                foreach (var sat in current)
                {
                    foreach (var item in CurrentHeader.ObsCodes)
                    {
                        if (sat.Prn.SatelliteType == item.Key)
                        {
                            foreach (var code in item.Value)
                            {
                                if ((code.StartsWith("C") || code.StartsWith("P")) && sat.TryGetValue(code) == 0)
                                {
                                    tobeDeletes.Add(sat.Prn);
                                }
                            }
                        }
                    }
                }
                current.Remove(tobeDeletes);
            }

            //修复大周跳
            if (Option.IsAmendBigCs)
            {
                foreach (var sat in current)
                {
                    //第一频率
                    var  wlenA    = Frequence.GetFrequence(sat.Prn, 1, current.ReceiverTime).WaveLength;
                    var  window   = this.PhaseACycleSlipAmender.GetOrCreate(sat.Prn);
                    var  referVal = sat.RangeA.Value / wlenA;
                    bool isRested = false;
                    sat.PhaseA.Value = window.FitCheckAddAndAlignWithStep(current.ReceiverTime, sat.PhaseA.Value, out isRested, referVal, 2, 50, 100);
                    //若重置,则应该标记周跳或失锁
                    if (isRested)
                    {
                        sat.PhaseA.LossLockIndicator = LossLockIndicator.Bad;
                    }
                    //第二频率
                    var phaseB = sat.PhaseB;
                    if (phaseB != null)
                    {
                        var  wlenB     = Frequence.GetFrequence(sat.Prn, 2, current.ReceiverTime).WaveLength;
                        var  windowB   = this.PhaseBCycleSlipAmender.GetOrCreate(sat.Prn);
                        var  referValB = sat.RangeB.Value / wlenB;
                        bool isRestedB = false;
                        sat.PhaseB.Value = windowB.FitCheckAddAndAlignWithStep(current.ReceiverTime, sat.PhaseB.Value, out isRested, referValB, 2, 50, 100);
                        //若重置,则应该标记周跳或失锁
                        if (isRestedB)
                        {
                            sat.PhaseB.LossLockIndicator = LossLockIndicator.Bad;
                        }
                    }
                }
            }

            //是否启用A B 相位对齐
            if (Option.IsEnableAlignPhase)
            {
                foreach (var sat in current)
                {
                    var NumericalAligner = NumericalAlignerManagerPhaseA.GetOrCreate(sat.Prn);
                    var phaseA           = sat.PhaseA;
                    var rangeA           = sat.RangeA.Value / Frequence.GetFrequence(sat.Prn, 1, current.ReceiverTime).WaveLength;

                    phaseA.Value = NumericalAligner.GetAlignedValue(current.ReceiverTime, phaseA.Value, rangeA);


                    var phaseB = sat.PhaseB;
                    if (phaseB != null)
                    {
                        var NumericalAlignerB = NumericalAlignerManagerPhaseB.GetOrCreate(sat.Prn);
                        var rangeB            = sat.RangeB.Value / Frequence.GetFrequence(sat.Prn, 2, current.ReceiverTime).WaveLength;

                        phaseB.Value = NumericalAlignerB.GetAlignedValue(current.ReceiverTime, phaseB.Value, rangeB);
                    }
                }
            }
            //载波相位相位转换为距离
            if (Option.IsConvertPhaseToLength)
            {
                foreach (var item in current)
                {
                    if (item.Prn.SatelliteType == SatelliteType.G)
                    {
                        foreach (var val in item)
                        {
                            if (val.Key.Contains("L1"))
                            {
                                val.Value.Value = val.Value.Value * Frequence.GpsL1.WaveLength;
                            }
                            if (val.Key.Contains("L2"))
                            {
                                val.Value.Value = val.Value.Value * Frequence.GpsL2.WaveLength;
                            }
                        }
                    }
                }
            }

            //update
            PrevOkEpoch    = current.ReceiverTime;
            current.Header = this.CurrentHeader;

            //判断并写入文件
            WriteToFile(current);
        }
Пример #7
0
        /// <summary>
        /// 获取频率带宽
        /// </summary>
        /// <param name="type">系统类型</param>
        /// <param name="freqType">频率类型</param>
        /// <param name="satNumber">卫星编号,GLONASS 系统需要</param>
        /// <param name="time">time,GLONASS 系统需要</param>
        /// <returns></returns>
        public static Frequence GetFrequenceBand(GnssType type, FrequenceType freqType, int satNumber = -1, Time time = default(Time))
        {
            switch (type)
            {
            case GnssType.GPS:
            case GnssType.SBAS:
                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.GpsL1);

                case FrequenceType.B: return(Frequence.GpsL2);

                case FrequenceType.C: return(Frequence.GpsL5);

                default:
                    return(null);
                    // throw new ArgumentException("GPS 有三个频率。分别以编号1、2、3表示。");
                }

            case GnssType.Galileo:
                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.GalileoE1);

                case FrequenceType.B: return(Frequence.GalileoE5a);

                case FrequenceType.C: return(Frequence.GalileoE5b);

                case FrequenceType.D: return(Frequence.GalileoE5);

                case FrequenceType.E: return(Frequence.GalileoE6);

                default:
                    return(null);
                    //  throw new ArgumentException("Galileo 有5个频率。分别以编号 1-5 表示。");
                }

            case GnssType.BeiDou:     //215786
                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.CompassB1);

                case FrequenceType.B: return(Frequence.CompassB2);

                case FrequenceType.C: return(Frequence.CompassB3);

                default:
                    return(null);
                    //   throw new ArgumentException("BeiDou 有三个频率。分别以编号1、2、3表示。");
                }

            case GnssType.GLONASS:
                if (satNumber == -1)
                {
                    throw new ArgumentException("GLONASS是频分多址,需要指定卫星编号,此处有待改进!!!!请联系开发人员。");
                }
                var prn = new SatelliteNumber(satNumber, SatelliteType.R);
                var k   = (int)GlobalGlonassSlotFreqService.Instance.Get(prn, time);
                //   var k = Setting.GnsserConfig.GlonassSlotFrequences[prn];

                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.GetGlonassG1(k));

                case FrequenceType.B: return(Frequence.GetGlonassG2(k));

                case FrequenceType.C: return(Frequence.GlonassG3);

                default:
                    return(null);
                    //  throw new ArgumentException("GLONASS 有2个载波。分别以编号1、2表示。");
                }

            case GnssType.QZSS:
                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.GpsL1);

                case FrequenceType.B: return(Frequence.GpsL2);

                case FrequenceType.C: return(Frequence.GpsL5);

                case FrequenceType.D: return(Frequence.QzssL6);

                default:
                    return(null);
                }

            case GnssType.NAVIC:
                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.NavicL5);

                default:
                    return(null);
                }

            default:

                switch (freqType)
                {
                case FrequenceType.A: return(Frequence.GpsL1);

                case FrequenceType.B: return(Frequence.GpsL2);

                case FrequenceType.C: return(Frequence.GpsL5);

                default:
                    return(null);
                }
            }

            throw new ArgumentException(type + "尚不支持,请联系管理员。");
        }
Пример #8
0
 /// <summary>
 /// 对应的频率
 /// </summary>
 /// <param name="satNum">卫星编号,如果码分多址则不需要,频分多址则需要,如GLONASS</param>
 /// <returns></returns>
 public Frequence GetFrequence(int satNum = -1, Time time = default(Time))
 {
     return(Frequence.GetFrequence(SatelliteType, RinexCarrierNumber, satNum, time));
 }
Пример #9
0
 /// <summary>
 /// 获取窄项
 /// </summary>
 /// <param name="A"></param>
 /// <param name="B"></param>
 /// <returns></returns>
 public static Frequence GetNarrowBand(Frequence A, Frequence B)
 {
     return(new Frequence("NarrowBand", A.Value + B.Value));
 }
Пример #10
0
 /// <summary>
 /// 获取宽项
 /// </summary>
 /// <param name="A"></param>
 /// <param name="B"></param>
 /// <returns></returns>
 public static Frequence GetWideBand(Frequence A, Frequence B)
 {
     return(new Frequence("WideBand", A.Value - B.Value));
 }