/// <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); }
/** * * 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); }
/// <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); }
/// <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); }
/// <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); }
/// <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 + "尚不支持,请联系管理员。"); }
/// <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)); }
/// <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)); }
/// <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)); }