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

PULSE

"pulse"

Constant complex envelope.

LFM

"lfm"

Baseband linear-FM pulse.

FMCW_SAW

"fmcw_saw"

Sawtooth linear-FM pulse train under the same finite-pulse contract.

BARKER13

"barker13"

Fixed 13-chip Barker phase code.

FRANK

"frank"

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

waveform

RadarWaveform

Selects one closed waveform family.

sample_rate_hz

finite (0, 500e6] Hz

Emitted sample rate.

carrier_hz

finite [0, 110e9] Hz

Validated carrier annotation; no RF up-conversion is performed here.

pulse_width_s

finite (0, 1] s

Width of each discrete gated pulse.

pri_s

finite (0, 10] s

Requested pulse repetition interval.

num_pulses

integer [1, 4096]

Number of pulses in the transmitted record.

bandwidth_hz

finite [0, sample_rate_hz) Hz

Sweep bandwidth. It is zero for the supplied pulse and coded fixtures.

chirp_slope_hz_per_s

optional finite float

Allowed only for LFM and FMCW_SAW; if supplied, it must equal bandwidth_hz / pulse_width_s within relative tolerance 1e-9.

code_length

optional integer

BARKER13 accepts omitted or 13; FRANK requires a positive perfect square. It is forbidden for other families.

amplitude

finite (0, 1]

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):

  • samples is a read-only one-dimensional NumPy complex128 record of ceil(num_pulses * pri_s * sample_rate_hz) samples.

  • pulse_starts is ordered as (start_sample, pulse_index), beginning at pulse index zero.

  • params is 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

occupied_bandwidth_hz

Narrowest centered two-sided band containing 99% of full-record transmit power. PRI gaps remain in the record.

matched_filter_peak_sample

Peak sample of the first-pulse matched-filter profile.

matched_filter_psl_db

Peak sidelobe level outside a waveform-specific first-null mainlobe. The boundary is not selected with a dB threshold.

ambiguity_symmetry_relative_rms

Relative RMS error for the discrete identity `

range_doppler_peak_bin

Peak (slow_time_bin, range_bin) in the matched-filter range/Doppler cube.

target_delay_samples, target_doppler_hz

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

pulse-v1.json

PULSE

lfm-v1.json

LFM

fmcw-v1.json

FMCW_SAW

barker13-v1.json

BARKER13

frank-v1.json

FRANK

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 radarsimpy distribution version is >=15.0,<16.0;

  • the process runs on x86_64 Linux with Python 3.10 through 3.13;

  • RFGEN_RADARSIMPY_LICENSE_TIER is one of academic, standard, professional, or enterprise; and

  • imports expose radarsimpy.Transmitter, radarsimpy.Receiver, radarsimpy.Radar, and callable radarsimpy.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

References

  1. M. A. Richards, Fundamentals of Radar Signal Processing, 2nd ed., McGraw-Hill, 2014, ch. 4: LFM phase and matched filtering.

  2. N. Levanon and E. Mozeson, Radar Signals, Wiley-IEEE, 2004: pulse compression and ambiguity-function conventions.

  3. R. L. Frank, Polyphase Codes with Good Nonperiodic Correlation Properties, IEEE Transactions on Information Theory, 1963: Frank-code construction.

  4. R. H. Barker, Group Synchronizing of Binary Digital Systems, in Communication Theory, 1953: Barker codes.