RX hardware

RFGen models receiver hardware as typed effects after an explicit receiver-input boundary. This keeps three different statements separate:

  • propagation says what reached one authoritative link endpoint;

  • receiver measurement facts say which receiver and measurement plane own the voltage; and

  • receiver effects say how noise, analog processing, conversion, and digital processing changed it.

The receiver-input boundary

Every signed receiver chain begins with receiver_measurement, a PLAN value owned by one receiver setup. It declares receiver identity, nominal bandwidth, effective noise bandwidth (ENBW), noise figure, impedance, and the receiver_input measurement plane.

After final propagation or pathloss, receiver_input_boundary consumes the realized signal and facts from that same upstream producer, the receiver measurement, and the link’s authoritative PropagationEndpointFacts. The node does not change IQ. It establishes the receiver-input qualifier and publishes facts carrying the exact receiver, link, capture grid, plane, ENBW, noise figure, and impedance.

This is a custody transition, not a generic relabel. A raw emission, facts from another propagation producer, a second endpoint authority with the same ids, or a forged qualifier is refused. Selects, conditionals, repeats, subgraphs, ordinary transforms, and combiners preserve the checked authority; a scalar receiver consumer requires one unambiguous boundary.

Equivalent-input noise

Two noise models are public, and they make different claims.

receiver_thermal_noise is the receiver model. It uses

\[ P_n = k T B_{\mathrm{ENBW}} F \]

where \(k\) is Boltzmann’s constant, \(T\) is reference temperature, \(B_{\mathrm{ENBW}}\) is the explicitly authored effective noise bandwidth, and \(F\) is the receiver noise factor. The boundary’s impedance converts available noise power in watts to the published voltage variance in V². Nominal receiver bandwidth is retained as evidence but is not substituted for ENBW.

awgn is synthetic target-SNR noise. It measures full-input mean-square voltage and draws complex Gaussian noise at an authored ratio. Its minimum_signal_power_v2 is the only numerical input floor; zero and at/below-floor signals are undefined and refused. It is useful for controlled training or test conditions, but it is not evidence of a calibrated thermal receiver.

Both nodes require the signal and facts from the exact same checked boundary, accept one [time] complex64-volts receiver only, and publish their realized noise plane and receiver/link evidence. Multi-receiver attribution needs an explicit per-receiver contract and is currently refused.

Receiver analog processing

Analog receiver effects run after equivalent-input noise and before conversion. This ordering matters: placing gain before input-referred noise would amplify the signal without amplifying the noise described by the receiver figure.

Automatic gain control

automatic_gain_control is a causal single-pole loop. For each sample it computes post-gain magnitude, chooses the attack or decay time constant, and updates gain toward positive target_v. gain_init and max_gain are dimensionless; the exact gain trajectory is published with the signal.

The gain rail prevents unbounded loop growth during signal-free intervals. It does not clip waveform voltage.

Voltage limiting

receiver_voltage_limiter models a receiver analog protection rail in absolute positive volts. It radially scales an over-rail complex sample and preserves phase. The transmitter-side counterpart is transmitter_crest_limiter.

Neither limiter claims dBFS because neither binds converter full-scale evidence. The retired combined limiter’s saturation_dbfs name was a false reference to full scale and is not a public selector. AGC and the receiver limiter share the analog interval; RFGen does not impose a relative order that the modeled hardware did not declare.

Other analog effects include receiver mixing and LO error, IF finite-impulse- response filtering and scalar gain, group-delay realignment, and IQ imbalance. All consume typed complex voltage and preserve the checked chain lineage.

Conversion

The converter is not one opaque quantizer. Four nodes expose its evidence:

  1. converter_scaling establishes volts per code from ENOB and explicit full scale, or declares synthetic per-row normalization when full scale is null.

  2. converter_rounding performs ties-to-even component rounding.

  3. converter_clipping applies independent signed code rails to I and Q.

  4. converter_reconstruction returns complex64 volts using the cited scale.

Signal and scale must come from the same immediate producer at every step. Thus a graph cannot pair one converter’s waveform with another converter’s scale or silently reorder clipping and rounding.

Digital receiver processing

Post-converter effects include rational resampling and sample-clock offset. The graph ordering contract places them after conversion. Their typed sample grids make changes in clock, spacing, origin, and sample count explicit rather than inferred from tensor length alone.

Authoring pattern

The receiver portion of a graph follows this shape:

- name: receiver_measurement
  role: plan
  selector: receiver_measurement
  params:
    impedance_ohm: 1.0
    effective_noise_bandwidth_hz: 20000000.0
  inputs:
    receiver_facts: {ref: {node: receiver, output: facts}, when: plan}

- name: receiver_input
  role: transform
  selector: receiver_input_boundary
  params: {}
  inputs:
    signal: {ref: {node: final_propagation, output: signal}}
    upstream_facts: {ref: {node: final_propagation, output: facts}}
    receiver_facts: {ref: {node: receiver_measurement, output: facts}, when: plan}
    endpoints: {ref: {node: link_endpoints, output: facts}, when: plan}

- name: noise
  role: transform
  selector: receiver_thermal_noise
  params: {}
  inputs:
    signal: {ref: {node: receiver_input, output: signal}}
    boundary_facts: {ref: {node: receiver_input, output: facts}}

For synthetic target-SNR data, replace only the last selector/params with awgn and an authored snr_db plus minimum_signal_power_v2. Do not rewire the boundary evidence.

See also