Receiver-background validation

Validated with documented limitations.

1. The component

ReceiverBackgroundPolicy adds an opt-in thermal-noise contribution after the configured RX-capture chain and before RX hardware. It delegates generation to the existing LinearLNANoise transform. A receiver (RX) is the capture endpoint; its low-noise amplifier (LNA) model contributes thermal noise to the complex in-phase/quadrature (IQ) samples. A noise figure is the factor by which a receiver adds noise beyond an ideal thermal source. Disabled is the default, so an empty scene retains all-zero IQ.

class ReceiverBackgroundPolicy:
    def __init__(self, config: ReceiverBackgroundConfig, *, scene_bandwidth_hz: float) -> None: ...
    def apply(self, master_iq: torch.Tensor, *, scene_id: str,
              rx_params: tuple[ChannelRxParams, ...], rng: torch.Generator
    ) -> tuple[torch.Tensor, BackgroundProvenance]: ...

Input or output

Type, unit, or default

Meaning

enabled

JSON bool; false

Enables the additional contribution.

noise_figure_db

finite float, dB; 0.0

Equivalent single-stage receiver noise figure.

reference_temperature_k

positive float, K; 290.0

Thermal reference temperature.

effective_bandwidth_hz

positive float, Hz, or null

Uses this bandwidth or the scene capture bandwidth.

background_chain

exactly ["linear_lna_noise"]

The only V1 executable selector.

provenance

immutable V1 record

Shared policy plus mean background-only power across receivers.

master_iq is a torch.complex64 tensor of shape (R, N): one master IQ row with N samples for each of R receivers. When enabled, rx_params must be a tuple of exactly R ChannelRxParams values in that same row order. apply returns a torch.complex64 tensor with the identical (R, N) shape and one BackgroundProvenance. Disabled configuration returns the supplied tensor unchanged and does not require receiver rows.

policy = ReceiverBackgroundPolicy(
    ReceiverBackgroundConfig(enabled=True, background_type="thermal_receiver"),
    scene_bandwidth_hz=1e6,
)
iq, record = policy.apply(
    torch.zeros((1, 2048), dtype=torch.complex64), scene_id="fixture",
    rx_params=(ChannelRxParams(0.0, 1e6, 2e6, 0.0),),
    rng=torch.Generator().manual_seed(1337),
)
assert record.background_power_w > 0

2. What we validated

This validation establishes five load-bearing claims. Each has evidence in section 3.

  1. Disabled compatibility (§3.1): the default preserves empty-scene IQ.

  2. Thermal relation (§3.2): the transform uses its stated kTBF relation in its ordinary operating range.

  3. Receiver-local draws (§3.3): each receiver receives a replayable independent draw.

  4. Pipeline order (§3.4): addition occurs between RX capture and RX hardware.

  5. Strict record (§3.5): V1 stores executable choices and measured mean power.

3. Evidence per claim

3.1 Disabled compatibility

Claim. Disabled configuration leaves supplied IQ unchanged and reports only disabled record fields. Evidence. test_disabled_policy_is_an_exact_zero_iq_oracle compares every IQ value and all version-1 fields. This preserves the control capture used by existing generation jobs.

3.2 Thermal relation

Claim. In the ordinary operating range, the selected transform uses the kTBF relation, shorthand for thermal power from Boltzmann’s constant, temperature, bandwidth, and the receiver’s linear noise factor: P = k T B 10^(NF_dB / 10), where k is Boltzmann’s constant, T is reference temperature, B is effective bandwidth, and NF_dB is noise figure in dB. Evidence. test_absolute_kTBF_complex_power_in_ordinary_range measures the mean per-real-component power for 1 MHz, 290 K, and 0 dB as 2.00e-15 W within 6% of kTB/2; the two real components together therefore measure the stated complex power. The scaling test independently checks the NF, temperature, and bandwidth ratios.

At tiny positive bandwidths, the implementation deliberately floors the complex noise power at 1e-24 W to retain a meaningful float32 draw. This is a numerical operating boundary, not a changed physical claim: test_tiny_positive_bandwidth_uses_documented_floor measures half that value per real component at 1 µHz. Finite parameter combinations whose computed draw exceeds the V1 float32 envelope fail before allocation with background_parameter_invalid. The wrapper limits each real-component standard deviation to float32_max / 8, reserving eight-standard-deviation headroom for the Gaussian draw. At 1 MHz and 290 K this admits noise figures through about 899.56 dB; 917.176748 dB is rejected before allocation.

3.3 Receiver-local draws

Claim. A multi-receiver scene has one deterministic independent draw per receiver. Evidence. test_multi_rx_background_has_distinct_draws_and_shared_mean_power verifies two rows differ and that the record equals their mean |IQ|^2. test_enabled_zero_emitter_scene_is_deterministic_nonzero_and_records_artifact compares two same-seed builds exactly.

3.4 Pipeline order

Claim. Background is added after RX capture and before RX hardware. Evidence. test_composer_behaviorally_orders_capture_then_background_then_hardware uses a capture multiplier of two and a hardware multiplier of three. Those operations do not commute with additive noise. With a zero-emitter capture, the observed output is exactly three times a same-seed background-only build: capture leaves zero, background adds the draw, and hardware triples it. The other placements produce either six times the draw or a post-hardware draw.

3.5 Strict record

Claim. The artifact is an auditable policy record rather than a calibration claim. Evidence. test_invalid_background_selector_uses_structured_chain_error rejects unknown, empty, and duplicate selectors. test_enabled_policy_rejects_row_and_parameter_count_mismatch rejects incompatible receiver rows. read verifies the canonical path and exact field set. V1 stores one shared policy and mean multi-receiver power.

4. Limits and operating boundary

The model is an ideal independent complex-Gaussian equivalent-noise source. It does not provide receiver calibration, a Friis multi-stage cascade, antenna temperature, spatially correlated noise, or ambient-capture replay. ambient_explicit has no ambient source: it produces the same equivalent thermal draw as thermal_receiver and only changes the recorded category. The V1 record is a shared multi-receiver summary. A configured LinearLNANoise remains active; this policy adds to it rather than replacing it.

BackgroundProvenance is JSON object schema version 1. Its exact keys are schema_version, enabled, enabled_default, background_type, noise_figure_db, reference_temperature_k, effective_bandwidth_hz, background_power_w, and background_chain. Disabled records contain enabled_default: false, background_type: "disabled", and numeric noise_figure_db: 0.0; temperature, effective bandwidth, background power, and chain are null. Enabled records contain finite positive physical/power values and the single-element chain ['linear_lna_noise']. write creates only artifacts/plans/<scene_id>/background.json; read rejects any other path, invalid JSON, extra or missing keys, malformed values, and records that fail these state predicates.

5. References

  1. H. T. Friis, “Noise Figures of Radio Receivers,” Proceedings of the IRE, 1944. DOI 10.1109/JRPROC.1944.232049.

  2. H. Nyquist, “Thermal Agitation of Electric Charge in Conductors,” Physical Review, 1928. DOI 10.1103/PhysRev.32.110.

  3. PyTorch, distribution torch, version 2.3.0 exercised by the focused suite. Random sampling documentation.

  4. NumPy, distribution numpy, version 2.4.1 exercised for the scalar square-root calculation. Square-root documentation.