# `Sidereon.Sidereal`
[🔗](https://github.com/neilberkman/sidereon-ex/blob/main/lib/sidereon/sidereal.ex#L1)

Sidereal repeat-period helpers and residual filtering.

Durations cross the public Elixir boundary as seconds. Residual samples are
unitless to the filter, so callers may pass metres, cycles, or another scalar
residual unit as long as each series uses one unit consistently.

# `constellation`

```elixir
@type constellation() ::
  :gps | :glonass | :galileo | :beidou | :qzss | :navic | :sbas | String.t()
```

# `error_reason`

```elixir
@type error_reason() ::
  :invalid_input | :no_broadcast_record | :unsupported_constellation | term()
```

# `satellite_id`

```elixir
@type satellite_id() ::
  String.t() | {String.t(), pos_integer()} | {atom(), pos_integer()}
```

# `filter`

```elixir
@spec filter([number()], number(), keyword() | Sidereon.Sidereal.FilterOptions.t()) ::
  {:ok, Sidereon.Sidereal.FilterOutput.t()} | {:error, error_reason()}
```

Filter a residual series with a supplied repeat period in seconds.

# `orbit_repeat_lag`

```elixir
@spec orbit_repeat_lag(Sidereon.GNSS.Broadcast.t(), satellite_id(), number()) ::
  {:ok, float()} | {:error, error_reason()}
```

Compute a broadcast-derived per-satellite orbit repeat lag in seconds.

# `periodicity_strength`

```elixir
@spec periodicity_strength([number()], [number()], keyword()) ::
  {:ok, [{float(), float()}]} | {:error, error_reason()}
```

Score repeating components at candidate periods.

Returns `{period_s, strength}` pairs, where strength is in `[0, 1]`.

# `repeat_period`

```elixir
@spec repeat_period(constellation()) :: float()
```

Return the default constellation repeat period in seconds.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
