1   /* Copyright 2002-2025 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.estimation.measurements.gnss;
18  
19  import org.hipparchus.util.MathArrays;
20  import org.orekit.gnss.GnssSignal;
21  import org.orekit.gnss.MeasurementType;
22  import org.orekit.gnss.SatelliteSystem;
23  
24  /**
25   * Wide-Lane combination.
26   * <p>
27   * This combination are used to create a signal
28   * with a significantly wide wavelength.
29   * This longer wavelength is useful for cycle-slips
30   * detection and ambiguity fixing
31   * </p>
32   * <pre>
33   *              f1 * m1 - f2 * m2
34   *    mWL =  -----------------------
35   *                   f1 - f2
36   * </pre>
37   * With:
38   * <ul>
39   * <li>mWL: Wide-laning measurement.</li>
40   * <li>f1 : Frequency of the first measurement.</li>
41   * <li>m1 : First measurement.</li>
42   * <li>f2 : Frequency of the second measurement.</li>
43   * <li>m1 : Second measurement.</li>
44   * </ul>
45   * <p>
46   * Wide-Lane combination is a dual frequency combination.
47   * The two measurements shall have different frequencies but they must have the same {@link MeasurementType}.
48   * </p>
49   * @author Bryan Cazabonne
50   * @since 10.1
51   */
52  public class WideLaneCombination extends AbstractDualFrequencyCombination {
53  
54      /**
55       * Package private constructor for the factory.
56       * @param system satellite system for which the combination is applied
57       */
58      WideLaneCombination(final SatelliteSystem system) {
59          super(CombinationType.WIDE_LANE, system);
60      }
61  
62      /** {@inheritDoc} */
63      @Override
64      protected double getCombinedValue(final double obs1, final GnssSignal s1,
65                                        final double obs2, final GnssSignal s2) {
66          // Get the ration f/f0
67          final double ratioF1 = s1.getRatio();
68          final double ratioF2 = s2.getRatio();
69          // Perform combination
70          return MathArrays.linearCombination(ratioF1, obs1, -ratioF2, obs2) / (ratioF1 - ratioF2);
71      }
72  
73      /** {@inheritDoc} */
74      @Override
75      protected double getCombinedFrequency(final GnssSignal s1, final GnssSignal s2) {
76          return s1.getFrequency() - s2.getFrequency();
77      }
78  
79  }