decide op• Data kinds: none → table (an op determined by its arguments alone — it takes no image or data input)
• Call: import fullseye as fs; fs.ledger.siren_signal(duration: 'float', fs: 'float', *, f_high: 'float' = 960.0, f_low: 'float' = 770.0, period: 'float' = 1.3, source_start=(-60.0, 10.0), source_velocity=(15.0, 0.0), mics=((0.0, 0.0),), c: 'float' = 343.0, spreading: 'bool' = True, mic_velocity=(0.0, 0.0), mic_track=None) -> 'Dict[str, object]' (to call the implementation directly, import drivedecide; drivedecide.siren_signal(duration: 'float', fs: 'float', *, f_high: 'float' = 960.0, f_low: 'float' = 770.0, period: 'float' = 1.3, source_start=(-60.0, 10.0), source_velocity=(15.0, 0.0), mics=((0.0, 0.0),), c: 'float' = 343.0, spreading: 'bool' = True, mic_velocity=(0.0, 0.0), mic_track=None) -> 'Dict[str, object]'; from the registry, opsdrive.get("siren_signal"))
Synthesizes the sound of a moving ambulance siren (alternating two tones) as heard by a stationary microphone.
Source p(τ) = source_start + source_velocity·τ (2D, uniform straight-line motion); the emitted sound is sin φ(τ), where φ is a continuous phase that alternates a high tone f_high and a low tone f_low for period/2 each. The sound microphone m hears at time t is sin φ(τ) at the emission time τ satisfying
c (t − τ) = |p(τ) − m| ⇔ (c² − |u|²) s² + 2 (q·u) s − |q|² = 0, s = t − τ ≥ 0, q = p(t) − m
(amplitude r_ref / r with spreading, r_ref = the initial distance). The Doppler formula is not used (only the geometry of arrival times), so this is an independent path for the gate of doppler_track.
mic_velocity = constant velocity of the microphone (or the ego vehicle carrying it) (relative to air = ground; no wind). The microphone moves as m(t) = m₀ + u_L t. The equation above keeps the same form with q = p(t) − m(t) (c(t − τ) = |p(τ) − m(t)|, p(τ) = p(t) − u s). Only the microphone position at reception time enters the quadratic (the source moves uniformly), so the microphone may move along any path:
giving mic_track = (position (k, n, 2), velocity (k, n, 2)) per sample uses it instead of mics / mic_velocity (a microphone on an ego vehicle that decelerates and pulls to the left; the velocity is used only for the closed form of dτ/dt).
Return value: t (n,), signals (number of mics, n), tau (same), f_emit (same, emitted frequency), v_radial (same, the rate of change of distance in the approaching direction −d|p(τ) − m(t)|/dt "converted to the source's line-of-sight speed" c(1 − 1/D), D = dτ/dt. If the microphone is stationary, same as −ṙ at emission time), range_rate (same, time derivative of the geometric distance |p(τ) − m(t)| at reception; negative = approaching), f_true (same, = f_emit · dτ/dt. Closed form dτ/dt = (c + r̂·u_L)/(c + r̂·u_S), r̂ = the unit vector (p(τ) − m(t))/r).
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• The canonical algorithm (author, year) and its uses are named in the family usage guide above.
• poc_driving_decisions — py -3.11 examples/poc_driving_decisions.py
table as input)course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same
decide)mirror_reflection_matrix · mirror_virtual_camera · mirror_aim_normal · convex_mirror_fov · mirror_blind_zone · check_sequence_score · signal_phase_plan · signal_state
*Provenance: drivedecide.py — DRIVE operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.