prop/lib/microwaveprop/propagation/mode_thresholds.ex

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