35 lines
936 B
Elixir
35 lines
936 B
Elixir
defmodule Microwaveprop.Propagation.ModeThresholds do
|
|
@moduledoc """
|
|
Required-SNR thresholds (dB) for the modes the rover planner supports.
|
|
|
|
The rover predicts a per-link SNR margin; subtracting the mode's required
|
|
SNR yields "dB above decode threshold". Numbers come from the rover spec —
|
|
SSB needs full quieting, CW pulls signals well below the noise floor, and
|
|
Q65 modes go deeper still.
|
|
"""
|
|
|
|
@thresholds %{
|
|
ssb: 0.0,
|
|
cw: -18.0,
|
|
q65_60a: -24.0,
|
|
q65_120b: -26.0
|
|
}
|
|
|
|
@modes [
|
|
{:ssb, "SSB"},
|
|
{:cw, "CW"},
|
|
{:q65_60a, "Q65-60A"},
|
|
{:q65_120b, "Q65-120B"}
|
|
]
|
|
|
|
@type mode :: :ssb | :cw | :q65_60a | :q65_120b
|
|
|
|
@spec required_snr_db(mode()) :: float()
|
|
def required_snr_db(mode) when is_map_key(@thresholds, mode), do: Map.fetch!(@thresholds, mode)
|
|
|
|
@spec modes() :: [{mode(), String.t()}]
|
|
def modes, do: @modes
|
|
|
|
@spec default_mode() :: mode()
|
|
def default_mode, do: :ssb
|
|
end
|