typed op• Data kinds: beatcube → signal
• Call: fullseye.apply(img, "tb_beamform_delay_sum", a=0.5, b=0.5) (the 2-D model is one image plus two scalar knobs a,b∈[0,1])

*The figure is the actual output on a synthetic 128×128 input. Left: input, right: output. Point clouds are drawn as a top-down scatter (brightness = z), 1-D series as a line plot, volumes as the maximum-intensity projection along z, videos as the middle frame, complex images as magnitude; return values that are not pictures are shown as the values themselves.*
Sweeping knob a (0.1 / 0.5 / 0.9, the other knob at its default):
▸ tb_beamform_delay_sum: knob a sweep (docs site)
*Knob b does not change the output (measured: identical at 0.1 / 0.5 / 0.9).*
Stages (the ops that come before → this op, left to right):
▸ tb_beamform_delay_sum: stages (docs site)
On other images (synthetic scene / photo / coins. Top row: inputs, bottom row: their outputs. Knobs at default):
▸ tb_beamform_delay_sum: other inputs (docs site)
Delay-and-sum (Bartlett) angle spectrum for one range-Doppler cell.
Takes the per-antenna complex value at a single range-Doppler cell — by
default the strongest one — and for each steering angle removes the expected
inter-element phase and sums:
`P(theta) = |sum_k conj(exp(1j*2*pi*d*k*sin(theta)/lambda)) * x_k|^2`
which peaks at the true arrival angle with value `(N_a * |a|)^2`: the
aperture gives `N_a in amplitude, N_a^2` in power. That is the exact
ground truth the tests pin. Measured with 8 elements: the peak power is
bit-exactly `(N_a*N_c*N_s)^2 = 268435456` (relative error 0.0), and
sweeping the true angle from -80 to +80 degrees in 5-degree steps (33 cases)
the reported angle matches the truth with a maximum error of 0.0 degrees.
The steering grid defaults to `arange(-90, 90.5, 1.0). normalize=True`
divides by `N_a^2 * N_c^2 * N_s^2` so that a unit-amplitude bin-centred
target peaks at 1.0.
Returns a 1-D float64 array of powers, one per grid angle — a plain signal,
so :mod:dsp's `find_peaks and :mod:funct1d`'s smoothing apply to it.
Use :func:beamform_doa if you want the angles themselves.
*range_bin* is a plain `0..N_s-1` index; *doppler_bin* is the signed
velocity bin, the same convention :func:range_doppler_peaks reports, so a
detection can be handed straight back in. Both or neither — half a cell
address raises rather than quietly beamforming the strongest cell instead.
Raises `ValueError`: no aperture — either a single element, or many
elements packed into under ~0.28 wavelengths. In both cases the spectrum is
flat to within float noise and `argmax` returns the first grid angle, i.e.
a confident report of -90 degrees that is pure tie-breaking (measured: 8
elements at 1e-12 m spacing gave a peak-to-trough spread of exactly 0.0 and
reported -90.0). Also: an all-zero cube or an all-zero selected cell; only
one of *range_bin* / *doppler_bin*; an out-of-bounds bin index; an angle grid
outside `[-90, 90]`; an FFT that overflows to NaN; plus the usual cube and
scalar refusals.
Typed bridge of the rangedoppler op `beamform_delay_sum into the 2-D evolution registry: the same implementation, called under the op(v, a, b) convention. a drives wavelength_m (default 0.0038934); b` is unused.
• 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 program below has been verified to run (same input as the figure). In Studio's help this block becomes buttons that load and run it on the spot.
img_to_beatcube 0.50 0.50 tb_beamform_delay_sum 0.50 0.50
▸ Load this pipeline · Load & run
The examples below call the underlying ledger op beamform_delay_sum. This bridge op is the same implementation adapted to the fn(v, a, b) convention, so the behaviour carries over unchanged (only the call form differs).
• fmcw_range_doppler — py -3.11 examples/fmcw_range_doppler.py
• poc_multibeam_bathymetry — py -3.11 examples/poc_multibeam_bathymetry.py
signal as input)identity · tb_create_funct_1d_array · tb_smooth_funct_1d_gauss · tb_smooth_funct_1d_mean · tb_derivate_funct_1d · tb_integrate_funct_1d · tb_zero_crossings_funct_1d · tb_abs_funct_1d
typed)tb_points_to_voxel · tb_estimate_point_normals · tb_iss_keypoints · tb_project_points · tb_render_point_depth · tb_statistical_outlier_removal · tb_radius_outlier_removal · tb_voxel_grid_downsample
*Provenance: ops.py — 2D 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.