Radar Emitter Algorithms¶
Layer 24 provides deterministic, complex-baseband transmit waveform synthesis and reproducible waveform measurements. It does not model target scattering or replace a licensed radar simulator. The production API is rfgen.emitters.radar_waveforms; the older ChirpRadarEmitter and PulsedRadarEmitter surfaces remain separately documented compatibility surfaces, not the Layer 24 waveform contract.
Production waveform contract¶
RadarParamsV1 is a frozen Pydantic model with extra="forbid". Pass it to synthesize_radar_waveform() to obtain immutable complex128 samples and exact sample-grid pulse starts. The output carrier is a metadata parameter in this transmit-baseband contract; carrier_hz is validated but is not mixed into the samples.
from rfgen.emitters import RadarParamsV1, RadarWaveform, synthesize_radar_waveform
params = RadarParamsV1(
waveform=RadarWaveform.LFM,
sample_rate_hz=1_000_000.0,
carrier_hz=0.0,
pulse_width_s=20e-6,
pri_s=100e-6,
num_pulses=4,
bandwidth_hz=200_000.0,
)
signal = synthesize_radar_waveform(params)
# signal.pulse_starts == ((0, 0), (100, 1), (200, 2), (300, 3))
RadarWaveform¶
Member |
Value |
Intrapulse realization |
|---|---|---|
|
|
Constant complex envelope. |
|
|
Baseband linear-FM pulse. |
|
|
Sawtooth linear-FM pulse train under the same finite-pulse contract. |
|
|
Fixed 13-chip Barker phase code. |
|
|
Frank polyphase code with a square code length. |
The set is closed. Unknown labels fail Pydantic validation before synthesis.
RadarParamsV1¶
Field |
Type and bounds |
Contract |
|---|---|---|
|
|
Selects one closed waveform family. |
|
finite |
Emitted sample rate. |
|
finite |
Validated carrier annotation; no RF up-conversion is performed here. |
|
finite |
Width of each discrete gated pulse. |
|
finite |
Requested pulse repetition interval. |
|
integer |
Number of pulses in the transmitted record. |
|
finite |
Sweep bandwidth. It is zero for the supplied pulse and coded fixtures. |
|
optional finite float |
Allowed only for |
|
optional integer |
|
|
finite |
Constant transmitted amplitude scale. |
Validation also requires pulse_width_s <= pri_s, a total record no larger than 2**31 - 1 samples, and a non-overlapping realizable pulse grid. Starts are computed as round(pulse_index * pri_s * sample_rate_hz). Distinct requested starts that collide after rounding, or adjacent rounded starts separated by fewer than the rounded pulse width, fail closed rather than overwrite samples. Coded pulses require at least one sample per chip.
For LFM and FMCW_SAW, bandwidth_hz must be positive. Both synthesize the deterministic baseband phase
exp(2j * pi * (-B * t / 2 + (B / T) * t**2 / 2))
for sweep bandwidth B and width T. The implementation intentionally defines FMCW_SAW as a finite PRI-gated sawtooth train, not as an unconstrained continuous-wave front-end model.
Outputs¶
synthesize_radar_waveform() returns RadarWaveformSignal(samples, pulse_starts, params):
samplesis a read-only one-dimensional NumPycomplex128record ofceil(num_pulses * pri_s * sample_rate_hz)samples.pulse_startsis ordered as(start_sample, pulse_index), beginning at pulse index zero.paramsis the validated frozen input model.
The framework owns sample-grid placement, pulse gating, and chip placement. SciPy provides the established correlation primitive used by the measurement path. No custom target propagation or radar return model is represented by this synthesis interface.
Reproducible measurements and fixtures¶
measure_radar_waveform(signal, *, target_delay_samples=7, target_doppler_hz=None) produces RadarWaveformMeasurement. This is a deterministic acceptance measurement, not a scene or propagation API. It applies an integer-delay, unit-gain point-target fixture to the full transmitted record, including PRI gaps, and then calculates a matched-filter range/Doppler result.
Measurement field |
Meaning |
|---|---|
|
Narrowest centered two-sided band containing 99% of full-record transmit power. PRI gaps remain in the record. |
|
Peak sample of the first-pulse matched-filter profile. |
|
Peak sidelobe level outside a waveform-specific first-null mainlobe. The boundary is not selected with a dB threshold. |
|
Relative RMS error for the discrete identity ` |
|
Peak |
|
Explicit fixture target parameters used for the measurement. |
When target_doppler_hz is omitted, it is 1 / (4 * pri_s), an exactly resolvable non-DC slow-time bin for the four-pulse versioned fixtures. Negative delay and non-finite Doppler values fail rather than silently fall back to a transmit-only measurement.
The acceptance fixtures are versioned JSON files under tests/fixtures/radar/:
Fixture |
Waveform |
|---|---|
|
|
|
|
|
|
|
|
|
|
Each fixture pins exact pulse starts, occupied-bandwidth measurement, matched-filter peak and peak sidelobe level, ambiguity-symmetry ceiling, range/Doppler peak, target delay, and target Doppler. The test contract allows 2% occupied-bandwidth deviation from the versioned measurement, one sample for the matched-filter peak, 0.05 dB for PSL, and no deviation in the recorded range/Doppler bin. Chirp phase slope is independently estimated from emitted adjacent-sample phase and must match B / T within 0.5%.
Optional RadarSimPy target-simulation boundary¶
probe_radarsimpy_capability() reports the availability of an optional, separately licensed target-simulation capability as RadarSimPyCapability(version, platform, license_tier, sim_radar_available, unavailable_reason). It never treats an unavailable commercial simulator as a waveform-synthesis failure.
The capability is available only when all of the following are true:
the installed
radarsimpydistribution version is>=15.0,<16.0;the process runs on x86_64 Linux with Python 3.10 through 3.13;
RFGEN_RADARSIMPY_LICENSE_TIERis one ofacademic,standard,professional, orenterprise; andimports expose
radarsimpy.Transmitter,radarsimpy.Receiver,radarsimpy.Radar, and callableradarsimpy.simulator.sim_radar.
The probe is fail-closed. Package metadata or a declared license tier alone does not establish executable target-simulation capability. If a condition is absent, sim_radar_available is false and unavailable_reason records the reason. Layer 24 does not emulate RadarSimPy or claim target-scene validation in its absence.
Scope and compatibility boundary¶
Layer 24 ships all five waveform families above, versioned fixtures, and SciPy/NumPy reproducible measurements. It does not make a target return, clutter, antenna, receiver chain, or hardware impairment model part of synthesize_radar_waveform().
The earlier ChirpRadarEmitter remains a single lfm_chirp emitter surface. PulsedRadarEmitter remains a separate legacy compatibility surface whose RadarSimPy wiring is not the Layer 24 production waveform API. Do not use its historical stub status to infer that PULSE, LFM, FMCW_SAW, BARKER13, or FRANK synthesis is unavailable.
Extended radar families not enumerated by RadarWaveform remain outside this contract. Examples include additional Barker lengths, P1 through P4 polyphase codes, NLFM, OFDM radar, frequency-hopping radar, and configurable pulse shaping. They must be introduced through a future versioned waveform contract and corresponding validation fixtures, not accepted as undocumented strings.
See Also¶
Emitter Algorithms: cross-family emitter conventions.
Signal Catalog: family-level catalog and label guidance.
Production radar waveform validation: versioned fixture evidence for the Layer 24 transmit-waveform API.
Radar chirp validation: validation record for the older single-chirp emitter surface.
Reference / API / Emitters: emitter class index.
References¶
M. A. Richards, Fundamentals of Radar Signal Processing, 2nd ed., McGraw-Hill, 2014, ch. 4: LFM phase and matched filtering.
N. Levanon and E. Mozeson, Radar Signals, Wiley-IEEE, 2004: pulse compression and ambiguity-function conventions.
R. L. Frank, Polyphase Codes with Good Nonperiodic Correlation Properties, IEEE Transactions on Information Theory, 1963: Frank-code construction.
R. H. Barker, Group Synchronizing of Binary Digital Systems, in Communication Theory, 1953: Barker codes.