Sidereon.ClockStability (Sidereon v0.24.0)

Copy Markdown View Source

Allan-family clock-stability estimators.

The functions in this module delegate to sidereon-core's IEEE-1139 Allan, modified Allan, Hadamard, and time-deviation estimators. Phase deviations are in seconds, fractional-frequency samples are dimensionless, and averaging times are seconds.

Summary

Functions

Plain non-overlapping Allan deviation for explicit averaging factors.

Compute a configured set of Allan-family curves.

Identify power-law clock noise from supplied ADEV and MDEV curves.

Overlapping Hadamard deviation for explicit averaging factors.

Modified Allan deviation for explicit averaging factors.

Fully overlapping Allan deviation for explicit averaging factors.

Return the exact Allan-family log-log slope for a power-law noise type.

Extract RINEX receiver-clock phase deviations in seconds.

Time deviation for explicit averaging factors.

Types

allan_error()

@type allan_error() ::
  :empty_series
  | :invalid_tau0
  | :no_estimators
  | :empty_tau_grid
  | :invalid_averaging_factor
  | :too_few_samples
  | :non_finite_sample
  | :gap
  | :non_finite_tau
  | :non_finite_deviation
  | :invalid_options
  | :invalid_curve
  | term()

estimator()

@type estimator() :: :adev | :overlapping_adev | :mdev | :hdev | :tdev

gap_policy()

@type gap_policy() :: :reject | :omit_terms

power_law_noise_type()

@type power_law_noise_type() ::
  :random_walk_fm | :flicker_fm | :white_fm | :flicker_pm | :white_pm

series()

@type series() ::
  [number()]
  | {:phase_seconds, [number()]}
  | {:fractional_frequency, [number()]}
  | {:phase_seconds_with_gaps, [number() | nil]}
  | {:fractional_frequency_with_gaps, [number() | nil]}

tau_grid()

@type tau_grid() :: :octave | :all | {:explicit, [pos_integer()]}

Functions

allan_deviation(series, tau0_s, averaging_factors)

@spec allan_deviation(series(), number(), [pos_integer()]) ::
  {:ok, Sidereon.ClockStability.Curve.t()} | {:error, allan_error()}

Plain non-overlapping Allan deviation for explicit averaging factors.

tau0_s is the base sample interval in seconds. averaging_factors are the integer m values, so each output tau_s is m * tau0_s.

compute_allan_deviations(series, tau0_s, opts \\ [])

@spec compute_allan_deviations(series(), number(), keyword()) ::
  {:ok, Sidereon.ClockStability.Curves.t()} | {:error, allan_error()}

Compute a configured set of Allan-family curves.

Options:

  • :estimators - :standard for OADEV, MDEV, HDEV, and TDEV, :all, :none, a list of estimator atoms, or a map of estimator booleans.
  • :tau_grid - :octave, :all, or {:explicit, factors}. Averaging times are seconds.
  • :gap_policy - :reject or :omit_terms for gapped series.

fit_power_law_noise(adev, mdev, opts \\ [])

Identify power-law clock noise from supplied ADEV and MDEV curves.

hadamard_deviation(series, tau0_s, averaging_factors)

@spec hadamard_deviation(series(), number(), [pos_integer()]) ::
  {:ok, Sidereon.ClockStability.Curve.t()} | {:error, allan_error()}

Overlapping Hadamard deviation for explicit averaging factors.

tau0_s and returned tau_s values are seconds.

modified_adev(series, tau0_s, averaging_factors)

@spec modified_adev(series(), number(), [pos_integer()]) ::
  {:ok, Sidereon.ClockStability.Curve.t()} | {:error, allan_error()}

Modified Allan deviation for explicit averaging factors.

tau0_s and returned tau_s values are seconds.

overlapping_adev(series, tau0_s, averaging_factors)

@spec overlapping_adev(series(), number(), [pos_integer()]) ::
  {:ok, Sidereon.ClockStability.Curve.t()} | {:error, allan_error()}

Fully overlapping Allan deviation for explicit averaging factors.

tau0_s and returned tau_s values are seconds.

power_law_slope(noise_type, estimator \\ :adev)

@spec power_law_slope(power_law_noise_type(), :adev | :overlapping_adev | :mdev) ::
  float()

Return the exact Allan-family log-log slope for a power-law noise type.

receiver_clock_phase_deviations(observations)

@spec receiver_clock_phase_deviations(Sidereon.GNSS.RINEX.Observations.t()) :: [
  float() | nil
]

Extract RINEX receiver-clock phase deviations in seconds.

Event epochs are returned as nil gaps. The result can be passed as {:phase_seconds_with_gaps, values} to compute_allan_deviations/3.

time_deviation(series, tau0_s, averaging_factors)

@spec time_deviation(series(), number(), [pos_integer()]) ::
  {:ok, Sidereon.ClockStability.Curve.t()} | {:error, allan_error()}

Time deviation for explicit averaging factors.

Returned deviation values are seconds.