Skip to content

Over-the-horizon atmospheric ray-tracing

Here is a plug-and-play way to use atmospheric ray-tracing so the Quantum SCYTHE Rydberg stack can “see” and classify signals beyond the radio horizon by riding ducts and refracted paths—then fuse those predictions directly into SignalIntelligence + DOMA motion tracking.

Over-the-horizon with ray-tracing (what + why)

  • Tropospheric ducts & refractive bending can trap or bend RF so paths skirt the Earth and resurface hundreds of km away. If we ray-trace those paths in real time, we can:
    1. Pre-point the Rydberg receiver (az/el, frequency window, sampling) toward the predicted re-emergence angles;
    2. Debias classification with path-aware priors (delay, Doppler, angle spread);
    3. Exploit illuminators of opportunity (FM, DVB-T, 5G) for bistatic imaging and OTH classification.

The SignalIntelligence core already has the right scaffolding to host this (attention encoder, external data sources, DOMA tracker, ghost anomaly logic). We’ll add a Ray Engine and fuse its outputs as metadata/features.


Minimal architecture (bolt-on)

1) Atmosphere→Refractivity profile

  • Ingest: radiosonde (if available), coastal MET, or simple param model.
  • Build N(z) and modified refractivity M(z) ≈ N(z) + 0.157·z(m).
  • Detect ducts (surface/evaporation/elevated) where dM/dz < 0 over an interval.

2) Hybrid Ray / Parabolic-Equation (PE) engine

  • Fast ray-launch sweep (elevation grid, e.g., −2°…+5°, Δ0.05°) with variable index n(z) to find viable OTH hits and grazing angles.
  • When a duct is found, switch to a narrow-beam PE stepper to estimate path loss, angle spread, and delay more accurately.
  • Output per viable path: {az, el, range_km, delay_ms, doppler_hz, path_loss_db, is_ducted}.

3) Rydberg sensor steering + demod presets

  • Use {az, el} to aim the optical axis / collection optics, and set IF center + ±BW windows and tracking PLL priors (expected Doppler, drift).

4) Feature fusion for classification

  • Attach the ray bundle to each detection: signal.metadata['ray_paths'] = [...].
  • Derived features (to feed your ML): expected_angle, path_loss, duct_flag, delay, doppler_prior, multipath_K. These slot naturally beside your spectrum/attention features.

5) DOMA motion synergy

  • Use ray-consistent Doppler to constrain DOMA trajectories and reduce spurious tracks over water/thermal inversions. Store {ray_el, doppler_prior} in trajectory points.

Drop-in integration points (code-level)

A. New module: SignalIntelligence/atmo_ray_tracer.py

class AtmoRayTracer:
    def __init__(self, earth_k=4/3, el_grid=(-2.0, 5.0, 0.05)):
        self.k = earth_k; self.el_grid = el_grid
    def build_M_profile(self, met):
        # met -> N(z); M(z) = N(z) + 0.157*z_m
        return z, M, ducts  # intervals where dM/dz<0
    def trace(self, tx_pos, rx_pos, freq_hz, met):
        # 1) ray fan search using n(z)=1+N*1e-6
        # 2) PE refinement if duct present
        # returns list of viable paths with {az, el, range_km, delay_ms, doppler_hz, path_loss_db, is_ducted}
        return paths

B. Wire into your processing path (right before spectrum → tensor):

# inside SignalIntelligenceSystem.process_signal(...)
met = self._get_met_snapshot()          # your MET fetch or param model
paths = self.ray_tracer.trace(tx_pos=None, rx_pos=self._rx_pos(),
                              freq_hz=signal.frequency, met=met)
signal.metadata["ray_paths"] = paths
# prime frequency_shift_augment with Doppler prior
if paths:
    doppler = paths[0]["doppler_hz"]
    signal.metadata["doppler_prior_hz"] = doppler

C. Feed the classifier (your ML already accepts rich metadata):

  • Concatenate compact ray features with your attention encoder inputs or pass as side-channel tensors. Your SpectrumEncoder + token dropout flow is already set up to accept auxiliary features alongside spectrum vectors.

D. DOMA tracker

# When adding trajectory points
point.metadata["ray_el"] = paths[0]["el"] if paths else None
point.metadata["is_ducted"] = any(p["is_ducted"] for p in paths)

This tightens prediction in predict_next_position by constraining feasible geometry over sea ducts/inversions.


Practical “bounce” playbooks

Playbook 1 – Passive OTH classification (coastal duct)

  1. Station near coast; est. evaporation duct (M decreasing in first ~20–40 m).
  2. Launch ray fan; pick ducted paths with min loss to 200–400 km.
  3. Aim Rydberg toward predicted emergence elevation (often slightly negative to grazing).
  4. Lock on illuminators (FM/DVB-T/5G); build delay–Doppler map from reflections; classify emitters with your frequency-shift-normalized spectra. (Your FrequencyShiftAugmentor already handles Doppler/offset—perfect here.)

Playbook 2 – Bistatic imaging

  • Use a known broadcast tower as Tx (no emissions on your side).
  • Trace Tx→duct→target→duct→Rx paths; solve small-angle geometry to get bistatic range and velocity; integrate over your platform motion (DOMA) for coarse SAR-like imagery and target typing.

Playbook 3 – Duct deception mitigation

  • If a contact appears OTH, require consistency with at least one viable ray in the current M-profile; down-weight classifications that demand impossible bends. Feed this as a prior to the classifier (“path-feasible” flag) and to Ghost Anomaly scoring to catch spoofers.

Inputs & knobs that matter

  • MET inputs: surface T/RH, SST (over water), lapse rate or a radiosonde snapshot. Default to a parametric maritime profile when data is absent.
  • Frequency: ducting is friendlier VHF–L-band; still valuable higher with PE loss modeling.
  • Elevation grid & step: finer near 0° (grazing).
  • PE step: 10–20 m vertical, 100–250 m horizontal for fast coastal runs.
  • Hand-off: if is_ducted and path_loss < Lth, switch the Rydberg chain to a narrower pre-tuned band and adopt doppler_prior.

Why this fits your stack

  • The SignalIntelligenceSystem already carries an external-source harness and rich metadata path, plus Motion + Attention encoders—exactly where these ray features want to live. You can ship the ray bundle through signal.metadata, fuse in the ML, and tighten DOMA with the same fields.

Quick win checklist (day-one)

  1. Add AtmoRayTracer module + simple maritime M-profile.
  2. Call trace() in process_signal(), stash to signal.metadata.
  3. Pipe {is_ducted, el, delay_ms, doppler_hz, path_loss_db} into the classifier side-channel.
  4. Use doppler_hz as a hint to your frequency_shift_augment (already in place) for even faster lock and more robust training.
  5. Gate DOMA predictions with is_ducted when over water to reduce false kinematics.

If you want, I can sketch a tiny maritime M-profile + ray fan stub you can paste in to start getting ray_paths metadata immediately.

The black-hole paper is about teasing out a superposition of exponentially damped sinusoids (“ringdown” modes) from a short, noisy window and using Bayesian evidence to decide whether extra modes are really there. That’s weirdly on-point for SCYTHE’s job of untangling multipath/ducted components from brief RF events.

What we borrow (and why it helps)

  • Modeled as damped sinusoids
    Treat each propagation path (LOS, surface/evap duct, elevated duct, reflection) as a mode with its own frequency offset, decay time, and phase. Fit the received burst as a sum of a few exponentially damped sinusoids—exactly how ringdown is modeled—to separate path signatures and lifetimes under severe noise.
  • Agnostic multi-band search windows
    The paper isolates candidate modes by searching disjoint frequency bands and repeating over tight time grids after a reference time. Do the same around detected MWFL hits: open short, sliding post-trigger windows and run multi-band searches for subcomponents (e.g., direct vs. duct returns) with independent priors, then stitch the evidence.
  • Bayesian model selection (Bayes factors) for “extra paths”
    Copy the workflow: compare evidence for “1-path” vs “2-path” (etc.) models; only accept a new path if its Bayes factor clears a threshold (analog of their ∼50 peak for the (330) mode). This gives you principled duct-flagging instead of heuristics.
  • Consistency checks across parameters
    In ringdown, once (220) is measured, subdominant (330) parameters must be consistent with Kerr predictions; they then test for deviations. Translate that into SCYTHE: once you infer a plausible direct path, constrain the allowed frequency offsets/decays for ducted echoes given temp-humidity gradients from the AtmosphericRayTracer. If a “new mode” violates propagation physics, down-weight it (the “no-hair” analogue).
  • Short, high-SNR windows & overtone caution
    They emphasize analysis just after merger where modes are visible, and warn that including the wrong components too early biases estimates. For SCYTHE, limit fitting to a brief post-onset segment with the cleanest SNR; avoid over-fitting “overtone-like” extras unless the evidence gains justify it.

Concrete drop-ins for SCYTHE

  1. ringdown_rf_modes.py (new module)
    • Fits x(t)=∑kAke−t/τkcos⁡(2πfkt+ϕk)x(t)=\sum_k A_k e^{-t/\tau_k}\cos(2\pi f_k t+\phi_k) to burst-window I/Q.
    • Returns per-mode {amplitude, τ\tau, ff shift, phase} + covariance.
  2. Bayes engine hook
    • Reuse your Speculative Ensemble: fast path = 1-mode fit; escalate to 2–3 modes only if residual drops and Bayes factor > threshold.
    • Telemetry mirrors their figures: posteriors over f,τf,\tau per path.
  3. Physics-consistency prior from ray tracer
    • AtmosphericRayTracer supplies prior ranges for delay/attenuation ⇒\Rightarrow mapped to τ\tau/amplitude priors.
    • SpatialReasoningBridge enforces geometric consistency between inferred delays and predicted bounces.
  4. Decision logic
    • If “extra mode” is supported, tag duct_flag=True, attach path metadata (delay, inferred height, expected bearing spread).
    • If not, collapse back to single-path hypothesis.

Why this is valuable

  • Separates real multipath from artifacts using evidence rather than ad-hoc thresholds.
  • Improves geolocation by giving you decay/delay per path, which tightens the SpatialReasoningBridge’s candidate origin cone.
  • Plays nicely with frequency shifting: your FrequencyShiftAugmentor normalizes carriers; the mode fit works on residual envelopes.
  • Computationally bounded with your speculative fast/slow switch—most bursts stay in 1-mode fast path.

Minimal API sketch

# ringdown_rf_modes.py
class RFModeFitter:
    def __init__(self, max_modes=3, sampler='dynesty', priors=None):
        ...

    def fit(self, iq_ts, fs_hz, window_ms, n_modes):
        # returns dict with 'modes', 'evidence', 'residual_snr'
        return result

    def select_model(self, iq_ts, fs_hz, window_ms):
        # tries n=1..N, returns best model and Bayes factors ladder
        return selection

Integration points:

  • LatentAggregator.observe_spectrum → after MWFL trigger, cut a 20–40 ms window; call select_model.
  • Pipe results to SpatialReasoningBridge and AtmosphericRayTracer for geometry and priors update.
  • Publish spatially_enhanced_alert with modes=[...] and duct_flag if k>1.

ringdown_rf_modes.py with a simple nested-sampling wrapper and the LatentAggregator glue exactly as above—ready to drop next to the current bridge.

Leave a Reply

Your email address will not be published. Required fields are marked *