Sidereon.GNSS.Signal.Analysis (Sidereon v0.23.0)

Copy Markdown View Source

Closed-form GNSS signal spectrum and tracking metrics.

This module is a thin Elixir boundary over the core signal-analysis formulas. Modulations are plain maps built by bpsk/1 and boc_sine/2; metric calls return {:ok, value} or {:error, reason}.

Summary

Types

DLL thermal-noise options.

DLL jitter result.

Navigation-signal modulation descriptor.

Multipath-envelope options.

One multipath-envelope point.

Functions

Build a sine-phased BOC(m,n) modulation descriptor.

Build a BPSK(n) modulation descriptor.

Return early-late DLL thermal-noise jitter.

Return the DLL lower bound for code-delay tracking jitter.

Return effective C/N0 after finite-band interference terms.

Return the fraction of total signal power inside a two-sided receiver bandwidth.

Return a one-path early-late multipath envelope on the supplied delay grid.

Return normalized PSD values in 1/Hz at one offset or a list of offsets.

Return RMS bandwidth over a two-sided receiver bandwidth, in hertz.

Return spectral separation coefficient in decibel-hertz.

Return spectral separation coefficient in hertz.

Types

dll_options()

@type dll_options() :: %{
  cn0_db_hz: number(),
  loop_bandwidth_hz: number(),
  integration_time_s: number(),
  correlator_spacing_chips: number(),
  receiver_bandwidth_hz: number()
}

DLL thermal-noise options.

jitter()

@type jitter() :: %{
  seconds: float(),
  chips: float(),
  meters: float(),
  squaring_loss: float()
}

DLL jitter result.

modulation()

@type modulation() ::
  %{kind: :bpsk, order: number()} | %{kind: :boc_sine, m: number(), n: number()}

Navigation-signal modulation descriptor.

multipath_options()

@type multipath_options() :: %{
  multipath_to_direct_ratio: number(),
  correlator_spacing_chips: number(),
  receiver_bandwidth_hz: number()
}

Multipath-envelope options.

multipath_point()

@type multipath_point() :: %{
  delay_chips: float(),
  delay_s: float(),
  in_phase_chips: float(),
  in_phase_s: float(),
  in_phase_m: float(),
  anti_phase_chips: float(),
  anti_phase_s: float(),
  anti_phase_m: float(),
  running_average_chips: float(),
  running_average_s: float(),
  running_average_m: float()
}

One multipath-envelope point.

Functions

boc_sine(m, n)

@spec boc_sine(number(), number()) :: modulation()

Build a sine-phased BOC(m,n) modulation descriptor.

bpsk(order)

@spec bpsk(number()) :: modulation()

Build a BPSK(n) modulation descriptor.

dll_jitter(modulation, options, processing \\ :coherent)

@spec dll_jitter(modulation(), dll_options(), :coherent | :non_coherent) ::
  {:ok, jitter()} | {:error, term()}

Return early-late DLL thermal-noise jitter.

processing is :coherent or :non_coherent.

dll_lower_bound(modulation, options)

@spec dll_lower_bound(modulation(), dll_options()) ::
  {:ok, jitter()} | {:error, term()}

Return the DLL lower bound for code-delay tracking jitter.

effective_cn0_degradation(desired, cn0_db_hz, receiver_bandwidth_hz, interferences)

@spec effective_cn0_degradation(modulation(), number(), number(), [map()]) ::
  {:ok,
   %{
     effective_cn0_hz: float(),
     effective_cn0_db_hz: float(),
     degradation_db: float()
   }}
  | {:error, term()}

Return effective C/N0 after finite-band interference terms.

Each interference is a map with :modulation and :power_ratio_to_carrier.

fraction_power(modulation, receiver_bandwidth_hz)

@spec fraction_power(modulation(), number()) :: {:ok, float()} | {:error, term()}

Return the fraction of total signal power inside a two-sided receiver bandwidth.

multipath_envelope(modulation, options, delay_chips)

@spec multipath_envelope(modulation(), multipath_options(), [number()]) ::
  {:ok, [multipath_point()]} | {:error, term()}

Return a one-path early-late multipath envelope on the supplied delay grid.

psd_hz(modulation, offset_hz)

@spec psd_hz(modulation(), number() | [number()]) ::
  {:ok, float() | [float()]} | {:error, term()}

Return normalized PSD values in 1/Hz at one offset or a list of offsets.

rms_bandwidth_hz(modulation, receiver_bandwidth_hz)

@spec rms_bandwidth_hz(modulation(), number()) :: {:ok, float()} | {:error, term()}

Return RMS bandwidth over a two-sided receiver bandwidth, in hertz.

ssc_db_hz(desired, interference, receiver_bandwidth_hz)

@spec ssc_db_hz(modulation(), modulation(), number()) ::
  {:ok, float()} | {:error, term()}

Return spectral separation coefficient in decibel-hertz.

ssc_hz(desired, interference, receiver_bandwidth_hz)

@spec ssc_hz(modulation(), modulation(), number()) ::
  {:ok, float()} | {:error, term()}

Return spectral separation coefficient in hertz.