Beam patterns, k-space and compounding
Module 04 established that the beam is the Fourier transform of the aperture. This module makes that statement quantitative where it gets hard: at low Fresnel number and low F-number, with broadband pulses, sparse apertures and transmit ≠ receive, and finally for coherent plane-wave compounding, where the transmit focus is synthesized in k-space one angle at a time. Module 19 covers the hardware side of the same patterns (element directivity, element factor × array factor, grating-lobe pitch rules, elevation, 2D, sparse, micro-beamformed and row-column layouts); this module uses those results and treats the beam as the imaging operator they produce.
You will be able to
- Say when the focal plane is a Fourier plane, where the intensity peak really is, and how wrong the Fourier picture is at F# 1.5
- Choose transmit and receive apodizations by PSL, ISLR and their separate SNR and energy prices
- Predict broadband grating-lobe and far-sidelobe levels from the pulse length and element count
- Read any transmit/receive scheme (focused, sparse, vernier, synthetic aperture, plane waves) as a coarray and predict its two-way PSF
- Place grating lobes for any pitch, steering and bandwidth, separately on transmit and receive, and tell peak from energy patterns
- Derive the plane-wave angle span and step rules, and budget angles against SNR, frame rate and motion
- Predict the steered-plane-wave transmit grating lobe and the lateral resolution of compounding from span and receive F#
Assumes
- Module 04 · Sampling, Fourier & LTI systems: beam = FT of aperture, −13.3/−26.5 dB, grating-lobe formula, \(\lambda F_\#\) and \(7\lambda F_\#^2\) rules, 2D k-space
- Module 19 · Array architectures: element directivity, element factor × array factor, pitch rules, sparse and 2D layouts
- DAS with dynamic receive aperture and plane-wave transmits
- Optional further reading: Module 26 treats contrast, CNR, gCNR and speckle SNR in full; this module defines them where it uses them
23.1From Fresnel to Fraunhofer: where the focus is a Fourier plane
Module 04 used the paraxial integral to show that a focusing law cancels the quadratic phase, so the focal plane is a Fraunhofer plane at any depth. Three questions remain open: how far an unfocused aperture keeps converging, where a focused beam actually peaks, and how accurate the Fourier picture is at the F-numbers used in imaging. To answer them without the paraxial approximation, sum point sources directly. For a line of point sources across \(\xi \in [-D/2, D/2]\) with apodization \(a(\xi)\) and focus \(F\):
- \(p(x,z)\)
- complex CW pressure at lateral position x and depth z (mm), arbitrary units
- \(\xi\)
- position on the aperture, mm
- \(a(\xi)\)
- apodization (weight) across the aperture
- \(D,\ F\)
- aperture width and focal depth, mm
- \(k = 2\pi/\lambda\)
- wavenumber, rad/mm
- \(r(\xi)\)
- distance from aperture point to field point, mm
- \(\phi_F(\xi)\)
- focusing path correction, mm (\(\phi_F = 0\): unfocused)
- \(j\)
- imaginary unit
m23_fresnel_focal_plane.m evaluate this sum directly.
Edge phase and the three distances. On axis, the unfocused path difference between the aperture edge and center is \(\approx D^2/(8z)\), an edge phase \(\pi D^2/(4\lambda z)\). Each conventional distance is a statement about that phase:
| Distance | Edge phase | Meaning | D = 19.2 mm, 5 MHz | D = 38.4 mm, 5 MHz |
|---|---|---|---|---|
| \(D^2/(4\lambda)\) | \(\pi\) | Last on-axis maximum: the end of the near field. Focusing beyond it gives no gain. | 299 mm | 1.20 m |
| \(D^2/\lambda\) | \(\pi/4\) | Common "far-field" convention in ultrasound texts | 1.20 m | 4.79 m |
| \(2D^2/\lambda\) | \(\pi/8\) | Antenna (Fraunhofer) convention | 2.39 m | 9.57 m |
The direct sum puts the last axial maximum of the 19.2 mm line aperture at 297 mm, \(0.99\,D^2/(4\lambda)\). With focus \(F\), the same edge phase evaluated at \(z = F\) counts the Fresnel zones that focusing has to cancel:
- \(N_F\)
- Fresnel number: half-period Fresnel zones across the half-aperture (dimensionless)
- \(D\)
- aperture width, mm
- \(\lambda\)
- wavelength, mm (0.308 mm at 5 MHz)
- \(F\)
- focal depth, mm
| F (mm) | F# | \(N_F\) | intensity peak / F | −3 dB DOF (mm) | \(6.95\,\lambda F_\#^2\) (mm) |
|---|---|---|---|---|---|
| 20 | 1.04 | 15.0 | 0.994 | 2.7 | 2.3 |
| 40 | 2.08 | 7.5 | 0.980 | 9.3 | 9.3 |
| 60 | 3.12 | 5.0 | 0.957 | 19.6 | 20.9 |
| 100 | 5.21 | 3.0 | 0.899 | 47.7 | 58.1 |
| 200 | 10.4 | 1.5 | 0.735 | 125 | 232 |
| 300 | 15.6 | 1.0 | 0.605 | 185 | 523 |
D = 19.2 mm, 5 MHz, uniform, CW (m23_fresnel_focal_plane.m). The \(7\lambda F_\#^2\) depth-of-field rule of Module 04 holds within about 6 % for \(N_F\) between 5 and 10 and overestimates badly below \(N_F \approx 3\). At high \(N_F\) and very low F# the measured DOF exceeds the rule (2.7 vs 2.3 mm at F# 1.04) because the paraxial expansion behind it no longer holds.
How good is the Fourier picture at F# 1.5? At F = 30 mm (F# 1.56, \(N_F = 10\)) the directly summed focal profile is 3.5 % wider than the transform of the apodization and its first sidelobe is −12.7 dB instead of −13.3 dB; with Hann the sidelobe is −28.8 instead of −31.5 dB. At F = 60 mm (F# 3.1) the errors shrink to 1 % and 0.1–0.8 dB. The residual comes from the non-paraxial path terms and the 1/r amplitude variation across a wide aperture. It is small, but it is the size of the effects people argue about in beamforming papers, so a paraxial model is not a reference for sidelobe claims at F# ≤ 1.5.
Fresnel field explorer: near field, focal shift and the Fourier plane
SimulationDirect CW point-source sum (23.1), 1/r Green's function, up to 240 sources, JS; the Fourier curve is the exact transform of the apodization.Deep cardiac focusing is a low-\(N_F\) problem: a 2.5 MHz phased array with D = 20 mm has \(D^2/(4\lambda) = 162\) mm, so a 100 mm focus has \(N_F = 1.6\) and the intensity peaks near 0.75F. The same numbers explain why a plane wave has no transmit beam to speak of: an unsteered 38.4 mm aperture at 5 MHz is in its near field out to 1.2 m, so at every imaging depth its lateral profile is just the aperture footprint with Fresnel edge ripple. All the lateral selectivity of a single plane wave comes from receive.
23.2Apodization as a design variable: transmit ≠ receive, ISLR and the SNR price
In pulse-echo the focal-plane pattern is the product of the transmit and receive factors, so their dB values add direction by direction:
- \(A_T,\ A_R\)
- one-way transmit and receive patterns (amplitude)
- \(P_2\)
- two-way (pulse-echo) pattern
- \(\theta,\ \theta_0\)
- direction and steering angle
- \(u\)
- direction variable relative to the steered beam
- \(\lvert\cdot\rvert\)
- magnitude; dB values are 20 log of amplitude
Three numbers describe a pattern, and each answers a different question:
- \(\mathrm{PSL}\)
- peak sidelobe level (amplitude ratio, quoted in 20 log dB)
- \(\mathrm{ISLR}\)
- integrated sidelobe ratio (energy ratio, 10 log dB)
- \(w_n\)
- weight of channel n
- \(N\)
- number of channels
- \(G_{\mathrm{SNR}}\)
- receive SNR relative to uniform weights
- \(P(u)\)
- one-way or two-way amplitude pattern, \(P(0)\) its main-lobe peak
- \(u\)
- direction variable as in (23.3)
| Window (continuous) | PSL 1-way | PSL 2-way | −6 dB width 1-way (λ/D) | −6 dB 2-way | ISLR 1-way | ISLR 2-way | Rx SNR price |
|---|---|---|---|---|---|---|---|
| Rectangular | −13.3 | −26.5 | 1.21 | 0.89 | −9.7 | −25.3 | 0 |
| Tukey 0.5 | −15.1 | −30.2 | 1.57 | 1.15 | −14.1 | −29.7 | −0.87 |
| Hann | −31.5 | −62.9 | 2.00 | 1.44 | −32.9 | −64.7 | −1.76 |
| Hamming | −42.7 | −85.3 | 1.82 | 1.30 | −34.4 | −80.0 | −1.34 |
| Blackman | −58.1 | −116 | 2.30 | 1.64 | −57.2 | −117 | −2.37 |
| Gaussian, edges at 2.5σ | −43.3 | −86.5 | 1.92 | 1.37 | −38.1 | −84.8 | −1.60 |
All levels in dB, Tx = Rx for the two-way columns, computed by numerical transform (ISLR by Parseval). Hamming has a lower PSL than Hann but a higher ISLR than its PSL suggests, because its far sidelobes decay at only −6 dB/octave (its edge does not go to zero). For cyst contrast the ISLR column is the one that matters.
Transmit and receive apodization are paid for in different currencies. On receive, the price is SNR: \(G_{\mathrm{SNR}} = -1.76\) dB for Hann. On transmit, the peak drive per element is fixed by the pulser and by the mechanical index, so weights below 1 simply radiate less: the focal amplitude scales with \(\sum w/N\) (Hann: −6.0 dB) and the radiated energy with \(\sum w^2/N\) (Hann: −4.3 dB). This is why systems that are SNR-limited apodize on receive first.
Beam explorer: separate transmit and receive apertures
Approx. modelNarrowband far-field (focal-plane) array factor of point elements (23.3); optional element factor of a 0.9d strip in a rigid baffle; JS.A 1D ISLR underestimates the clutter that fills a cyst in an image. The 2D PSF also has axial sidelobes and, for unfocused transmits, X-shaped edge-wave arms that leave the focal line. Measure integrated clutter on the 2D PSF (as Demo 23.7 and m23_planewave_compounding.m do), and report cyst contrast and gCNR rather than inferring them from a lateral cut.
23.3Grating lobes and broadband beams: where the copies land, peak versus energy, edge waves
Where the copies land. Sampling the aperture at pitch d multiplies it by a comb, so its far-field (or focal-plane) pattern is periodic in \(u = \sin\theta\) with period \(\lambda/d\). For an array steered to \(\theta_0\) by true time delays, with element factor \(E\):
- \(B(u)\)
- one-way far-field (focal-plane) amplitude pattern in direction \(\theta\)
- \(E(u)\)
- element factor; for a strip of width w in a rigid baffle \(\mathrm{sinc}(w u/\lambda)\) (Module 19)
- \(w_n\)
- apodization weight of element n
- \(n\)
- element index
- \(d\)
- pitch, mm
- \(\lambda\)
- wavelength \(c/f\), mm
- \(u,\ \theta\)
- sine of the direction and the direction from broadside
- \(u_0,\ \theta_0\)
- sine of the steering angle and the steering angle
- \(m\)
- replica order, \(\pm 1, \pm 2, \dots\); \(m = 0\) is the main lobe
- \(u_m\)
- center of replica m
Requiring every replica \(m \ne 0\) to stay outside the visible region for every steering angle up to \(\theta_{\max}\) gives the pitch rule:
- \(d\)
- pitch, mm
- \(\lambda\)
- wavelength at the highest frequency that matters, mm
- \(\theta_{\max}\)
- largest steering angle used (transmit or receive)
- \(u_0,\ m\)
- as in (23.5)
What bandwidth does to the copies. The main lobe stays at \(u_0\) at every frequency (true time delays), but the replicas move: \(u_m = u_0 + mc/(fd)\). Demo 23.3 averages the CW pattern over the pulse spectrum in power:
- \(\bar B(u)\)
- bandwidth-averaged (RMS) pattern, normalized to the main lobe
- \(P(f)\)
- amplitude spectrum of the pulse: Gaussian with −6 dB fractional bandwidth FBW, centered on \(f_0\) (one-way pulse for a one-way pattern, pulse-echo pulse for two-way)
- \(B(u;f)\)
- CW pattern (23.5) at frequency f, normalized to 1 at \(u_0\) (with \(\lvert E(u_0)\rvert\) taken out)
- \(s(t;u)\)
- signal radiated (or received) in direction u, the pulse sum of (23.8)
- \(f,\ t\)
- frequency (MHz) and time (µs)
Grating-lobe explorer: transmit, receive and two-way patterns in sin θ
Approx. modelFar-field / focal-plane array factor in closed form (23.5) (Dirichlet kernels for uniform, Hann and every-second-element weights), optional element factor of a 0.9d strip in a rigid baffle; with bandwidth, the power average (23.7) over a Gaussian spectrum, i.e. the energy pattern, not the time-domain peak pattern of Demo 23.5; JS. Adapted from the user's grating-lobe explorer prototype.Two-way is a product, so a grating lobe survives only where transmit and receive both have one. Every way of beating grating lobes with a coarse pitch exploits this: different steering on transmit and receive (plane-wave transmit, parallel receive beams), different effective pitches (vernier, Section 23.4), the element factor (common to both, so it is squared), and bandwidth (the copies move with frequency, the main lobe does not). Demo 23.8 shows the near-field version for steered plane waves.
Broadband grating lobes in three pictures. Module 04 showed that a broadband pulse fills the nulls of the time-integrated pattern. Two sharper statements follow from looking at the pulses themselves. In direction \(u = \sin\theta\), element n of a uniform array (pitch d, steered to broadside) contributes its pulse delayed by \(n\,d\,u/c\), so the received signal is a sum of shifted pulses:
- \(s(t;u)\)
- signal radiated or received in direction u (analytic, complex)
- \(u = \sin\theta\)
- sine of the direction from broadside
- \(t\)
- time, µs
- \(n\)
- element index
- \(p(t)\)
- transmitted pulse (one-way) or pulse-echo pulse (two-way)
- \(c_n\)
- weight of element n: \(w_n\) one-way; the coarray \(w * w\) for two-way with Tx = Rx (Section 23.4)
- \(d\)
- pitch, mm
- \(c\)
- sound speed, 1.54 mm/µs
- \(\tau_1\)
- delay between neighbouring elements, µs
Figure it out in three directions (Demo 23.4 draws each case from (23.8)):
- Main lobe, \(u = 0\). \(\tau_1 = 0\): every element pulse arrives at the same time, they stack, and the sum peaks at \(\sum c_n\) (N for uniform weights). Pulse length does not matter.
- Grating lobe, \(u = \lambda_0/d\). \(\tau_1 = T_0\) exactly: each pulse is one period later than its neighbor. They are in phase (CW sees a full lobe), but they no longer coincide: the sum is a train of N pulses, \(N T_0\) long, and at any instant only the \(\approx M\) pulses within one pulse length overlap. The peak is \(\approx M\) instead of N.
- A sidelobe angle, \(0 < \tau_1 < T_0\). The pulses overlap partially with phases spread over \(2\pi N\tau_1/T_0\); neighbors cancel, and only the uncancelled ends (the edge waves below) survive once the spread \(N\tau_1\) exceeds the pulse length.
Pulse stacking: main lobe, grating lobe, sidelobe
SimulationPulse sum (23.8) for 8 uniform elements, Gaussian-envelope RF pulse, evaluated in JS; the sum is divided by N so that the main lobe peaks at 1.Grating lobes. At the grating lobe, \(u = \lambda_0/d\), successive delays are exactly one period, so the pulses add in phase but no longer overlap: s is a train of N pulses spaced \(T_0\), and only about M of them overlap at any instant, where M is the pulse length in cycles. For a Gaussian envelope with −6 dB duration \(\tau\) and \(M = f_0\tau = 0.883/\mathrm{FBW}\):
- \(\sigma_t\)
- standard deviation of the Gaussian envelope, µs
- \(f_0\)
- center frequency, MHz
- \(M\)
- pulse length in cycles, \(f_0\tau\), with \(\tau\) the −6 dB envelope duration
- \(\mathrm{FBW}\)
- −6 dB fractional bandwidth
- \(N\)
- number of elements
- \(\mathrm{GL}\)
- grating-lobe level relative to the main lobe: peak is an amplitude ratio (20 log), energy a power ratio (10 log)
Far sidelobes are edge waves. Far from the main lobe the delays spread over \(D\lvert u\rvert/c\), longer than the pulse. The uniform aperture then acts like a time-domain rect of that length convolved with the pulse: the zero-mean pulse cancels in the middle and only the two ends survive, each the running integral of the pulse (\(\approx 1/(2\pi f_0)\) of its peak) divided by the spread:
- \(\text{sidelobe}_{\text{peak}}(u)\)
- pulsed peak pattern far from the main lobe, amplitude ratio to the main-lobe peak
- \(\lambda\)
- center wavelength \(\lambda_0\), mm
- \(D\)
- aperture width, mm
- \(u\)
- \(\sin\theta\), direction from broadside
- \(x\)
- normalized off-axis variable of the CW sinc, \(\pi D\lvert u\rvert/\lambda\)
- \(M\)
- pulse length in cycles, as in (23.9)
| N | FBW (%) | M (cycles) | GL peak, sim (1- / 2-way) | 1.064 M/N | GL energy, sim (1- / 2-way) | law (1- / 2-way) |
|---|---|---|---|---|---|---|
| 64 | 30 | 2.94 | −26.2 / −26.3 | −26.2 | −11.7 / −13.4 | −11.6 / −13.4 |
| 64 | 60 | 1.47 | −32.2 / −32.3 | −32.2 | −14.7 / −16.4 | −14.6 / −16.4 |
| 128 | 60 | 1.47 | −38.2 / −38.3 | −38.2 | −17.6 / −19.4 | −17.6 / −19.4 |
| 128 | 90 | 0.98 | −41.2 / −41.2 | −41.8 | −19.4 / −21.1 | −19.4 / −21.1 |
Array factor only (point elements), Gaussian pulse, from m23_broadband_beams.m. At 90 % the pulse is shorter than one cycle and the "train" picture is only approximate (0.6 dB off).
How to read Demo 23.5. It evaluates (23.8) in the time domain for every direction u from 0 to 1 and plots three curves and one waveform:
- Grey, CW at \(f_0\): the narrowband pattern (23.5). Its grating lobe is always 0 dB.
- Blue, pulsed peak \(\max_t\lvert s\rvert\): the largest instantaneous amplitude in each direction. This is what a point target in that direction produces in a beamformed image.
- Green dashed, pulsed energy \(\left(\int\lvert s\rvert^2 dt\right)^{1/2}\): the RMS pattern, identical to the bandwidth-averaged curve of Demo 23.3 by (23.7). A hydrophone that integrates, or a region of speckle, sees this one.
- Orange marks: the \(1.064\,M/N\) law of (23.9) at the grating lobe and, one-way uniform, the edge-wave line (23.10).
- Lower panel: the envelope of \(s(t)\) at the grating-lobe direction (case 2 above): a flat-topped train \(N T_0\) long. Its height is the peak value; its squared area is the energy.
Worked numbers (set N = 128, \(d = 1.5\lambda_0\), 75 %, two-way). The lobe sits at \(u = 1/1.5 = 0.667\) (41.8°). CW: 0 dB. \(M = 0.883/0.75 = 1.18\) cycles, so the peak is \(1.064 \times 1.18/128 = 0.0098\): −40.2 dB by the law, −40.1 dB simulated, the same one-way and two-way. The energy is \(1.003\,M/N = 0.0092\) in power, −20.3 dB two-way (−18.6 dB one-way, \(1.505\,M/N\)). One lobe, three numbers 20 dB apart.
Which number matters. A bright point (wire, needle tip, specular wall) in the grating-lobe direction is imaged at the time its echo peaks, so its ghost has the peak level: −40 dB here, usually invisible. A diffuse medium has scatterers at every range in that direction, each sampling a different instant of the train; their echoes add incoherently, so the mean clutter intensity they put into the image is proportional to \(\int\lvert s\rvert^2 dt\), the energy level: −20 dB per unit angle. The smeared lobe is about as much wider than the main lobe (≈ FBW·\(u_g\) = 0.5 against \(\lambda/(Nd)\) = 0.005 in sin θ, a factor ≈ 100) as it is lower, so integrated over angle the array factor alone returns about as much diffuse energy from the lobe sector as from the main lobe (at each frequency the replica is a full copy of the main lobe): bandwidth spreads grating-lobe clutter, it does not remove it. What keeps a cyst dark is the element factor, squared in two-way amplitude, \(\lvert E(u_g)/E(u_0)\rvert^4\) in intensity (−38 dB for a 0.9d element at \(f_0\) here).
Pulsed beam: CW, peak and energy patterns
SimulationTime-domain sum (23.8) of delayed Gaussian-envelope pulses, point elements (array factor only), peak and energy evaluated numerically, JS; the law lines are (23.9) and (23.10).| Mode (N = 128, uniform) | Pulse length M (cycles) | GL peak, 2-way (dB) | GL energy, 2-way (dB) | What to watch |
|---|---|---|---|---|
| B-mode, 75 % band | 1.18 | −40.1 | −20.3 | Point ghosts negligible; speckle clutter from the lobe direction is not |
| B-mode, 50 % band | 1.76 | −36.7 | −18.6 | Narrower-band probes or receive filters lose 3.4 dB of the peak (1.7 dB of the energy) suppression |
| Color / PW Doppler burst, 11 % band | 8.0 | −23.7 | −12.0 | Off-axis flow and wall clutter mislocated into the color box; keep the pitch below (23.6) for the box steering |
| ARFI / therapy push, hundreds of cycles | ≥ N | ≈ 0 (CW) | ≈ 0 (CW) | The law needs \(M < N\); a long push deposits force and heat in the lobe direction, limited only by the element factor |
| Steering, d = λ, 20° (any mode) | – | lobe moves from ±90° to −41.1°; element factor −4.4 dB one-way | Steering pulls the lobe into view and off the element null; the pitch rule (23.6) is set by the largest steering angle | |
Array factor only; time-domain sums as in Demo 23.5 (peak and energy simulated, within 0.2 dB of (23.9)). The element factor multiplies every entry by \(\lvert E(u_g)/E(u_0)\rvert^2\) two-way.
Hydrophone scans and Field II beam plots are usually peak-pressure or time-integrated (energy) patterns, and they differ by 15–20 dB at a grating lobe. In an image, what matters is the beamformed echo of a point, which behaves like the two-way peak pattern of the pulse-echo pulse. The element factor (derived in Module 19, (19.1)–(19.3)) multiplies all of these and lowers far lobes further.
23.4The coarray: two-way k-space is the convolution of the apertures
Write the transmit and receive factors at depth z (paraxial focal-plane model) as sums over element positions:
- \(a_t,\ b_r\)
- transmit and receive element weights
- \(\xi_t,\ \xi_r\)
- transmit and receive element positions, mm
- \(x,\ z\)
- lateral position in the focal plane and its depth, mm
- \(T,\ R\)
- transmit and receive focal-plane factors
- \(k_x = (\xi_t + \xi_r)/(\lambda z)\)
- lateral spatial frequency measured by one Tx/Rx pair, cycles/mm
- \(\lambda\)
- wavelength, mm
- \(j\)
- imaginary unit
- \(t,\ r\)
- transmit and receive element indices
m23_kspace_coarray.m checks the identity to \(2\times 10^{-15}\).
Everything about the two-way lateral response can be read off the coarray:
- Extent \(L_T + L_R\) sets the resolution. Equal apertures give a triangle, hence \(\mathrm{sinc}^2\).
- Gaps are grating lobes. Transmit and receive both on every 2nd element leave every other lag empty; the coarray is periodic with 2d and the PSF repeats at \(\lambda z/(2d)\).
- Vernier pairs (Lockwood et al., 1996): transmit every p-th, receive every (p−1)-th element. Each factor has grating lobes, but each lands near the other's nulls, in its low-sidelobe region; the cleaner statement is that the coarray has no periodic gaps (only a single missing lag next to each end, which makes no grating lobe).
- Synthetic aperture: firing each element alone and summing all firings gives the coarray of the full aperture with itself, the same triangle as a transmit focus, at every pixel. One firing alone (or one plane wave) gives only the receive aperture: receive-only resolution.
- Random thinning keeps the extent but replaces grating lobes with a floor. For K of N positions drawn at random, the mean one-way sidelobe power relative to the peak is \(\frac{N-K}{K(N-1)} \approx 1/K\), and the peak sidelobe sits about 7 dB above that mean (N = 64). Module 19 (Section 19.4) applies the same floor to sparse 2D layouts.
Left: the vernier pair reaches every interior lag, so the two-way PSF has no grating lobe. Right: transmit and receive on the same every-second elements fill only even lags; a coarray with period 2d puts a full-height replica at \(\lambda z/(2d)\) = 15.4 mm for z = 30 mm, d = 0.3 mm, 5 MHz. Demo 23.6 builds the same picture for 64 elements.
| Design (64-element receive at z = 30 mm, 5 MHz, d = 0.3 mm) | Tx / Rx elements | Coarray (mm) | −6 dB (mm) | PSL (dB) | Note |
|---|---|---|---|---|---|
| Full Tx = Rx (focused, or full synthetic aperture) | 64 / 64 | 37.8 | 0.43 | −26.5 | triangle → \(\mathrm{sinc}^2\) |
| Hann Tx, rect Rx | 64 / 64 | 37.8 | 0.51 | −24.8 | dB add direction by direction |
| One element or one plane wave | 1 / 64 | 18.9 | 0.59 | −13.3 | receive only |
| Tx = Rx every 2nd | 32 / 32 | 37.2 | 0.43 | 0.0 | grating lobe at 15.4 mm |
| Vernier: Tx every 3rd, Rx every 2nd | 22 / 32 | 37.5 | 0.42 | −26.5 | no grating lobe |
| Random 50 %, independent Tx and Rx sets | 32 / 32 | 36.0 | 0.45 | −21.3 | floor instead of lobes |
| Plane waves, 11 × 3° | 11 / 64 | 34.4 | 0.46 | −26.7 | replica at 5.95 mm, −31.6 dB |
| Plane waves, 31 × 1° | 31 / 64 | 34.4 | 0.47 | −27.7 | replica at 17.9 mm, −37.6 dB |
Narrowband focal-plane values from m23_kspace_coarray.m; the broadband 2D values for the plane-wave rows are in Section 23.5 and are much lower at the replicas.
Coarray and two-way PSF
Approx. modelNarrowband, paraxial focal plane at z = 30 mm: PSF = Fourier transform of the coarray (23.11); plane waves enter as virtual elements at \(\xi = z\sin\theta\); JS.Coarray reasoning is how sparse and row-column 2D arrays for 3D imaging and volumetric ULM are designed: choose transmit and receive subsets whose coarray is filled and smooth, then the two-way PSF is clean even though each one-way pattern is not. The coarray lag \(\xi_r - \xi_{r'}\) between receive elements is also the lag of the spatial coherence function of Module 07; Module 25 builds coherence-based beamformers on it. The hardware that needs this reasoning (2D matrix, micro-beamformed and row-column arrays) is in Module 19, Sections 19.4–19.6.
23.5Plane waves in k-space: synthesizing the transmit focus
A plane wave steered by \(\theta\) reaches a pixel offset \(\Delta x\) from a target with an extra transmit delay \(\Delta x\sin\theta/c\). In the focal-plane picture that is a phase \(e^{j2\pi\Delta x\sin\theta/\lambda}\), exactly what a virtual transmit element at \(\xi = z\sin\theta\) would produce (Figure 23.C). Coherently summing N angles therefore builds a virtual transmit array, and the compounded PSF is (Montaldo et al., 2009, give the synthetic-focusing argument):
- \(R(x)\)
- receive pattern (dynamic aperture \(z/F_{\#,\mathrm{rx}}\))
- \(T_N(x)\)
- synthetic transmit factor of N angles
- \(\theta_n\)
- steering angle of plane wave n
- \(x\)
- lateral offset from the target, mm
- \(P_N(x)\)
- compounded two-way lateral PSF
- \(N,\ n\)
- number of angles and angle index
- \(\lambda\)
- wavelength, mm
- \(j\)
- imaginary unit
Tracing the propagation direction back from the target meets the array line at \(\lvert\xi\rvert = z\tan\theta\), which the paraxial phase argument replaces by \(z\sin\theta\) (8.0 vs 7.8 mm at 15°). The coarray of a plane-wave set is the receive aperture copied at every virtual element (Demo 23.6); the spacing \(z\,\Delta(\sin\theta)\) of the copies sets the replica (23.14).
Span sets the transmit F-number. The virtual array covers \(k_x \in [-\sin\theta_{\max}, \sin\theta_{\max}]/\lambda\), the same support as a focused aperture of half-angle \(\theta_{\max}\):
- \(\theta_{\max}\)
- half-span of the angle set
- \(F_{\#,\mathrm{tx}}\)
- F-number of the synthesized transmit focus
Step sets the transmit grating lobe. Uniform steps in \(\sin\theta\) sample the transmit k-space, so \(T_N\) is periodic:
- \(x_{\mathrm{rep}}\)
- lateral distance of the transmit replica from the target, mm
- \(\Delta(\sin\theta)\)
- step in the sine of the steering angle (\(\Delta\theta\) in rad for small angles)
- \(M\)
- pulse length in cycles, 0.883/FBW
- \(N\)
- number of angles
- \(\lambda\)
- center wavelength, mm
- \(R(x_{\mathrm{rep}})\)
- receive pattern (23.12) at the replica, amplitude
The step rule. To keep the replica of every target in the image outside an image of width W, require \(x_{\mathrm{rep}} \ge W\), i.e. \(\Delta\theta \le \lambda/W\). With W = L = 38.4 mm at 5 MHz, \(\Delta\theta \le 0.46^\circ\). Montaldo's count for focused-equivalent quality follows: a span \(2\theta_{\max} \approx 1/F_\#\) sampled every \(\lambda/L\) needs
- \(L\)
- array length (image width), mm
- \(F_\#\)
- F-number of the focused system to be matched
- \(N\)
- number of angles needed
- \(\lambda\)
- wavelength, mm
Plane-wave compounding: PSF, transmit replicas and a speckle cyst
SimulationAnalytic broadband DAS synthesis, JS: each pixel sums Gaussian-pulse echoes with exact plane-wave transmit and receive delays over the dynamic aperture; no channel sampling, no element directivity, no attenuation. The cyst view uses random point scatterers.The same experiment with simulated channel data, IQ sampling at 20 MHz and DAS (m23_planewave_compounding.m, ±15°, \(F_{\#,\mathrm{rx}}\) 1.5, rect):
| Angles | Step | \(x_{\mathrm{rep}}\) (mm) | Ghost (dB) | −6 dB width meas / theory (mm) | PSL (dB) | Clutter (dB) | Cyst contrast (dB) | CNR | gCNR | SNR gain / \(10\log_{10} N\) (dB) |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | – | – | – | 0.574 / 0.564 | −17.2 | −9.8 | −15.8 | 1.53 | 0.870 | 0 / 0 |
| 3 | 15° | 1.19 | −25.2 | 0.393 / 0.392 | −25.2 | −13.5 | −18.7 | 1.58 | 0.921 | 4.74 / 4.77 |
| 11 | 3° | 5.95 | −52.9 | 0.448 / 0.444 | −28.6 | −24.2 | −28.0 | 1.73 | 0.988 | 10.35 / 10.41 |
| 31 | 1° | 17.9 | out | 0.459 / 0.456 | −29.6 | −26.3 | −37.7 | 1.78 | 0.995 | 14.86 / 14.91 |
Contrast is the intensity ratio inside/outside the cyst, \(\mathrm{CNR} = \lvert\mu_i - \mu_o\rvert/\sqrt{\sigma_i^2 + \sigma_o^2}\) on the envelope, and gCNR = 1 − OVL, the overlap OVL of the inside and outside envelope histograms (100 bins): 0 when the two distributions coincide, 1 when they do not overlap at all. Module 26 develops these metrics and their statistics in full. Clutter is the 2D PSF energy outside the main lobe relative to inside, within ±4 mm. The 3-angle set is narrower than the 31-angle set because its transmit factor is a three-term cosine with a narrow central fringe; the price is the replica shoulder. Demo 23.7 reproduces these widths within 1.5 % and the PSLs within 1.6 dB with an analytic synthesis that skips channel sampling.
"Compounding improves resolution" is only half true. Lateral width improves from receive-only toward two-way only as fast as the span grows (\(F_{\#,\mathrm{tx}} = 1/(2\tan\theta_{\max})\), (23.13)); adding angles inside a fixed span does not narrow the main lobe at all, it moves the replicas out and lowers clutter. Speckle SNR stays at about 1.8–1.9 for every N: coherent compounding changes the PSF, not the number of independent looks (Module 26).
23.6Plane-wave grating lobes and resolution: transmit versus receive beams
Plane-wave imaging separates the two beams that a focused system multiplies at one depth. Keep three objects apart: the transmit field (what each firing insonifies), the receive beam (what dynamic focusing listens to at each pixel), and the synthetic transmit focus (what coherent summation over angles builds). Each has its own resolution and its own grating lobes.
No transmit focus. A 38.4 mm aperture at 5 MHz is in its near field to 1.2 m (Section 23.1), so a single plane wave insonifies a strip as wide as the aperture with no lateral selectivity: the Tx-only lateral pattern of one unsteered plane wave is flat (Demo 23.8, one angle). All the lateral resolution of a single plane wave comes from the dynamically focused receive aperture, \(1.207\,\lambda F_{\#,\mathrm{rx}}\) = 0.558 mm at 5 MHz and F# 1.5 (0.574 mm in the channel-data simulation of Section 23.5).
Transmit grating lobes of a steered plane wave. Steering by delays \(x_n\sin\theta_{\mathrm{tx}}/c\) imposes the phase progression of (23.5) at every frequency, so the array launches a plane wave wherever a replica is visible:
- \(\theta_g\)
- propagation direction of the grating-lobe plane wave, from the array normal
- \(\theta_{\mathrm{tx}}\)
- steering angle of the transmitted plane wave
- \(m\)
- replica order, \(\pm 1, \pm 2, \dots\) (for \(\theta_{\mathrm{tx}} > 0\) the first to appear is \(m = +1\), \(\theta_g < 0\))
- \(\lambda\)
- wavelength at the frequency considered, mm
- \(d\)
- pitch, mm
What the second wave does in the image follows from where and when it arrives:
- Where. It occupies its own strip, leaving the aperture at \(\theta_g\). A target at depth z is hit only if the grating-lobe ray through it, traced back, lands on the aperture: \(\lvert x_T - z\tan\theta_g\rvert \le L/2\). At 5 MHz and 15° that ray comes from 36 mm off axis for a target at 30 mm (outside a 38.4 mm array), but from 18 mm at 15 mm depth: the artifact is a near-field problem at low frequency and moves deeper as \(\theta_g\) approaches \(\theta_{\mathrm{tx}}\).
- When. Along that ray it arrives late by \(\Delta = z\,[1 - \cos(\theta_{\mathrm{tx}} - \theta_g)]/\cos\theta_g\) of path (13.6 mm at z = 15 mm in the 5 MHz case, 7.8 mm at 30 mm for 7.5 MHz), and it is a pulse train: successive elements arrive one period apart, case (b) of Section 23.3. The beamformer, which assumes the main wave, maps the train to a streak below the target, not to a point ghost.
- How strong. The broadband rule \(1.064\,M/N\) does not carry over. In the near field only the elements around the ray through the pixel, about one Fresnel zone \(\sqrt{\lambda z}\) (3 mm, 10 elements at 30 mm), add coherently in the main arrival, so the train competes with roughly 10 elements rather than 128. Simulated (single 15° wave, 60 % band, element factor): streak −24.3 dB at 5 MHz, z 15 mm; −22.6 dB at 7.5 MHz, z 30 mm; against −30.2 and −35.5 dB with a sub-threshold 0.15 mm pitch over the same 38.4 mm aperture, where only transmit edge waves and the X arms remain. Compounding 11 angles over ±15° spreads the streaks and brings them to −36.0 and −35.2 dB.
Receive grating lobes for a pixel. Dynamic receive focusing points a sub-aperture of width \(z/F_{\#,\mathrm{rx}}\) at each pixel; its grating lobes are fixed relative to that look direction, not to the transmit:
- \(\varphi_P\)
- direction of the pixel seen from the center of its receive sub-aperture (0 when the sub-aperture is centered on the pixel)
- \(\varphi_g\)
- direction of the receive grating lobe from the same center
- \(\lambda,\ d\)
- as in (23.16)
- \(\mathbf{r}_P\)
- pixel position
- \(T,\ R\)
- transmit and receive factors; narrowband focal-plane form in (23.12)
Compounding synthesizes the transmit focus. With angles dense enough, the virtual transmit array of Section 23.5 covers \(k_x \in [-\sin\theta_{\max}, \sin\theta_{\max}]/\lambda\) uniformly and the receive aperture covers \(\pm 1/(2F_{\#,\mathrm{rx}}\lambda)\) (paraxial). The two-way PSF is the product of the two sincs, so its support is the trapezoid convolution of the two and its width depends only on the sum of the two half-widths:
- \(w_{-6\,\mathrm{dB}}\)
- two-way lateral −6 dB width at the target, mm
- \(\kappa\)
- shape factor of the trapezoidal k-space support, computed numerically; 0.603 for one angle (or \(F_{\#,\mathrm{rx}} \to \infty\)), 0.886 when \(\sin\theta_{\max} = 1/(2F_{\#,\mathrm{rx}})\); 0.742, 0.834, 0.877, 0.886 for ±5°, ±10°, ±15°, ±20° at F# 1.5
- \(\theta_{\max}\)
- half-span of the angle set
- \(F_{\#,\mathrm{rx}}\)
- receive F-number; \(1/(2F_\#)\) is the paraxial receive numerical aperture
- \(\lambda\)
- center wavelength, mm
The angle step is a pitch. The virtual elements \(\xi_n = z\sin\theta_n\) form an array with pitch \(z\,\Delta(\sin\theta)\), and its grating lobe is the replica of (23.14):
- \(d_v\)
- pitch of the virtual transmit array at depth z, mm
- \(z\)
- depth, mm
- \(\Delta(\sin\theta),\ \Delta\theta\)
- angle step in sine and in radians
- \(x_{\mathrm{rep}}\)
- lateral distance of the transmit replica, mm
- \(F_{\#,\mathrm{rx}}\)
- receive F-number (receive sub-aperture \(z/F_\#\))
- \(W\)
- image width, mm
- \(\lambda\)
- center wavelength, mm
| Half-span (1° steps) | Angles | Formula (23.18) (mm) | \(\kappa\) | Simulated (mm) | Tx-only width (mm) |
|---|---|---|---|---|---|
| 0° (one plane wave) | 1 | 0.557 | 0.603 | 0.611 | flat |
| ±5° | 11 | 0.544 | 0.742 | 0.593 | – |
| ±10° | 21 | 0.507 | 0.834 | 0.549 | – |
| ±15° | 31 | 0.456 | 0.877 | 0.490 | 0.722 |
| ±20° | 41 | 0.404 | 0.886 | 0.432 | – |
5 MHz, 0.3 mm, F# 1.5, z = 30 mm, 60 % band; simulated with m23_planewave_gratinglobe.m, which sums the real element field on transmit and includes the element factor. The simulated widths run 7–10 % above the formula: the summed near field of a line aperture tilts the spectrum toward low frequencies (a half-order integration, about 3 % lower effective \(f_0\)), and the element factor tapers the receive aperture. The Tx-only width of 31 angles, 0.722 mm, is the flat-support value \(0.603\,\lambda/\sin 15^\circ\) = 0.718 mm: by width the synthetic transmit beam alone is an F# 1.93 beam, \(1/(2\sin 15^\circ)\) (the geometric \(1/(2\tan 15^\circ)\) = 1.87 of Section 23.5 is 3 % lower). Inside a fixed span the angle count does not narrow the main lobe (3, 11, 31 angles over ±15°: 0.420, 0.479, 0.490 mm; the 3-angle value is a narrow fringe with a replica shoulder).
Plane-wave PSF: transmit, receive and two-way, with steered-wave grating lobes
SimulationJS, own code: for each plane wave the transmitted field at the target is the sum of 128 point-element Gaussian pulses (so it contains any grating-lobe wave); DAS of the analytic signal with dynamic receive aperture. Element factor of a 0.9d strip (rigid baffle, at \(f_0\)), 2D \(1/\sqrt{r}\) spreading on transmit; no attenuation. Same method asm23_planewave_gratinglobe.m.A comet-tail streak under a bright reflector in steered plane-wave data is easily mistaken for reverberation or a sound-speed error. Check the pitch rule (23.16) at the largest steering angle and the highest frequency in the band: if the streak grows with steering and with frequency, and disappears when the steering is reversed for a target on the other side, it is a transmit grating lobe. Fixes: smaller steering, a lower transmit frequency, more angles, or a probe with a finer pitch.
23.7The compounding budget: SNR, frame rate, motion, F-number, diverging waves
SNR. Each angle adds the target coherently (amplitude ∝ N) and independent electronic noise incoherently (power ∝ N), so
- \(\text{SNR gain}\)
- coherent-compounding gain against independent electronic noise, dB
- \(N\)
- number of angles
Frame rate. One transmit per round trip, so
- \(\mathrm{PRF}\)
- transmit (pulse) repetition frequency, kHz
- \(z_{\max}\)
- deepest depth whose echoes must return before the next firing, mm
- \(f_{\text{frame}}\)
- compounded frame rate, Hz
- \(c\)
- sound speed, 1.54 mm/µs
- \(N\)
- angles per compounded frame
Motion. An axial displacement \(\delta\) per firing adds a two-way phase \(\varphi = 2\pi f_0(1 + \cos\theta)\delta/c \approx 4\pi\delta/\lambda\) per firing. At the true target position the compounded value is a phase-ramp sum:
- \(\delta\)
- axial displacement per firing, mm
- \(\varphi\)
- two-way phase change per firing, rad
- \(v\)
- axial velocity, mm/s
- \(N,\ n\)
- number of angles and firing index
- \(\mathrm{PRF}\)
- firing rate, Hz
- \(\lambda\)
- wavelength, mm
- \(j\)
- imaginary unit
m23_angle_step_rule.m confirms the law at the target (−3.94 dB). With the usual sequential order (−15°, −14°, …) the ramp is linear in \(\sin\theta\), so part of it shifts the transmit factor laterally: the PSF peak moves 0.12 mm and drops only 2.2 dB, a mislocation instead of a loss. An alternating order (0°, −1°, +1°, …) keeps the peak in place and loses the full 4.0 dB.
Receive F-number. A dynamic receive aperture \(L_{\mathrm{rx}}(z) = z/F_\#\) keeps the lateral width \(\approx 1.2\,\lambda F_\#\) constant with depth until the aperture saturates at \(z = L\cdot F_\#\) (57.6 mm for L = 38.4 mm, F# 1.5); beyond that the width grows ∝ z. The F# cannot be lowered freely, because each element only accepts echoes within its directivity. Module 19 derives the element directivity \(E(\theta) = \mathrm{sinc}(w\sin\theta/\lambda)\) (rigid baffle; times \(\cos\theta\) for a soft baffle), (19.1), and the resulting floor \(F_{\#,\min} \approx 1/(2\tan\alpha)\) with \(\lvert E(\alpha)\rvert = 0.5\), (19.2). For the reference array (5 MHz, element width w = 0.27 mm) the −6 dB acceptance half-angle is \(\alpha\) = 43.5° in a rigid baffle (\(F_{\#,\min}\) = 0.53) and 36.0° in a soft baffle (0.69); at 7.5 MHz the floor is 0.97–1.05. Elements beyond \(\alpha\) add more noise than signal; Perrot et al. (2021) discuss this choice for DAS.
Diverging waves. A phased array is too narrow for plane waves to cover a sector. Instead each transmit uses a circular wavefront from a virtual source behind the array; the transmit delay to a pixel is its distance to the virtual source minus a constant, and tilting the virtual source position steers the wave. Compounding over virtual sources synthesizes the transmit aperture exactly as plane waves do, with the angle span now measured as seen from each pixel. Papadacci et al. (2014) used this for ultrafast cardiac imaging.
23.8Visual summary
Twelve pictures that carry the module. Each card is a question to answer in five seconds, the answer with its number, and a figure computed from the formula or the direct sum.
23.9How experts think about it
An array expert reduces every transmit/receive scheme to two objects: the coarray, which says which lateral spatial frequencies the scheme measures and with what weight, and the pulse, which sets how coherently those measurements add away from the main lobe. Focused beams, synthetic aperture, sparse arrays and plane-wave compounding are then just different ways of filling the same k-space, priced in firings, SNR, frame rate and motion sensitivity. The Fourier picture is the default model, and the expert knows its error bars: low Fresnel number, low F#, broadband pulses, and the 2D structure of the PSF.
On axis, the edge-to-center path difference of an unfocused aperture is \(\approx D^2/(8z)\), a phase \(\pi D^2/(4\lambda z)\). While it exceeds \(\pi\) the Fresnel zones across the aperture alternate in sign and the axial intensity oscillates; at \(z = D^2/(4\lambda)\) exactly one zone is left and the last maximum occurs. The direct sum for a 19.2 mm line of point sources puts it at 297 mm (\(0.99\,D^2/(4\lambda)\)). A focusing law can only remove phase that exists, so focal gain needs F well inside this distance. The "far field" conventions \(D^2/\lambda\) (\(\pi/4\)) and \(2D^2/\lambda\) (\(\pi/8\)) are 4× and 8× further.
\(N_F\) counts the Fresnel zones that focusing cancels; the unfocused edge phase at z = F is \(\pi N_F\) (23.2). When \(N_F\) is small, the focusing gain is modest and the 1/r amplitude growth toward the aperture wins, so the intensity maximum slides closer. The direct sum (D = 19.2 mm, 5 MHz) gives peak/F = 0.957 at \(N_F = 5\), 0.899 at 3, 0.735 at 1.5 and 0.605 at 1; the −3 dB DOF is 82 % of \(6.95\,\lambda F_\#^2\) at \(N_F = 3\) and 35 % at \(N_F = 1\). A 2.5 MHz, 20 mm phased array focused at 100 mm has \(N_F = 1.6\).
The Fourier relation drops the non-paraxial path terms and the 1/r amplitude variation across the aperture. At F = 30 mm with D = 19.2 mm (F# 1.56) the edge rays are 18° off axis, enough to matter: the direct sum gives a −6 dB width of 0.596 mm against 0.576 mm from the transform, and raised first sidelobes. At F# 3.1 the width error drops to 1 % and the sidelobe error to 0.1 dB (rect). Low-sidelobe windows suffer most, because the error is a small additive field.
On receive, coherent signal adds as \(\sum w_n\) and independent channel noise as \(\sum w_n^2\), so SNR scales with \((\sum w)^2/(N\sum w^2)\) (23.4): 0.667 for Hann (−1.76 dB). On transmit, each element is already driven at the peak the pulser and the MI limit allow, so a weight below 1 just radiates less: focal amplitude \(\propto \sum w/N\) (Hann: 0.5, −6.0 dB) and energy \(\propto \sum w^2/N\) (0.375, −4.3 dB). The two-way pattern is the same whichever side carries the taper.
An anechoic region is filled by sidelobe energy from all surrounding scatterers, so its floor follows the integral of \(\lvert P\rvert^2\) outside the main lobe, not the single highest lobe. Hamming shows the difference: its first sidelobe (−42.7 dB) is far below Hann's (−31.5 dB), but its far sidelobes decay at −6 dB/octave because the window edge stays at 0.08, so its ISLR (−34.4 dB) is close to Hann's (−32.9 dB). Two-way ISLR falls to −25.3 dB for rect and −64.7 dB for Hann.
At the grating lobe the element delays differ by exactly one period: the pulses are in phase but strung out into a train of N pulses spaced \(T_0\). Only the \(\approx M\) pulses inside one pulse length overlap, so the peak is \(\approx \sqrt{2\pi}\,\sigma_t f_0/N = 1.064\,M/N\) of the main lobe (23.9), for one-way and two-way alike (simulated within 0.1 dB for \(M \ge 1.5\)). The energy pattern is much higher: \(1.505\,M/N\) one-way (−17.6 dB for N = 128, 60 %, a 10 log power ratio), \(1.003\,M/N\) two-way. Doubling N lowers the peak by 6 dB and the energy by 3 dB.
Off axis, a uniform aperture spreads the element pulses evenly over \(D\lvert u\rvert/c\). Convolving a zero-mean pulse with a long rect cancels everything except the two ends, each equal to the running integral of the pulse, \(\approx 1/(2\pi f_0)\) of its peak. Dividing by the spread gives \(\lambda/(2\pi D\lvert u\rvert) = 1/(2x)\), \(x = \pi D\lvert u\rvert/\lambda\) (23.10), against the CW envelope \(1/x\). Simulated: −25.4, −31.4, −37.3 dB at u = 0.05, 0.1, 0.2 vs −26.1, −32.1, −38.1 dB predicted (N = 128, λ/2 pitch, 60 %).
The sampled aperture's pattern repeats every \(\lambda/d\) in \(\sin\theta\) (23.5); a replica inside \(\lvert\sin\theta\rvert \le 1\) is radiated. Keeping the nearest one beyond endfire for every steering up to \(\theta_{\max}\) gives (23.6). The reference 0.3 mm array is lobe-free at 5 MHz only to 1.5° of steering, and at 7.5 MHz has a lobe at ±43.2° unsteered. Two-way is a product, so a transmit lobe at −25.2° (plane wave at 15°) and receive lobes at ±43.2° suppress each other (Demo 23.3).
By Parseval, averaging \(\lvert B(u;f)\rvert^2\) over the pulse power spectrum is the time-integrated energy of the pulse train (23.7). A bright point is imaged at the instant its echo peaks, \(\approx 1.064\,M/N\); diffuse scatterers at all ranges sample every instant of the \(NT_0\)-long train and add incoherently, so the clutter they contribute follows \(1.003\,M/N\) in power (two-way) per unit angle; integrated over the broad smeared lobe it is comparable to the main lobe's, so only the element factor keeps it out of a cyst. Hydrophone energy plots and frequency-averaged beam plots therefore look 15–20 dB worse than point-target images.
Each transmit/receive element pair measures one lateral spatial frequency, \((\xi_t + \xi_r)/(\lambda z)\). Summing pairs with the same sum gives the coarray \(a * b\), and \(T(x)R(x) = \mathcal{F}\{a * b\}\) exactly (23.11) (\(2\times 10^{-15}\) in m23_kspace_coarray.m). Equal uniform apertures give a triangle, hence \(\mathrm{sinc}^2\) and the −26.5 dB two-way sidelobe; any scheme with the same coarray has the same narrowband focal-plane PSF, regardless of how many firings it needs.
Transmit and receive on every 2nd element leave every odd lag of the coarray empty: it is periodic with 2d, so the PSF repeats at \(\lambda z/(2d)\) = 15.4 mm (z = 30 mm, d = 0.3 mm, 5 MHz) at full height. With transmit spacing pd and receive spacing (p−1)d, every interior lag is reachable (Figure 23.B); in the pattern picture each factor's grating lobes land near the other factor's nulls. The 3/2 vernier with 22 transmit and 32 receive elements matches the full aperture's −26.5 dB PSL and its width.
With element positions drawn at random, the far-field phasors at any sidelobe direction add like a random walk: mean power \(\approx K(N-K)/(N-1)\) against a peak of \(K^2\). Monte Carlo over 300 draws (N = 64, λ/2 pitch): −9.52, −13.14, −17.79 dB for K = 8, 16, 32 vs −9.54, −13.22, −17.99 predicted. The highest sidelobe of a single draw sits about 7 dB above the mean. Thinning to K elements therefore buys aperture width (resolution) at a clutter floor of \(\approx 10\log_{10}(1/K)\).
In the coarray picture one plane wave is a single virtual transmit element at \(\xi = 0\), so the coarray is just the receive aperture and the lateral pattern is the one-way receive sinc: \(1.207\,\lambda F_\#\) = 0.558 mm at 5 MHz, F# 1.5, simulated 0.574 mm with a 60 % band. In 2D, the receive-only PSF has arms along the hyperbola of arrival times that the transmit does not suppress: the 2D peak sidelobe is −17 dB and the integrated clutter −9.8 dB.
A plane wave at \(\theta\) contributes the phase \(e^{j2\pi x\sin\theta/\lambda}\), like a virtual element at \(\xi = z\sin\theta\). N angles form a virtual transmit array spanning \(k_x = \pm\sin\theta_{\max}/\lambda\), the same support as a focused aperture with half-angle \(\theta_{\max}\) (23.13). With ±15° and \(F_{\#,\mathrm{rx}} = 1.5\) the narrowband prediction is 0.456 mm, the channel-data simulation 0.459 mm (31 angles), against 0.56 mm receive-only and 0.41 mm for a true two-way F# 1.5.
Uniform steps sample the transmit k-space, so \(T_N(x) = \frac{1}{N}\sum e^{j2\pi x\sin\theta_n/\lambda}\) is periodic in x with period \(\lambda/\Delta(\sin\theta)\) (23.14). The period does not involve z, unlike a focused array's grating lobe (\(\lambda z/d\)). A bright target at \(x_0\) reappears at \(x_0 \pm x_{\mathrm{rep}}\), suppressed only by the receive pattern there; requiring \(x_{\mathrm{rep}} \ge W\) keeps it outside an image of width W, \(\Delta\theta \le \lambda/W\). The analytic synthesis finds the ghost hump at 5.55 mm (prediction 5.95 mm, smeared by ±FBW/2) at 20, 30 and 45 mm depth.
Steering delays impose the same phase progression at every frequency, so every visible replica of (23.16) is a real wave in its own strip. Along its ray it arrives late by \(z[1-\cos(\theta_{\mathrm{tx}}-\theta_g)]/\cos\theta_g\) and as a pulse train (elements one period apart), so DAS turns it into a streak under the target. In the near field the main arrival is built by only about one Fresnel zone of elements (\(\sqrt{\lambda z}\) ≈ 3 mm), so the train is only 20–25 dB down, not the \(M/N\) of a focused beam (simulated, 60 % band, element factor).
Dense angles fill the transmit k-space uniformly over \(\pm\sin\theta_{\max}/\lambda\), the dynamic receive aperture over \(\pm 1/(2F_\#\lambda)\); the two-way PSF is the product of the two sincs, so its support is their trapezoidal convolution (23.18). κ = 0.603 when one support dominates (one angle gives \(1.207\,\lambda F_\#\)), 0.886 when they are equal (the focused two-way \(0.886\,\lambda F_\#\)). The full-wave simulation sits 7–10 % above, from the near-field spectral tilt and element factor.
With \(\xi_n = z\sin\theta_n\), the angle set is an array of pitch \(d_v = z\Delta(\sin\theta)\); its lobe at \(\lambda z/d_v\) is depth independent (23.19). If \(d_v\) is no larger than the receive sub-aperture \(z/F_\#\), the coarray has no gaps and the replica sits beyond the first receive null \(\lambda F_\#\), attenuated by receive sidelobes (3 × 15°: −25 dB at 1.19 mm). Moving it out of the image takes Montaldo's \(\lambda/W\).
A span \(2\theta_{\max} \approx 1/F_\#\) sampled at \(\lambda/L\) gives \(N \approx L/(\lambda F_\#)\) (23.15): 83 angles at 5 MHz for a 38.4 mm array and F# 1.5, 125 at 7.5 MHz. That bound puts every replica outside the array width. But a ghost is the transmit replica times the receive pattern and times the broadband factor \(1.06\,M/N\): in the channel-data simulation, 11 angles at 3° leave the ghost at −52.9 dB and the cyst contrast at −28 dB, while 31 angles reach −37.7 dB contrast mostly through lower diffuse clutter.
The target echo adds in phase across angles (amplitude N), independent electronic noise adds in power (N), so SNR grows by N: 4.74, 10.35, 14.86 dB simulated for 3, 11, 31 angles vs 4.77, 10.41, 14.91 dB. Speckle is the deterministic response of the scatterers to the compounded PSF; coherent summation only changes the PSF, so the envelope stays Rayleigh (\(\mathrm{SNR}_0 \approx\) 1.8–1.9 here, 1.91 in theory). Incoherent (envelope) compounding of decorrelated looks is the one that averages speckle (Module 26).
Each transmit must wait for echoes from \(z_{\max}\) to return, a round trip of \(2z_{\max}/c\) (51.9 µs at 40 mm), so PRF ≤ 19.25 kHz. N angles per compounded frame divide that by N. This is the central trade of ultrafast imaging: a handful of angles at kHz frame rates for Doppler, shear-wave and ULM ensembles, many angles when contrast matters and the scene is slow.
An axial displacement \(\delta\) per firing adds a two-way phase \(\varphi \approx 4\pi\delta/\lambda\) per firing; the compounded value at the target is the sum of a phase ramp (23.22). When the total displacement reaches λ/4 (77 µm at 5 MHz) the loss is 3.9 dB; at λ/2 the ramp spans 2π and the sum nulls. With sequential angle order the ramp is linear in \(\sin\theta\) and part of it becomes a lateral shift instead (peak moves 0.12 mm, loses 2.2 dB at 25 mm/s); alternating order loses the full 4.0 dB in place.
A dynamic aperture \(z/F_\#\) keeps \(\lambda z/L_{\mathrm{rx}} = \lambda F_\#\) fixed until the aperture reaches the array length at \(z = L\cdot F_\#\) (57.6 mm for 38.4 mm, F# 1.5). Lowering F# further only helps while the edge elements still see the pixel: with \(E(\theta) = \mathrm{sinc}(w\sin\theta/\lambda)\) the −6 dB half-angle is 43.5° at 5 MHz for w = 0.27 mm (\(F_{\#,\min}\) 0.53), 36.0° with the soft-baffle \(\cos\theta\) (0.69); at 7.5 MHz 0.97–1.05 (Module 19, (19.2)). Beyond that, edge channels add noise and clutter faster than signal.
23.10Cheat sheet
| Concept | Formula | Ultrasound use |
|---|---|---|
| Near-field length | \(D^2/(4\lambda)\) (edge phase \(\pi\)); far field \(D^2/\lambda\) or \(2D^2/\lambda\) | Whether focusing can work; why plane waves have no transmit beam |
| Fresnel number | \(N_F = D^2/(4\lambda F)\) | Focal shift (peak/F 0.90 at \(N_F\) 3, 0.61 at 1); validity of \(7\lambda F_\#^2\) |
| Two-way pattern | \(P_2 = A_T A_R\), dB add direction by direction | Tx ≠ Rx apodization, sparse designs |
| ISLR | \(\int_{\text{out}}\lvert P\rvert^2 / \int_{\text{main}}\lvert P\rvert^2\) | Cyst fill-in; rect −9.7 dB, Hann −32.9 dB one-way |
| Receive SNR price | \((\sum w)^2/(N\sum w^2)\) | Hann −1.76 dB, Hamming −1.34 dB |
| Transmit apodization price | focal amplitude \(\sum w/N\), energy \(\sum w^2/N\) | Hann −6.0 dB amplitude at fixed drive |
| Grating-lobe positions, pitch rule | \(\sin\theta_m = \sin\theta_0 + m\lambda/d\); none if \(d < \lambda/(1+\lvert\sin\theta_{\max}\rvert)\) | 0.3 mm array: 0.974λ at 5 MHz (1.5° steering), 1.46λ at 7.5 MHz (lobe at ±43°) |
| Bandwidth-averaged pattern | \(\bar B^2 = \int\lvert P\rvert^2\lvert B\rvert^2 df/\int\lvert P\rvert^2 df\) = energy pattern | Not the point-target (peak) pattern; 20 dB apart at a broadband lobe |
| Pulse length in cycles | \(M = f_0\tau_{-6\,\mathrm{dB}} = 0.883/\mathrm{FBW}\) (Gaussian) | Input to broadband lobe levels |
| Broadband grating lobe | peak \(1.064\,M/N\); energy \(1.505\,M/N\) (1-way), \(1.003\,M/N\) (2-way) | Why a 0 dB CW lobe is −38 dB in an image (N 128, 60 %) |
| Edge waves | \(\lambda/(2\pi D\lvert u\rvert)\) for \(\lvert u\rvert > M\lambda/D\) | Far sidelobes of a pulsed uniform aperture |
| Coarray | \(P_2 = \mathcal{F}\{a * b\}\), \(k_x = (\xi_t + \xi_r)/(\lambda z)\) | Sparse, vernier, synthetic aperture, plane-wave designs |
| Random thinning floor | \(\frac{N-K}{K(N-1)} \approx 1/K\) | 2D sparse arrays |
| Plane wave as virtual source | \(\xi = z\sin\theta\) | Coarray of compounding = receive aperture copied at each angle |
| Synthetic transmit F# | \(F_{\#,\mathrm{tx}} = 1/(2\tan\theta_{\max})\) | ±15° → 1.87; ±18.4° → 1.5 |
| Transmit replica | \(x_{\mathrm{rep}} = \lambda/\Delta(\sin\theta)\), depth-independent | Ghosts of bright targets; 1° at 5 MHz → 17.6 mm |
| Steered plane-wave grating lobe | \(\sin\theta_g = \sin\theta_{\mathrm{tx}} - \lambda/d\), exists if \(d > \lambda/(1+\lvert\sin\theta_{\mathrm{tx}}\rvert)\) | Streak below targets, −23 to −24 dB single angle at 0.3 mm and 15° |
| Plane-wave lateral resolution | \(\kappa\lambda/(\sin\theta_{\max} + 1/(2F_\#))\), κ 0.60–0.89 | 5 MHz, F# 1.5: 0.557 mm (1 angle) → 0.456 mm (±15°) |
| Angle step as virtual pitch | \(d_v = z\Delta(\sin\theta)\); gap-free if \(\Delta\sin\theta \le 1/F_\#\) | Replica under receive sidelobes vs outside the image |
| Angle count | \(\Delta\theta \le \lambda/W\); \(N \approx L/(\lambda F_\#)\) | 83 angles for focused equivalence at 5 MHz, 38.4 mm, F# 1.5 |
| SNR gain, frame rate | \(10\log_{10} N\); \(f_{\text{frame}} = c/(2z_{\max}N)\) | 31 angles: +14.9 dB, 621 Hz at 40 mm |
| Motion loss | \(\lvert\sin(N\varphi/2)/(N\sin(\varphi/2))\rvert\), \(\varphi \approx 4\pi\delta/\lambda\) | λ/4 over the sequence: −3.9 dB |
| Minimum receive F# | \(1/(2\tan\alpha)\), \(\lvert E(\alpha)\rvert = 0.5\) | 0.5–0.7 at 5 MHz, ≈ 1 at 7.5 MHz (w = 0.27 mm) |
23.11Interview and qualifying-exam questions
I1Why can't you focus a 19.2 mm aperture at 400 mm at 5 MHz? · screen
The near-field length \(D^2/(4\lambda)\) is 299 mm, so 400 mm is beyond the last axial maximum: the Fresnel number \(N_F = D^2/(4\lambda F) = 0.75\) is below 1, there is less than one Fresnel zone of phase to cancel and the focusing law changes almost nothing. The intensity peak would sit well short of 400 mm (peak/F ≈ 0.6 already at \(N_F = 1\)). Fix: a larger aperture or a higher frequency (\(N_F \propto D^2 f\)). Follow-up: "What is the far field then?" \(D^2/\lambda\) = 1.2 m or \(2D^2/\lambda\) = 2.4 m, depending on the convention; say which.
I2Your paraxial simulation at F# 1.2 shows first sidelobes at −13.3 dB; a full field simulation shows −12.5 dB. Which is wrong? · onsite
Neither is buggy; the paraxial model is the approximation. The Fourier relation drops non-paraxial path terms and the 1/r amplitude variation across a wide aperture; at F# 1.56 the direct point-source sum already gives −12.7 dB and a 3.5 % wider main lobe, and the error grows as F# drops. For Hann the gap is larger (−28.8 vs −31.5 dB), because the error is a small additive field that matters more under low sidelobes. Follow-up: "Would element directivity change it?" Yes, it acts as an extra taper and usually lowers the far sidelobes; include it in the reference model.
I3You want lower sidelobes. Do you apodize on transmit or on receive, and what does each cost? · onsite
The two-way pattern is the same either way (product of factors), but the price differs. Receive apodization costs SNR against channel noise: \((\sum w)^2/(N\sum w^2)\), −1.76 dB for Hann. Transmit apodization at fixed peak drive costs radiated field: focal amplitude \(\sum w/N\), −6.0 dB for Hann, energy −4.3 dB. If SNR-limited, apodize on receive (or not at all); if MI-limited at shallow depth with SNR to spare, transmit apodization is acceptable. Follow-up: "What do you report for clutter?" ISLR or 2D integrated clutter and cyst gCNR, not just PSL.
I4A 128-element array at 7.5 MHz has pitch 1.46λ. The CW pattern has a 0 dB grating lobe at 43°. Why is the artifact in the image so faint? · onsite
Three factors. (1) Broadband: at the lobe the element pulses arrive one period apart and form a train; only \(\approx M\) of N overlap, so the peak is \(\approx 1.064\,M/N\): with 60 % band (M = 1.47) that is −38 dB one-way and about the same two-way. (2) Element factor: a 0.9d-wide element (w = 1.31λ) is about −19 dB at 43° one-way, −38 dB two-way. (3) The lobe must hit a strong reflector to show. Follow-up: "Energy pattern?" \(1.505\,M/N\), about −17.6 dB (power): hydrophone energy plots look much worse than the image.
I5Explain the coarray and use it to design a sparse array with fewer channels but no grating lobes. · research
Each Tx/Rx pair measures spatial frequency \((\xi_t + \xi_r)/(\lambda z)\); the two-way PSF is the Fourier transform of the coarray \(a * b\). Design goal: a filled, smooth coarray. Example: vernier, Tx every 3rd and Rx every 2nd element of 64: 22 + 32 elements, coarray without periodic gaps (only the lag next to each end is missing), two-way PSL −26.5 dB like the full aperture, whereas Tx = Rx every 2nd has a 0 dB lobe at \(\lambda z/(2d)\). Alternatives: random thinning (floor \(\approx 1/K\), peak ≈ 7 dB higher), or synthetic aperture over sub-apertures. Follow-up: "Cost?" SNR (fewer elements), and the vernier null alignment is exact only at \(f_0\).
I6What does a single plane wave give you laterally, and what exactly does compounding add? · screen
One plane wave is one virtual transmit element: the coarray is the receive aperture, so the lateral width is receive-only, \(1.21\,\lambda F_\#\) (0.56 mm at 5 MHz, F# 1.5), and the 2D PSF has X-shaped edge arms (PSL ≈ −17 dB). Compounding N angles builds a virtual transmit array: span → transmit \(F_\# = 1/(2\tan\theta_{\max})\) and narrower main lobe; step → replica position \(\lambda/\Delta(\sin\theta)\); count → clutter and SNR (\(10\log_{10} N\)). Follow-up: "Does more angles in the same span improve resolution?" No; it lowers clutter and moves replicas out.
I7Derive the plane-wave angle-step condition. Why is Δθ ≤ λ/L conservative? · onsite
The transmit factor \(T_N(x) = \frac{1}{N}\sum e^{j2\pi x\sin\theta_n/\lambda}\) is periodic in x with period \(\lambda/\Delta(\sin\theta)\), independent of depth. Requiring the replica of any target to fall outside an image of width W gives \(\Delta\theta \approx \Delta(\sin\theta) \le \lambda/W\); with W = L = 38.4 mm at 5 MHz, 0.46°, and with span \(1/F_\#\) the count \(N \approx L/(\lambda F_\#) = 83\) (Montaldo et al., 2009). Conservative because the ghost is also multiplied by the receive pattern at \(x_{\mathrm{rep}}\) and by the broadband factor \(\approx 1.06\,M/N\): 11 angles at 3° (replica 5.95 mm) leave a −53 dB ghost in simulation. Follow-up: "When is it not conservative?" Very bright specular targets and narrowband pulses.
I8With 11 angles at 3° you see a faint copy of a bright wire 6 mm to its side, at every depth. Diagnose and fix. · onsite
A transmit replica: \(\lambda/\Delta(\sin\theta) = 0.308/0.0523\) = 5.9 mm at 5 MHz, and its depth independence identifies it (a focused-array grating lobe would scale with z, a receive grating lobe would follow \(\lambda z/d\)). Fixes: a smaller step (more angles in the same span), receive apodization or a lower receive F# so that \(R(x_{\mathrm{rep}})\) is lower there (a higher F# makes it worse), or a nonuniform angle set that spreads the replica into a floor. Follow-up: "Cost of halving the step at fixed span?" Twice the angles: half the frame rate, +3 dB SNR, and a sequence twice as long, so twice the displacement for the same velocity.
I9Compounding 31 angles: what happens to SNR, cyst contrast and speckle, and why? · screen
SNR against electronic noise: \(+10\log_{10} 31\) = 14.9 dB (coherent signal, incoherent noise; simulated 14.86 dB). Cyst contrast: much better (−15.8 → −37.7 dB in the simulation, gCNR 0.87 → 0.995) because the synthesized transmit focus removes the edge arms and diffuse sidelobe energy. Speckle: unchanged statistics, \(\mathrm{SNR}_0 \approx\) 1.8–1.9, because coherent summation only changes the PSF; speckle reduction needs incoherent compounding of decorrelated looks. Follow-up: "Why does CNR improve only from 1.53 to 1.78?" CNR is bounded by background speckle variance (≈ 1.91 for a perfectly black cyst on the envelope); gCNR saturates near 1.
I10In cardiac plane-wave imaging the compounded image loses signal on the moving wall. Quantify and propose mitigations. · research
Axial motion \(\delta\) per firing gives a phase ramp \(\varphi \approx 4\pi\delta/\lambda\) per firing; at the true position the loss is \(\lvert\sin(N\varphi/2)/(N\sin(\varphi/2))\rvert\): λ/4 over the sequence costs 3.9 dB, λ/2 nulls it. At 5 MHz, 31 angles at 10 kHz, λ/4 is 25 mm/s. With sequential angle order part of the ramp turns into a lateral mislocation (0.12 mm, −2.2 dB peak loss in simulation). Mitigations: fewer angles or a higher PRF (shorter sequence), lower frequency, motion estimation and phase compensation per angle before summation, or diverging waves with few virtual sources for the heart. Follow-up: "Why does angle order matter?" A ramp linear in \(\sin\theta\) is equivalent to a lateral shift of the transmit factor.
I11Why use diverging waves on a phased array, and what changes in the k-space picture? · research
A phased array is narrow (≈ 20 mm), so a plane wave insonifies only a strip as wide as the probe, not a sector. A diverging wave from a virtual source behind the array covers the sector. Transmit delay to a pixel = distance to the virtual source (minus a constant); moving the virtual source tilts the wave. Each virtual source contributes the transmit direction from source to pixel, so the synthetic transmit aperture is the set of those directions as seen from the pixel, and its span shrinks with depth, unlike a plane-wave set. The same coarray reasoning applies: span sets \(F_{\#,\mathrm{tx}}\), spacing sets replicas, SNR is lower than plane waves because the energy spreads over the sector. Follow-up: Papadacci et al. (2014) for cardiac use.
I12Your 0.3 mm linear array shows a comet-tail streak under a wire only when you steer plane waves to 15° at 7.5 MHz. Explain and quantify. · onsite
A transmit grating lobe of the steered plane wave. At 7.5 MHz, \(d = 1.46\lambda\), above the threshold \(\lambda/(1+\sin 15^\circ) = 0.794\lambda\); the second wave leaves at \(\sin\theta_g = 0.259 - 0.685\), −25.2°. It reaches the wire late (7.8 mm of path along its ray at 30 mm) and as a pulse train, so DAS images it as a streak below the wire, about −23 dB for a single angle with 60 % band. Not \(M/N\): in the near field only about one Fresnel zone of elements builds the main arrival. Fixes: steer less, lower the transmit frequency, compound more angles (−35 dB with 11), finer pitch. Follow-up: "Why not at 5 MHz?" The lobe goes to −50° and its ray misses a 30 mm target (it comes from 36 mm off axis); it shows at 15 mm depth instead.
I13Derive the lateral resolution of coherent plane-wave compounding in terms of the angle span and the receive F-number. · research
Each angle contributes \(e^{j2\pi x\sin\theta/\lambda}\), so dense angles fill transmit k-space uniformly on \(\pm\sin\theta_{\max}/\lambda\); the receive aperture fills \(\pm 1/(2F_\#\lambda)\). The PSF is the product of the two sincs, support the trapezoid convolution: \(w_{-6} \approx \kappa\lambda/(\sin\theta_{\max} + 1/(2F_\#))\), κ from 0.603 (one support dominates, e.g. one angle: \(1.207\lambda F_\#\)) to 0.886 (equal supports, focused two-way). 5 MHz, F# 1.5, ±15°: 0.456 mm. Follow-up: "And the number of angles?" It sets the replica position \(\lambda/\Delta(\sin\theta)\), not the width; three angles over ±15° even give a narrower fringe (0.42 mm) with a replica shoulder.
I14Explain the plane-wave angle-step rule as a grating-lobe condition. · screen
Angle \(\theta_n\) acts as a virtual element at \(\xi = z\sin\theta_n\), so a uniform angle set is an array of pitch \(d_v = z\Delta(\sin\theta)\). Its grating lobe sits at \(\lambda z/d_v = \lambda/\Delta(\sin\theta)\), independent of depth. If \(d_v \le z/F_\#\) the coarray is gap-free and the replica falls beyond the first receive null, under receive sidelobes; \(\Delta\theta \le \lambda/W\) moves it out of the image (0.46° for 38.4 mm at 5 MHz). Follow-up: "Diagnose a ghost 6 mm to the side at every depth with 3° steps." \(0.308/0.0523 = 5.9\) mm: the angle-domain replica.
23.12MATLAB lab
Base MATLAB only (no toolboxes); each script runs as-is in MATLAB R2019b+ and GNU Octave 8. Paste into the editor and press Run. Runtimes are Octave timings on a 2-core machine.
m23_planewave_compounding.mChannel-data simulation of point targets and a speckle cyst, 31 plane waves, DAS, compounding 1/3/11/31 angles · change span, F#, apodization, bandwidth · runtime ≈ 18 s
%% m23_planewave_compounding.m -- coherent plane-wave compounding, simulated end to end
% Purpose : a self-contained plane-wave simulator. It synthesizes complex baseband (IQ)
% channel data of a 128-element linear array for (A) five point targets,
% (B) a speckle phantom with an anechoic cyst and (C) electronic noise, for 31
% steered plane waves over +-15 deg. Each angle is beamformed with DAS
% (dynamic receive aperture, F# 1.5); the complex images are then summed over
% nested subsets of 1, 3, 11 and 31 angles (same +-15 deg span, steps 30, 15, 3
% and 1 deg). Printed per subset: angle step, transmit-replica distance
% lambda/d(sin), equivalent transmit F#, -6 dB lateral width, peak sidelobe and
% integrated clutter around the central target, cyst contrast / CNR / gCNR,
% speckle SNR0, and the SNR gain against electronic noise. DAS weights are
% normalized to unit sum per pixel, so the gain does not change with depth.
% Change : thetaMax_deg and the subsets (try 11 angles over +-5 deg), Fnum, rxApod
% ('rect' or 'hann'), FBW, density, the noise is unit-variance per channel sample.
% Expect : SNR gain within 0.1 dB of 10 log10(N) = 0, 4.8, 10.4, 14.9 dB.
% 1 angle: receive-only focusing; -6 dB width 0.57 mm, close to the one-way
% 1.207 lambda F# = 0.56 mm; peak sidelobe -17 dB (the X-shaped edge arms).
% 31 angles: width 0.46 mm (narrowband theory for a +-15 deg span: 0.45 mm),
% peak sidelobe -30 dB, cyst contrast -16 -> -38 dB, gCNR 0.87 -> 0.995.
% Transmit replicas sit at lambda/d(sin theta): 1.19 mm for the 15 deg step
% (a broad -25 dB shoulder), 5.95 mm for the 3 deg step (about -55 dB, because
% the receive pattern is already far down there) and 17.9 mm for 1 deg.
% Speckle SNR0 stays ~1.8-1.9 for every N: coherent compounding sharpens the
% PSF, it does not average speckle.
% Model : linear acoustics, first-order Born, ideal plane-wave transmit limited to the
% array's projected footprint (no edge waves), no attenuation or spreading,
% point-like elements (no directivity), Gaussian two-way pulse. IQ channel data
% at fs = 20 MHz: each echo gets its exact carrier phase and a linearly
% interpolated position, then is convolved with the sampled envelope (envelope
% std broadened by ~1 %). Runtime ~15-25 s in Octave.
% Base MATLAB only; runs in MATLAB R2019b+ and GNU Octave 8.
clear; close all; rng(1);
tic;
%% Parameters
c = 1.540; % speed of sound (mm/us)
f0 = 5; % center frequency (MHz)
lam = c/f0; % wavelength (mm) = 0.308
FBW = 0.60; % -6 dB fractional bandwidth of the two-way pulse spectrum
fs = 20; % IQ sampling rate (MHz)
Nel = 128; pitch = 0.30; % elements, pitch (mm)
xe = ((0:Nel-1) - (Nel-1)/2) * pitch; % element x positions (mm), row vector
L = Nel*pitch; % aperture length (mm) = 38.4
Fnum = 1.5; % receive F-number (dynamic aperture z/Fnum)
rxApod = 'rect'; % 'rect' or 'hann' receive apodization
thetaMax_deg = 15; % plane-wave span is +-thetaMax
Nang = 31; % angles in the full set (1 deg step)
theta = linspace(-thetaMax_deg, thetaMax_deg, Nang) * pi/180;
iMid = (Nang+1)/2;
subsets = {iMid, [1 iMid Nang], 1:3:Nang, 1:Nang}; % nested: 1, 3, 11, 31 angles
density = 70; % speckle scatterers per mm^2 (about 7 per resolution cell)
sig_f = FBW*f0/(2*sqrt(2*log(2))); % std of the Gaussian amplitude spectrum (MHz)
sig_t = 1/(2*pi*sig_f); % std of the Gaussian envelope (us) = 0.125
kt = (-ceil(4*sig_t*fs):ceil(4*sig_t*fs)).';
envK = exp(-(kt/fs).^2/(2*sig_t^2)); % sampled envelope (column), peak 1
%% Phantoms
% (A) point targets: a central target for the metrics, four others for context
ptsX = [0 -5 5 -5 5].'; ptsZ = [30 25 25 35 35].'; ptsA = ones(5,1);
% (B) speckle with an anechoic cyst of radius R at (cx, cz)
R = 3; cx = 0; cz = 30;
xr = [-8.6 8.6]; zr = [21.4 38.6];
Ns = round(density*diff(xr)*diff(zr));
spX = xr(1) + diff(xr)*rand(Ns,1); spZ = zr(1) + diff(zr)*rand(Ns,1);
keep = (spX-cx).^2 + (spZ-cz).^2 > R^2;
spX = spX(keep); spZ = spZ(keep);
spA = (randn(numel(spX),1) + 1i*randn(numel(spX),1))/sqrt(2);
fprintf('speckle scatterers: %d (%.0f per mm^2), cyst radius %.1f mm\n', numel(spX), density, R);
%% Image grids and angle-independent receive geometry
dx = 0.15; dz = 0.10; % B-mode grid (mm), above the IQ Nyquist limits
xg = -8:dx:8; zg = 22:dz:38;
[XG, ZG] = meshgrid(xg, zg);
xl = -8:0.02:8; % fine lateral line through the central target
Px = [XG(:); xl(:)]; Pz = [ZG(:); 30*ones(numel(xl),1)];
nImg = numel(XG); nPix = numel(Px);
Rrx = sqrt((Px - xe).^2 + Pz.^2) / c; % nPix x Nel, receive time (us)
uap = (xe - Px) ./ (Pz/(2*Fnum)); % position in the receive aperture, |u| <= 1
if strcmp(rxApod, 'hann'), W = 0.5 + 0.5*cos(pi*uap); else, W = ones(size(uap)); end
act = abs(uap) <= 1; % active (pixel, element) pairs only
W = W .* act; W = W ./ sum(W, 2); % normalize: same gain at every depth
[pp, ee] = find(act);
rxT = Rrx(act); % receive time of each active pair
Wc = W(act) .* exp(1i*2*pi*f0*rxT); % apodization x receive part of the re-modulation
clear Rrx uap W act
fprintf('active (pixel, element) pairs: %d (%.0f per pixel)\n', numel(pp), numel(pp)/nPix);
txTime = @(x, z, th) (x*sin(th) + z*cos(th))/c; % plane-wave arrival time (us)
inBeam = @(x, z, th) abs(x - z*tan(th)) <= L/2; % projected footprint of the array
RsA = sqrt((ptsX - xe).^2 + ptsZ.^2)/c; EA = exp(-1i*2*pi*f0*RsA); % receive legs, targets
RsB = sqrt((spX - xe).^2 + spZ.^2)/c; EB = exp(-1i*2*pi*f0*RsB); % receive legs, speckle
%% Simulate and beamform every angle
imgA = zeros(nPix, Nang); imgB = zeros(nPix, Nang); imgC = zeros(nPix, Nang);
for ia = 1:Nang
th = theta(ia);
Ttx = txTime(Px, Pz, th); % transmit time to each pixel (us)
T = Ttx(pp) + rxT; % two-way DAS delay of each pair
t0 = min([min(T), min(RsB(:)) + min(txTime(spX, spZ, th))]) - 1; % time origin (us)
nt = ceil((max([max(T), max(RsB(:)) + max(txTime(spX, spZ, th))]) + 1 - t0)*fs) + 2;
S = cell(1, 3);
for ph = 1:2 % channel data, IQ, nt x Nel
if ph == 1, ttx = txTime(ptsX, ptsZ, th); Rs = RsA; E = EA; a = ptsA .* inBeam(ptsX, ptsZ, th);
else, ttx = txTime(spX, spZ, th); Rs = RsB; E = EB; a = spA .* inBeam(spX, spZ, th); end
w = (a .* exp(-1i*2*pi*f0*ttx)) .* E; % exact baseband phase of every echo
q = (ttx + Rs - t0)*fs; i0 = floor(q); fr = q - i0;
li = i0 + (1 + nt*(0:Nel-1)); % linear index of the earlier sample
w1 = w.*(1-fr); w2 = w.*fr; % linear split between two samples
Sd = accumarray(li(:), w1(:), [nt*Nel 1]) + accumarray(li(:)+1, w2(:), [nt*Nel 1]);
S{ph} = conv2(reshape(Sd, nt, Nel), envK, 'same'); % pulse envelope
end
S{3} = conv2((randn(nt, Nel) + 1i*randn(nt, Nel))/sqrt(2), envK, 'same'); % noise, same band
q = (T - t0)*fs; i0 = floor(q); fr = q - i0;
li = i0 + 1 + nt*(ee - 1);
txRot = exp(1i*2*pi*f0*Ttx); % transmit part of the re-modulation
for ph = 1:3 % DAS: interpolate, weight, sum
v = ((1-fr).*S{ph}(li) + fr.*S{ph}(li+1)) .* Wc;
img = accumarray(pp, v, [nPix 1]) .* txRot;
if ph == 1, imgA(:,ia) = img; elseif ph == 2, imgB(:,ia) = img; else, imgC(:,ia) = img; end
end
end
fprintf('simulation + DAS of %d angles: %.1f s\n\n', Nang, toc);
%% Compound and measure
inB = 1:nImg; inL = nImg+1:nPix;
dXc = XG(:); dZc = ZG(:) - 30; % offsets from the central target
box = abs(dXc) <= 4 & abs(dZc) <= 4;
mlobe = abs(dXc) <= 1.2*lam*Fnum & abs(dZc) <= 0.4; % mainlobe region (excluded)
rr = sqrt((XG(:)-cx).^2 + (ZG(:)-cz).^2);
cin = rr <= R - 0.5; cout = rr >= R + 1 & rr <= R + 3.5;
nS = numel(subsets);
res = zeros(nS, 14); prof = zeros(numel(xl), nS); bA = cell(1,nS); bB = cell(1,nS);
fprintf('%4s %6s %8s %6s %7s %7s %7s %7s %8s %9s %6s %6s %5s %8s %7s\n', 'N', 'step', 'replica', 'ghost', 'F#tx', ...
'w-6dB', 'w-6dB', 'PSL', 'clutter', 'contrast', 'CNR', 'gCNR', 'SNR0', 'SNRgain', '10logN');
fprintf('%4s %6s %8s %6s %7s %7s %7s %7s %8s %9s %6s %6s %5s %8s %7s\n', '', '(deg)', '(mm)', '(dB)', '', ...
'meas', 'theory', '(dB)', '(dB)', '(dB)', '', '', '', '(dB)', '(dB)');
% narrowband focal-plane prediction: receive pattern of the active aperture at z = 30 mm
% times the transmit factor |sum_n exp(j 2 pi x sin(theta_n)/lam)| / N
uz = (xe - 0)/(30/(2*Fnum)); wz = double(abs(uz) <= 1);
if strcmp(rxApod, 'hann'), wz = wz .* (0.5 + 0.5*cos(pi*uz)); end
xn = (0:0.002:3).'; % lateral offset (mm)
rxP = abs(exp(-1i*2*pi*xn*xe/(lam*30)) * wz.') / sum(wz); % receive pattern, paraxial
for k = 1:nS
idx = subsets{k}; N = numel(idx);
sA = sum(imgA(:,idx), 2); sB = sum(imgB(:,idx), 2); sC = sum(imgC(:,idx), 2);
eL = abs(sA(inL)); pk = max(eL); prof(:,k) = 20*log10(eL/pk);
eA = abs(sA(inB))/pk; bA{k} = reshape(20*log10(eA + eps), size(XG));
% -6 dB lateral width from the fine line (linear interpolation of the crossings)
[~, i0] = max(eL); y = eL/pk;
iR = i0; while y(iR) > 0.5, iR = iR + 1; end
iLf = i0; while y(iLf) > 0.5, iLf = iLf - 1; end
xR = xl(iR-1) + (0.5 - y(iR-1))/(y(iR) - y(iR-1))*(xl(iR) - xl(iR-1));
xLf = xl(iLf+1) - (0.5 - y(iLf+1))/(y(iLf) - y(iLf+1))*(xl(iLf+1) - xl(iLf));
w6 = xR - xLf;
PSL = 20*log10(max(eA(box & ~mlobe)));
clut = 10*log10(sum(eA(box & ~mlobe).^2) / sum(eA(box & mlobe).^2));
% cyst metrics on the envelope (contrast on intensity)
eB = abs(sB(inB)); bB{k} = reshape(20*log10(eB/mean(eB(cout)) + eps), size(XG));
ei = eB(cin); eo = eB(cout);
contrast = 10*log10(mean(ei.^2)/mean(eo.^2));
CNR = abs(mean(ei) - mean(eo)) / sqrt(var(ei) + var(eo));
edges = linspace(0, max([ei; eo]), 101);
hi = histc(ei, edges)/numel(ei); ho = histc(eo, edges)/numel(eo);
gCNR = 1 - sum(min(hi, ho));
SNR0 = mean(eo)/std(eo);
snr = pk^2 / mean(abs(sC(inB)).^2);
if k == 1, snr1 = snr; end
s = sin(theta(idx)); ds = mean(diff(s));
if N > 1, step = mean(diff(theta(idx)))*180/pi; rep = lam/ds; Ftx = 1/(2*tan(max(abs(theta(idx)))));
else, step = NaN; rep = Inf; Ftx = Inf; end
% ghost: highest level of the lateral profile around +-replica (if inside the line)
ghost = NaN;
if rep < 7.5
gw = abs(abs(xl) - rep) <= 0.2 + 0.3*rep; ghost = max(prof(gw, k));
end
txP = abs(exp(1i*2*pi*xn*s/lam) * ones(N,1)) / N; % transmit factor
P2 = rxP .* txP; wTh = 2*xn(find(P2 < 0.5, 1)); % -6 dB full width (mm)
res(k,:) = [N step rep ghost Ftx w6 wTh PSL clut contrast CNR gCNR SNR0 10*log10(snr/snr1)];
fprintf('%4d %6.1f %8.2f %6.1f %7.2f %7.3f %7.3f %7.1f %8.1f %9.1f %6.2f %6.3f %5.2f %8.2f %7.2f\n', ...
res(k,:), 10*log10(N));
end
fprintf('\ntheory, narrowband, rect: -6 dB width one-way 1.207 lam F# = %.3f mm, two-way 0.886 lam F# = %.3f mm\n', ...
1.207*lam*Fnum, 0.886*lam*Fnum);
fprintf('F#tx = 1/(2 tan(theta_max)) = %.2f for +-%g deg; span needed for F#tx = F#rx = %.1f: +-%.1f deg\n', ...
1/(2*tan(thetaMax_deg*pi/180)), thetaMax_deg, Fnum, atan(1/(2*Fnum))*180/pi);
fprintf('angle-step rule (replica outside a %.1f mm wide field): d(theta) <= lambda/W = %.2f deg\n', L, lam/L*180/pi);
fprintf('Montaldo count for focused-equivalent quality N = L/(lambda F#) = %.0f (L = %.1f mm, F# %.1f)\n', ...
L/(lam*Fnum), L, Fnum);
fprintf('total runtime %.1f s\n', toc);
%% Figures
figure('Position', [50 50 1200 560]);
for k = 1:nS
subplot(2, nS, k); imagesc(xg, zg, bA{k}, [-60 0]); axis image; colormap(gray);
title(sprintf('%d angle(s): PSF, 60 dB', res(k,1))); xlabel('x (mm)'); ylabel('z (mm)');
subplot(2, nS, nS+k); imagesc(xg, zg, bB{k}, [-40 10]); axis image; colormap(gray);
title(sprintf('cyst: C %.1f dB, gCNR %.2f', res(k,10), res(k,12))); xlabel('x (mm)'); ylabel('z (mm)');
end
figure('Position', [80 80 1100 420]);
subplot(1,2,1); plot(xl, prof, 'LineWidth', 1.2); grid on; ylim([-70 5]);
xlabel('lateral position x (mm) at z = 30 mm'); ylabel('envelope (dB re peak)');
legend('1 angle', '3 angles (15 deg step)', '11 angles (3 deg step)', '31 angles (1 deg step)', 'Location', 'northeast');
title('Lateral profile: replicas at lambda/d(sin theta)');
subplot(1,2,2); Nv = res(:,1);
semilogx(Nv, res(:,14), 'o-', Nv, 10*log10(Nv), 'k--', Nv, res(:,8) - res(1,8), 's-', Nv, res(:,10) - res(1,10), 'd-', 'LineWidth', 1.2);
grid on; xlabel('number of angles N'); ylabel('dB (change re 1 angle)');
legend('SNR gain (measured)', '10 log_{10} N', 'peak sidelobe', 'cyst contrast', 'Location', 'southwest');
title('What compounding buys');
What to look for. The table of Section 23.5: SNR gain 0, 4.74, 10.35, 14.86 dB against \(10\log_{10} N\); −6 dB width 0.574 → 0.459 mm against the narrowband theory column; ghost −25.2 dB at 1.19 mm (15° step) and −52.9 dB at 5.95 mm (3° step); cyst contrast −15.8 → −37.7 dB and gCNR 0.870 → 0.995 while \(\mathrm{SNR}_0\) stays 1.80–1.85. Figure 1 shows the X-shaped edge arms of the single plane wave disappearing; Figure 2 the lateral profiles and what each N buys.
m23_angle_step_rule.mAnalytic synthesis: replica position and ghost level vs angle step, depth independence, motion loss vs angle order · change steps, N, PRF, velocity · runtime ≈ 7 s
%% m23_angle_step_rule.m -- transmit replicas, the angle-step rule, and motion between angles
% Purpose : fast analytic plane-wave synthesis (no channel data): for a point target the
% DAS value at pixel p for angle theta is
% v(p, theta) = sum_e w_e(p) g(tau_tx(p,theta) + tau_rx(p,e) - tau_tx(t,theta) - tau_rx(t,e))
% with the complex two-way pulse g(t) = exp(-t^2/(2 sig^2)) exp(j 2 pi f0 t).
% (1) Replica position and level vs angle step (11 angles): the transmit factor
% repeats every lambda/d(sin theta) laterally; we measure the broadband ghost
% and compare it with the narrowband focal-plane prediction R(x_rep).
% (2) Depth independence of the replica position (targets at 20, 30, 45 mm).
% (3) Motion: the target moves axially between firings (31 angles, 1 deg step,
% PRF 10 kHz). Loss at the true position vs the phase-ramp law
% |sin(N phi/2)/(N sin(phi/2))|, phi = 2 pi f0 (1 + cos theta) delta / c per
% firing; peak loss and lateral shift for sequential vs alternating order.
% Change : steps, N, Fnum, FBW, PRF, velocities, the firing order.
% Expect : the broadband ghost is a hump centered near lambda/d(sin theta) and smeared by
% about +-FBW/2 of that distance, at the same x for every depth. Its level is far
% below the narrowband R(x_rep), roughly R(x_rep) x 1.06 M/N: the virtual transmit
% array has broadband grating lobes like a real array (-25 dB at a 15 deg step,
% about -53 dB at 3 deg). Motion: at the true target position the loss follows the
% ramp law (lambda/4 across the sequence = 25 mm/s here: -3.9 dB). In sequential
% order the peak moves 0.12 mm laterally and drops only 2.2 dB (part of the loss
% becomes a mislocation); in alternating order it stays put and loses 4.0 dB.
% Base MATLAB only; runs in MATLAB R2019b+ and GNU Octave 8.
clear; close all; rng(1);
c = 1.540; f0 = 5; lam = c/f0; FBW = 0.6; % mm/us, MHz, mm
sig = 1/(2*pi*FBW*f0/(2*sqrt(2*log(2)))); % envelope std of the two-way pulse (us)
Nel = 128; pitch = 0.3; xe = ((0:Nel-1) - (Nel-1)/2)*pitch;
Fnum = 1.5;
g = @(t) exp(-t.^2/(2*sig^2)) .* exp(1i*2*pi*f0*t);
% geometry of a pixel set, computed once: receive times (npix x Nel) and normalized weights
geom = @(px, pz) struct('px', px, 'pz', pz, 'R', sqrt((px - xe).^2 + pz.^2)/c, ...
'W', double(abs(xe - px) <= pz/(2*Fnum)) ./ sum(abs(xe - px) <= pz/(2*Fnum), 2));
% DAS value of one angle for a target at (xt, zt): sum_e W g(tx delay difference + rx delay difference)
das = @(G, xt, zt, th) sum(G.W .* g(((G.px - xt)*sin(th) + (G.pz - zt)*cos(th))/c ...
+ G.R - sqrt((xt - xe).^2 + zt^2)/c), 2);
%% (1) Replica vs angle step, 11 angles, target at (0, 30 mm)
zt = 30;
xl = (0:0.05:12).'; dzs = -0.6:0.1:0.6; % strip of pixels (x >= 0, symmetric)
[PX, DZ] = meshgrid(xl, dzs); G1 = geom(PX(:), zt + DZ(:));
steps = [1 2 3 5 7.5 10 15]; N = 11;
% narrowband receive pattern at depth zt (paraxial), for the prediction
wz = double(abs(xe) <= zt/(2*Fnum));
Rnb = @(x) abs(exp(-1i*2*pi*x(:)*xe/(lam*zt)) * wz.') / sum(wz);
fprintf('(1) 11 angles, target at z = %g mm, Rx F# %.1f, FBW %.0f %%\n', zt, Fnum, 100*FBW);
fprintf('%6s %5s %5s %8s %9s %8s %11s %11s\n', 'step', 'N', 'span', 'x_rep', 'hump at', 'ghost', 'narrowband', '+1.06M/N');
fprintf('%6s %5s %5s %8s %9s %8s %11s %11s\n', '(deg)', '', '(deg)', '(mm)', 'x (mm)', '(dB)', 'R(x_rep)', '(dB)');
M = 0.883/FBW; % pulse length in cycles
prof = zeros(numel(xl), numel(steps));
for k = 1:numel(steps)
if (N-1)/2*steps(k) > 25, N = 2*floor(25/steps(k)) + 1; end % keep |theta| <= 25 deg
th = ((0:N-1) - (N-1)/2) * steps(k) * pi/180;
v = zeros(numel(G1.px), 1);
for a = 1:N, v = v + das(G1, 0, zt, th(a)); end
E = reshape(abs(v), size(PX)); E = max(E, [], 1).'; E = E/max(E); % max over the strip
prof(:,k) = 20*log10(E + 1e-9);
xr = lam/mean(diff(sin(th)));
win = xl > 0.6 & abs(xl - xr) <= 0.3 + 0.5*FBW*xr; % the smear spans ~ +-FBW/2 of x_rep
[gh, ig] = max(prof(win, k)); xw = xl(win);
if xr > 11.5, gh = NaN; xm = NaN; else, xm = xw(ig); end
fprintf('%6.1f %5d %5.0f %8.2f %9.2f %8.1f %11.1f %11.1f\n', steps(k), N, (N-1)*steps(k), xr, xm, gh, ...
20*log10(Rnb(xr)), 20*log10(Rnb(xr)) + 20*log10(min(1, 1.064*M/N)));
N = 11;
end
%% (2) The replica position does not depend on depth (3 deg step, 11 angles)
th = ((0:10) - 5) * 3 * pi/180; xr = lam/mean(diff(sin(th)));
fprintf('\n(2) 3 deg step: predicted x_rep = %.2f mm at every depth\n', xr);
for ztk = [20 30 45]
Gk = geom(PX(:), ztk + DZ(:)); v = zeros(numel(Gk.px), 1);
for a = 1:numel(th), v = v + das(Gk, 0, ztk, th(a)); end
E = max(reshape(abs(v), size(PX)), [], 1).'; E = E/max(E);
win = xl > 3 & xl < 9; xw = xl(win); [gh, ig] = max(E(win));
fprintf(' z = %2d mm: ghost hump peak at x = %.2f mm, level %.1f dB\n', ztk, xw(ig), 20*log10(gh));
end
%% (3) Motion between firings: 31 angles, 1 deg step, PRF 10 kHz, axial velocity v
th0 = (-15:15)*pi/180; Na = numel(th0); PRF = 10e3; % firings per second
ordA = 1:Na; % sequential: -15, -14, ..., +15
ordB = [16 reshape([15:-1:1; 17:31], 1, [])]; % alternating: 0, -1, +1, -2, +2, ...
xs = (-1:0.02:1).'; zs = zt + (-0.2:0.02:0.2);
[XS, ZS] = meshgrid(xs, zs); G3 = geom(XS(:), ZS(:)); i0 = find(abs(XS(:)) < 1e-9 & abs(ZS(:) - zt) < 1e-9);
v0 = zeros(numel(G3.px), 1);
for a = 1:Na, v0 = v0 + das(G3, 0, zt, th0(a)); end
pk0 = max(abs(v0));
vel = [5 12.4 25 37]; % mm/s
fprintf('\n(3) motion, %d angles at PRF %.0f kHz (sequence %.1f ms); loss re static peak (dB)\n', Na, PRF/1e3, Na/PRF*1e3);
fprintf('%8s %11s %11s %11s %11s %13s %12s\n', 'v', 'disp', 'ramp law', 'seq: at', 'seq: peak', 'seq: shift', 'alt: peak');
fprintf('%8s %11s %11s %11s %11s %13s %12s\n', '(mm/s)', '(lambda)', '', 'target', 'anywhere', 'x (mm)', 'anywhere');
% disp = v x sequence duration = Na*dlt (the target moves dlt between firings)
res3 = zeros(numel(vel), 5);
for j = 1:numel(vel)
dlt = vel(j)/PRF; % mm per firing (v in mm/s)
phi = 2*pi*f0*mean(1 + cos(th0))*dlt/c; % two-way phase step per firing
law = 20*log10(abs(sin(Na*phi/2)/(Na*sin(phi/2))));
vA = zeros(numel(G3.px), 1); vB = vA;
for n = 1:Na % firing n uses angle ord(n)
zn = zt + (n - (Na+1)/2)*dlt; % target position at firing n
vA = vA + das(G3, 0, zn, th0(ordA(n)));
vB = vB + das(G3, 0, zn, th0(ordB(n)));
end
[pA, iA] = max(abs(vA));
res3(j,:) = [law, 20*log10(abs(vA(i0))/pk0), 20*log10(pA/pk0), G3.px(iA), 20*log10(max(abs(vB))/pk0)];
fprintf('%8.1f %11.3f %11.2f %11.2f %11.2f %13.2f %12.2f\n', vel(j), Na*dlt/lam, res3(j,:));
end
fprintf(' sequential order: the ramp is linear in sin(theta), so it shifts the transmit factor\n');
fprintf(' laterally by 2 dlt/d(sin theta) = %.2f mm at 25 mm/s against the fixed receive factor:\n', 2*(25/PRF)/mean(diff(sin(th0))));
fprintf(' the peak moves part of the way and loses less; the alternating order cannot shift.\n');
%% Figures
figure('Position', [60 60 1150 430]);
subplot(1,2,1); plot(xl, prof(:, [1 3 5 7]), 'LineWidth', 1.1); grid on; ylim([-80 3]); xlim([0 12]);
xlabel('lateral offset x (mm)'); ylabel('max over |dz| <= 0.6 mm (dB)');
legend('1 deg step', '3 deg step', '7.5 deg step', '15 deg step', 'Location', 'northeast');
title('11 angles: transmit replica at \lambda/\Delta(sin\theta)');
dl = Na*vel/PRF/lam;
subplot(1,2,2); plot(dl, res3(:,1), 'k--', dl, res3(:,2), 'o-', dl, res3(:,3), 's-', dl, res3(:,5), 'd-', 'LineWidth', 1.2);
grid on; xlabel('axial displacement v N/PRF over the sequence (\lambda)'); ylabel('coherent loss (dB)');
legend('phase-ramp law', 'sequential: at target', 'sequential: peak', 'alternating: peak', 'Location', 'southwest');
title('motion between angles');
What to look for. Ghost humps near \(\lambda/\Delta(\sin\theta)\) (5.55 mm for a predicted 5.95 mm at 3°) at the same x for z = 20, 30, 45 mm; ghost levels against the narrowband \(R(x_{\mathrm{rep}})\) and the broadband estimate \(R(x_{\mathrm{rep}})\cdot 1.06\,M/N\) (−52.8 vs −51.5 dB at 3°, −25.3 vs −23.8 dB at 15°). Motion: at the target the loss follows the ramp law (−3.94 vs −3.92 dB at 25 mm/s); sequential order moves the peak 0.12 mm and loses 2.21 dB, alternating loses 3.97 dB.
m23_kspace_coarray.mCoarray identity, nine Tx/Rx designs (full, Hann, single, sparse, vernier, random, plane waves), random-thinning floor · change designs and depth · runtime ≈ 4 s
%% m23_kspace_coarray.m -- the coarray: two-way PSF = Fourier transform of (Tx aperture * Rx aperture)
% Purpose : narrowband focal-plane (paraxial) model at depth z. A transmit "aperture" (real
% elements, or virtual sources xi_n = z sin(theta_n) for plane waves) and a receive
% aperture give one-way factors T(x), R(x). The two-way PSF T(x)R(x) is the Fourier
% transform of the coarray: every Tx/Rx pair (xi_t, xi_r) adds a_t a_r at the
% spatial frequency kx = (xi_t + xi_r)/(lambda z). The script checks that identity,
% then compares designs with the same 64-element receive aperture: full, Hann Tx,
% one element (or one plane wave), sparse periodic, vernier (Tx every 3rd, Rx every
% 2nd), random thinning, and plane-wave compounding (3, 11, 31 angles).
% Change : z, the cases, the random thinning fraction, the plane-wave angle sets.
% Expect : identity error ~1e-13. Two-way PSL: full -26.5 dB; single element / one plane
% wave -13.3 dB (receive only); sparse every-2nd: grating lobe at
% x = lambda z/(2d) = 15.4 mm at ~0 dB; vernier 3/2: no grating lobe, PSL ~ -27 dB;
% plane waves 1 deg step: replicas at lambda/d(sin) = 17.6 mm, beyond the window.
% One plane wave or one element: coarray = receive aperture only. 31 angles at 1 deg:
% the replica at 17.9 mm survives at the receive sidelobe level there (-38 dB).
% Random thinning: mean one-way sidelobe power (N-K)/(K(N-1)) within 0.7 dB.
% Base MATLAB only; runs in MATLAB R2019b+ and GNU Octave 8.
clear; close all; rng(1);
c = 1.540; f0 = 5; lam = c/f0; % mm/us, MHz, mm
N = 64; d = 0.30; z = 30; % elements, pitch (mm), depth (mm)
xe = ((0:N-1) - (N-1)/2) * d; % element positions (mm)
x = linspace(-20, 20, 8001).'; % lateral position at depth z (mm)
FT = @(pos, w) exp(-1i*2*pi*x*pos(:).'/(lam*z)) * w(:); % one-way factor, paraxial
fprintf('N = %d, pitch %.2f mm (%.2f lambda), z = %g mm, aperture %.1f mm (F# %.2f)\n', ...
N, d, d/lam, z, N*d, z/(N*d));
%% (1) Identity: FT of the coarray equals the product of the one-way factors
at = 0.5 - 0.5*cos(2*pi*((0:N-1) + 0.5)/N); ar = ones(1, N); % Hann Tx, rect Rx
co = conv(at, ar); % coarray, lags in pitch units
pos2 = ((0:2*N-2) - (N-1)) * d; % xi_t + xi_r (mm)
lhs = FT(pos2, co); rhs = FT(xe, at) .* FT(xe, ar);
fprintf('(1) max |FT(coarray) - T R| / max|T R| = %.1e\n\n', max(abs(lhs - rhs))/max(abs(rhs)));
%% (2) Designs with the same receive aperture
th3 = (-15:15:15)*pi/180; th11 = (-15:3:15)*pi/180; th31 = (-15:1:15)*pi/180;
evr2 = mod(0:N-1, 2) == 0; evr3 = mod(0:N-1, 3) == 0;
rnd = @(K) full(sparse(1, randperm(N, K), 1, 1, N));
cases = { ...
'full Tx = Rx (focused)', xe, ones(1,N), xe, ones(1,N);
'Hann Tx, rect Rx', xe, at, xe, ones(1,N);
'one element / one plane wave', 0, 1, xe, ones(1,N);
'sparse: Tx = Rx every 2nd', xe(evr2), ones(1,sum(evr2)), xe(evr2), ones(1,sum(evr2));
'vernier: Tx every 3rd, Rx 2nd', xe(evr3), ones(1,sum(evr3)), xe(evr2), ones(1,sum(evr2));
'random 50 %, Tx ~= Rx', xe, rnd(N/2), xe, rnd(N/2);
'plane waves 3 x 15 deg', z*sin(th3), ones(1,3), xe, ones(1,N);
'plane waves 11 x 3 deg', z*sin(th11), ones(1,11), xe, ones(1,N);
'plane waves 31 x 1 deg', z*sin(th31), ones(1,31), xe, ones(1,N)};
nc = size(cases, 1); P = zeros(numel(x), nc);
fprintf('(2) %-32s %4s %4s %8s %7s %7s %8s %9s %9s\n', 'design', 'nTx', 'nRx', 'coarray', 'w-6dB', 'PSL', 'at x', 'GL/rep x', 'level');
fprintf(' %-32s %4s %4s %8s %7s %7s %8s %9s %9s\n', '', '', '', '(mm)', '(mm)', '(dB)', '(mm)', '(mm)', '(dB)');
xg = [NaN NaN NaN lam*z/(2*d) NaN NaN lam/mean(diff(sin(th3))) lam/mean(diff(sin(th11))) lam/mean(diff(sin(th31)))];
mid = (numel(x)+1)/2;
for k = 1:nc
[pt, wt, pr, wr] = cases{k, 2:5};
wt = wt(:).'; wr = wr(:).'; keepT = wt ~= 0; keepR = wr ~= 0;
pt = pt(keepT); wt = wt(keepT); pr = pr(keepR); wr = wr(keepR);
p2 = abs(FT(pt, wt) .* FT(pr, wr)); p2 = p2/p2(mid); P(:,k) = p2;
span = (max(pt) + max(pr)) - (min(pt) + min(pr)); % coarray extent (mm)
iN = mid - 1 + find(diff(p2(mid:end)) > 0, 1); % first null right of center
w6 = 2*x(mid - 1 + find(p2(mid:end) < 0.5, 1));
sl = p2; sl(2*mid - iN:iN) = 0; [pk, ipk] = max(sl);
lev = NaN; if ~isnan(xg(k)), lev = 20*log10(max(p2(abs(x - xg(k)) <= 0.5))); end
fprintf(' %-32s %4d %4d %8.1f %7.2f %7.1f %8.1f %9.2f %9.1f\n', cases{k,1}, numel(pt), numel(pr), span, w6, 20*log10(pk), abs(x(ipk)), xg(k), lev);
end
fprintf(' predicted: sparse GL at lambda z/(2d) = %.1f mm; plane-wave replicas lambda/d(sin): %.2f, %.2f, %.2f mm\n', ...
lam*z/(2*d), lam/mean(diff(sin(th3))), lam/mean(diff(sin(th11))), lam/mean(diff(sin(th31))));
%% (3) Random thinning: mean sidelobe floor vs number of active elements K
fprintf('\n(3) random thinning, one-way, 300 trials each\n%6s %12s %18s\n', 'K', 'mean SL (dB)', '(N-K)/(K(N-1))');
s = linspace(-1, 1, 4001).'; far = abs(s) > 4/N; % sin(theta), outside the main lobe
E = exp(1i*pi*s*(0:N-1)); % steering matrix, d = lambda/2
for K = [8 16 32 48]
acc = 0;
for tr = 1:300
w = rnd(K); AF = abs(E * w(:)).^2 / K^2;
acc = acc + mean(AF(far));
end
fprintf('%6d %12.2f %18.2f\n', K, 10*log10(acc/300), 10*log10((N-K)/(K*(N-1))));
end
%% Figure: coarrays and two-way PSFs
show = [1 3 4 5 8 9];
figure('Position', [40 40 1200 700]);
for j = 1:numel(show)
k = show(j); [pt, wt, pr, wr] = cases{k, 2:5};
% coarray binned on a grid of one pitch in xi_t + xi_r (virtual sources fall between)
g = -40:d:40; cg = zeros(size(g));
for a = 1:numel(pt)
if wt(a) == 0, continue; end
idx = round((pt(a) + pr - g(1))/d) + 1;
cg = cg + accumarray(idx(:), wt(a)*wr(:), [numel(g) 1]).';
end
subplot(3, 4, 2*j - 1); stem(g(cg ~= 0), cg(cg ~= 0), 'Marker', 'none'); xlim([-40 40]); grid on;
title(cases{k,1}); xlabel('\xi_t + \xi_r (mm)'); ylabel('coarray weight');
subplot(3, 4, 2*j); plot(x, 20*log10(P(:,k) + 1e-6), 'LineWidth', 1.1); ylim([-60 3]); grid on;
xlabel('x at z = 30 mm (mm)'); ylabel('two-way (dB)');
end
What to look for. Identity error \(1.9\times 10^{-15}\); the table of Section 23.4 (full −26.5 dB, single element −13.3 dB, sparse 0 dB lobe at 15.4 mm, vernier −26.5 dB, plane-wave replicas −17.8/−31.6/−37.6 dB at 1.19/5.95/17.9 mm); random thinning −9.52/−13.14/−17.79/−22.11 dB against \(\frac{N-K}{K(N-1)}\).
m23_broadband_beams.mPulsed peak and energy patterns: grating lobe ≈ 1.064 M/N, edge waves λ/(2πD|u|) · change N, FBW, pitch · runtime ≈ 3 s
%% m23_broadband_beams.m -- pulsed beams: grating-lobe level ~ M/N, far sidelobes = edge waves
% Purpose : broadband (pulsed) beam patterns of a uniform linear array, synthesized in the
% frequency domain: for each direction u = sin(theta) the received pulse is
% s(t) = IFFT{ P(f) AF(f,u)^m }, m = 1 (one-way) or 2 (two-way, Tx = Rx), with a
% Gaussian pulse spectrum P(f). From s(t) we take the peak |s| (peak-pressure
% pattern) and the energy sum |s|^2 (time-integrated pattern), and compare with:
% (1) grating-lobe peak ~ 1.064 M/N (one- and two-way) and energy ~ 1.505 M/N
% (one-way) or (2/3) 1.505 M/N = 1.003 M/N (two-way, triangular coarray), where
% M = f0 x (-6 dB pulse duration) = 0.883/FBW cycles and N = element count;
% (2) far sidelobes, peak ~ lambda/(2 pi D |u|): two separate edge waves, 6 dB
% below the CW sidelobe envelope lambda/(pi D |u|).
% Change : N, FBW, pitch (d/lambda), the Gaussian pulse model.
% Expect : grating-lobe peaks within ~0.6 dB of 20 log10(1.064 M/N) for one-way and
% two-way (N = 128, FBW 60 %: -38 dB, vs 0 dB in CW); energy within 0.2 dB of
% its law. Far sidelobes within ~1 dB of the edge-wave law.
% Base MATLAB only; runs in MATLAB R2019b+ and GNU Octave 8.
clear; close all; rng(1);
c = 1.540; f0 = 5; lam = c/f0; % mm/us, MHz, mm
fs = 40; nf = 4096; df = fs/nf; % baseband frequency grid (MHz), time window nf/fs = 102 us
fb = (-nf/2:nf/2-1).' * df; % baseband frequency f - f0 (MHz), column
% Uniform array factor in closed form (Dirichlet kernel), elements centered on 0
% psi = pi f d u / c ; AF = sin(N psi)/sin(psi)
sm = @(psi) abs(sin(psi)) < 1e-9; % psi at a multiple of pi
dirich = @(psi, N) (~sm(psi)).*sin(N*psi)./(sin(psi) + sm(psi)) + sm(psi).*N.*cos(N*psi)./cos(psi);
fprintf('Gaussian pulse: M = 0.883/FBW cycles (-6 dB duration x f0)\n\n');
%% (1) Grating-lobe level: peak and energy, one-way and two-way
d = 1.5*lam; ug = lam/d; % first grating lobe at u = 2/3 (41.8 deg) at f0
fprintf('(1) grating lobe at u = %.3f (d = 1.5 lambda), level re main lobe (dB)\n', ug);
fprintf('%5s %5s %6s %5s | %8s %8s | %8s %8s\n', 'N', 'FBW', 'M', 'way', 'peak', '1.064M/N', 'energy', 'theory');
for N = [64 128]
for FBW = [0.3 0.6 0.9]
M = 0.883/FBW;
for m = 1:2
sf = FBW*f0/(2*sqrt(2*log(2))); % std of the Gaussian amplitude spectrum
P = exp(-fb.^2/(2*sf^2));
f = f0 + fb;
S = zeros(nf, 2);
uu = [0 ug];
for j = 1:2
AF = dirich(pi*f*d*uu(j)/c, N);
S(:,j) = ifft(ifftshift(P .* AF.^m));
end
pk = max(abs(S)); en = sum(abs(S).^2);
fprintf('%5d %5.1f %6.2f %5d | %8.1f %8.1f | %8.1f %8.1f\n', N, FBW, M, m, ...
20*log10(pk(2)/pk(1)), 20*log10(1.064*M/N), 10*log10(en(2)/en(1)), 10*log10(1.505*M/N*(1 - (m == 2)/3)));
end
end
end
%% (2) Far sidelobes: edge waves (one-way, d = lambda/2, N = 128, FBW 60 %)
N = 128; d = lam/2; D = N*d; FBW = 0.6; M = 0.883/FBW;
sf = FBW*f0/(2*sqrt(2*log(2))); P = exp(-fb.^2/(2*sf^2)); f = f0 + fb;
uu = [0 0.05 0.1 0.2 0.4];
S = zeros(nf, numel(uu));
for j = 1:numel(uu), S(:,j) = ifft(ifftshift(P .* dirich(pi*f*d*uu(j)/c, N))); end
pk = max(abs(S)); pk = pk/pk(1);
fprintf('\n(2) far sidelobes, one-way, N = %d, d = lambda/2 (D = %.1f mm), FBW %.0f %%\n', N, D, 100*FBW);
fprintf(' edge waves separate in time when |u| > M lambda/D = %.3f\n', M*lam/D);
fprintf('%7s %10s %14s %14s\n', 'u', 'peak (dB)', 'edge 1/(2x)', 'CW env 1/x');
for j = 2:numel(uu)
x = pi*D*uu(j)/lam;
fprintf('%7.2f %10.1f %14.1f %14.1f\n', uu(j), 20*log10(pk(j)), 20*log10(1/(2*x)), 20*log10(1/x));
end
%% (3) Patterns for the figure: N = 64, d = 1.5 lambda, FBW 60 %
N = 64; d = 1.5*lam; D = N*d; FBW = 0.6; M = 0.883/FBW;
sf = FBW*f0/(2*sqrt(2*log(2))); P = exp(-fb.^2/(2*sf^2)); f = f0 + fb;
u = linspace(0, 1, 501);
pat = zeros(numel(u), 3, 2); % [CW, peak, energy] x [one-way, two-way]
for m = 1:2
for blk = 0:4
jj = blk*101 + (1:101); jj = jj(jj <= numel(u));
AF = dirich(pi*f*d*u(jj)/c, N); % nf x numel(jj)
S = ifft(ifftshift(P .* AF.^m, 1), [], 1);
pat(jj, 2, m) = max(abs(S)).';
pat(jj, 3, m) = sqrt(sum(abs(S).^2)).';
pat(jj, 1, m) = abs(dirich(pi*f0*d*u(jj)/c, N)).'.^m;
end
for q = 1:3, pat(:,q,m) = pat(:,q,m)/pat(1,q,m); end
end
lab = {'one-way', 'two-way'};
figure('Position', [60 60 1150 440]);
for m = 1:2
subplot(1,2,m);
plot(u, 20*log10(pat(:,1,m) + 1e-9), 'Color', [0.6 0.6 0.6]); hold on;
plot(u, 20*log10(pat(:,2,m) + 1e-9), 'LineWidth', 1.4);
plot(u, 20*log10(pat(:,3,m) + 1e-9), '--', 'LineWidth', 1.2);
plot(lam/d + [-0.06 0.06], [1 1]*20*log10(1.064*M/N), 'k-', 'LineWidth', 2);
if m == 1, ue = u(u > 0.03); plot(ue, 20*log10(lam./(2*pi*D*ue)), 'k:', 'LineWidth', 1.2); end
grid on; ylim([-80 3]); xlabel('u = sin \theta'); ylabel('dB re main lobe');
title(sprintf('%s, N = %d, d = 1.5\\lambda, FBW %.0f %%', lab{m}, N, 100*FBW));
if m == 1, legend('CW (f_0)', 'pulsed: peak', 'pulsed: energy (rms)', '1.064 M/N', 'edge waves \lambda/(2\piDu)', 'Location', 'northeast');
else, legend('CW (f_0)', 'pulsed: peak', 'pulsed: energy (rms)', '1.064 M/N', 'Location', 'northeast'); end
end
What to look for. Grating-lobe peaks on the \(1.064\,M/N\) law for one- and two-way (−38.2 dB at N = 128, 60 %), energies on \(1.505\,M/N\) and \(1.003\,M/N\); far sidelobes −25.4/−31.4/−37.3/−42.9 dB against the edge-wave law −26.1/−32.1/−38.1/−44.1 dB. In the figure, the pulsed peak curve hugs the edge-wave line at small u and rises to a broad hump at the grating lobe.
m23_fresnel_focal_plane.mDirect point-source sum: near-field length, focal plane vs Fourier transform, focal shift and DOF vs Fresnel number · change f0, D, F, apodization · runtime ≈ 6 s
%% m23_fresnel_focal_plane.m -- Fresnel vs Fraunhofer: why the focus is a Fourier plane
% Purpose : CW field of a 1D aperture (a line of point sources, 1/r spreading, 3D Green's
% function), computed by direct summation without the paraxial approximation.
% (1) Unfocused: on-axis intensity and its last maximum vs D^2/(4 lambda).
% (2) Focused at F: lateral profile at z = F vs the Fourier transform of the
% apodization (rect -> sinc, Hann), -6 dB width and first sidelobe.
% (3) Focal shift and depth of field vs Fresnel number N_F = D^2/(4 lambda F):
% the intensity peak moves toward the array and the -3 dB depth of field
% departs from 6.95 lambda F#^2 when N_F is small.
% Change : f0, D, F, apodization ('rect' or 'hann').
% Expect : last axial maximum at ~1.0 D^2/(4 lambda) = 299 mm (D = 19.2 mm, 5 MHz).
% At F = 30 mm (F# 1.56, N_F = 10) the direct field is 3 % wider than the paraxial
% Fourier prediction and its first sidelobe is -12.7 instead of -13.3 dB (rect):
% the residual is the non-paraxial error, and it shrinks at F = 60 mm (F# 3.1).
% Peak/F = 0.99 at N_F = 10, 0.96 at N_F = 5, ~0.90 at N_F = 3, 0.6 at N_F = 1.
% Base MATLAB only; runs in MATLAB R2019b+ and GNU Octave 8.
clear; close all; rng(1);
%% Parameters
c = 1.540; % mm/us
f0 = 5; % MHz
lam = c/f0; % mm
k = 2*pi/lam; % rad/mm
D = 19.2; % aperture length (mm) = 64 elements x 0.3 mm
F = 30; % focal depth (mm)
apod = 'rect'; % 'rect' or 'hann'
nSrc = 400; % point sources across the aperture (spacing 0.048 mm < lambda/6)
xi = linspace(-D/2, D/2, nSrc); % source positions (mm), row
u = 2*xi/D;
if strcmp(apod, 'hann'), a = 0.5 + 0.5*cos(pi*u); else, a = ones(size(u)); end
field = @(x, z, foc) sum( (ones(numel(x),1)*a) .* exp(-1i*k*(sqrt((x(:)-xi).^2 + z^2) - foc)) ...
./ sqrt((x(:)-xi).^2 + z^2), 2); % complex CW field on a lateral line
focLaw = @(Fz) sqrt(xi.^2 + Fz^2) - Fz; % focusing path correction (mm)
%% (1) Unfocused on-axis intensity
zAx = linspace(2, 600, 3000);
I0 = zeros(size(zAx));
for iz = 1:numel(zAx), I0(iz) = abs(field(0, zAx(iz), 0*xi))^2; end
isMax = [false, I0(2:end-1) > I0(1:end-2) & I0(2:end-1) > I0(3:end), false];
zLast = max(zAx(isMax));
fprintf('(1) unfocused: last axial maximum %.0f mm; D^2/(4 lam) = %.0f mm (ratio %.2f)\n', ...
zLast, D^2/(4*lam), zLast/(D^2/(4*lam)));
fprintf(' Fraunhofer distances: D^2/lam = %.0f mm (edge phase pi/4), 2D^2/lam = %.0f mm (pi/8)\n', ...
D^2/lam, 2*D^2/lam);
%% (2) Focal-plane lateral profile vs Fourier transform of the apodization
x = linspace(-8, 8, 8001); mid = (numel(x)+1)/2;
w6 = @(p) 2*x(find(p >= 0.5, 1, 'last')); % symmetric profile, full width
for Fz = [F 2*F]
p = abs(field(x, Fz, focLaw(Fz))); p = p/max(p);
% Fourier prediction: A(x/(lam Fz)) for the same apodization (paraxial)
Af = abs(exp(-1i*2*pi*(x(:)/(lam*Fz))*xi) * a.'); Af = Af/max(Af);
iN = mid - 1 + find(diff(p(mid:end)) > 0, 1); % first minimum right of center
iA = mid - 1 + find(diff(Af(mid:end)) > 0, 1);
fprintf('(2) focused at F = %g mm (F# = %.2f, N_F = %.1f), %s apodization:\n', Fz, Fz/D, D^2/(4*lam*Fz), apod);
fprintf(' -6 dB width: field %.3f mm, Fourier %.3f mm (ratio %.3f); 1.207 lam F# = %.3f mm\n', ...
w6(p), w6(Af), w6(p)/w6(Af), 1.207*lam*Fz/D);
fprintf(' first sidelobe: field %.2f dB, Fourier %.2f dB\n', 20*log10(max(p(iN:end))), 20*log10(max(Af(iA:end))));
if Fz == F, pF = p; A = Af; xF = x; end
end
x = xF;
%% (3) Focal shift and depth of field vs Fresnel number
Fs = [20 30 40 60 80 100 150 200 300];
fprintf('(3) %6s %6s %6s %8s %10s %12s\n', 'F(mm)', 'F#', 'N_F', 'peak/F', 'DOF(mm)', '6.95lamF#^2');
tab = zeros(numel(Fs), 4);
for j = 1:numel(Fs)
Fz = Fs(j); zz = linspace(0.35*Fz, 2.5*Fz, 2500); Iz = zeros(size(zz)); % start past the 1/r near-field rise
fl = focLaw(Fz);
for iz = 1:numel(zz), Iz(iz) = abs(field(0, zz(iz), fl))^2; end
[Im, ip] = max(Iz); lo = ip; hi = ip;
while lo > 1 && Iz(lo) >= Im/2, lo = lo - 1; end
while hi < numel(zz) && Iz(hi) >= Im/2, hi = hi + 1; end
NF = D^2/(4*lam*Fz); dof = zz(hi) - zz(lo);
tab(j,:) = [NF, zz(ip)/Fz, dof, 6.95*lam*(Fz/D)^2];
fprintf(' %6g %6.2f %6.2f %8.3f %10.1f %12.1f\n', Fz, Fz/D, NF, zz(ip)/Fz, dof, 6.95*lam*(Fz/D)^2);
end
%% Field maps (unfocused and focused at F) and profiles
xm = linspace(-8, 8, 161); zm = linspace(2, 80, 196);
M0 = zeros(numel(zm), numel(xm)); M1 = M0;
for iz = 1:numel(zm)
M0(iz,:) = abs(field(xm, zm(iz), 0*xi)).';
M1(iz,:) = abs(field(xm, zm(iz), focLaw(F))).';
end
figure('Position', [40 40 1150 760]);
subplot(2,3,1); imagesc(xm, zm, 20*log10(M0/max(M0(:))), [-40 0]); colormap(gray); colorbar;
title('unfocused CW field (dB)'); xlabel('x (mm)'); ylabel('z (mm)');
subplot(2,3,2); imagesc(xm, zm, 20*log10(M1/max(M1(:))), [-40 0]); colorbar;
title(sprintf('focused at %g mm (dB)', F)); xlabel('x (mm)'); ylabel('z (mm)');
IdB = 10*log10(I0/interp1(zAx, I0, zLast)); % dB re the last axial maximum
subplot(2,3,3); plot(zAx, IdB, 'LineWidth', 1.2); hold on; xlim([20 600]); ylim([-12 8]);
plot([1 1]*D^2/(4*lam), [-12 8], 'k--'); grid on; xlabel('z (mm)'); ylabel('on-axis intensity (dB re last max)');
title('unfocused: last maximum near D^2/(4\lambda)');
subplot(2,3,4); plot(x, 20*log10(pF + 1e-6), x, 20*log10(A + 1e-6), '--', 'LineWidth', 1.2); grid on;
xlim([-4 4]); ylim([-50 3]); xlabel('x (mm) at z = F'); ylabel('dB'); legend('direct field', 'FT of apodization');
title('focal plane = Fourier plane');
subplot(2,3,5); semilogx(tab(:,1), tab(:,2), 'o-', 'LineWidth', 1.2); grid on;
xlabel('Fresnel number N_F = D^2/(4\lambda F)'); ylabel('intensity peak / F'); title('focal shift');
subplot(2,3,6); semilogx(tab(:,1), tab(:,3)./tab(:,4), 's-', 'LineWidth', 1.2); grid on;
xlabel('Fresnel number N_F'); ylabel('DOF / (6.95 \lambda F#^2)'); title('depth-of-field rule vs N_F');
What to look for. Last axial maximum 297 mm vs \(D^2/(4\lambda)\) = 299 mm; at F = 30 mm a −6 dB width 3.5 % above the Fourier prediction and a −12.7 dB first sidelobe, at 60 mm 1 % and −13.1 dB; the focal-shift table of Section 23.1 (0.988F at \(N_F = 10\), 0.605F at \(N_F = 1\)). Set apod = 'hann' to see −28.8 dB against −31.5 dB.
m23_planewave_gratinglobe.mPlane-wave Tx-only, Rx-only and two-way lateral PSFs vs angle count and span, and the steered-wave transmit grating lobe in 2D, from the summed element field · change f0, pitch, steering, depth · runtime ≈ 8 s
%% m23_planewave_gratinglobe.m
% Plane-wave imaging: transmit vs receive beams, lateral resolution vs angle
% span, and the grating lobe of a steered plane wave.
%
% Method (base MATLAB, no toolboxes): 128 point elements, Gaussian-envelope
% pulse (60 % band). For each plane wave the transmitted field at the target,
% h(t) = sum_e E_e * p(t - t_e - r_e/c), is synthesized on a fine time grid
% (it contains the grating-lobe wave when the pitch is too coarse). DAS of
% the analytic signal then gives, for a pixel P,
% two-way(P) = sum_angles sum_rx w_r h(tau_tx(P) + [|r-P| - |r-T|]/c)
% Tx-only(P) = sum_angles h(tau_tx(P)) (ideal receiver at T)
% Rx-only(P) = sum_rx w_r p([|r-P| - |r-T|]/c) (ideal impulse at T)
% Dynamic receive aperture F# 1.5, rect, element factor sinc(w sin(theta)/lambda)
% of a 0.9d strip on transmit and receive.
%
% What to change: f0, pitch d, angle sets, target depth zt, FBW, Fnum.
% Expected output (Octave 8):
% Part 1 (5 MHz, 0.3 mm, +-15 deg, z 30 mm): two-way -6 dB width 0.611 mm
% for one angle (Rx-only 0.587 mm), 0.420/0.479/0.490 mm for 3/11/31 angles;
% narrowband prediction kappa*lambda/(sin(theta_max) + 1/(2F#)) = 0.456 mm.
% Part 3 streaks (1 angle / 11 angles): -30.2/-42.9 (5 MHz, 0.15 mm, z 15),
% -24.3/-36.0 (5 MHz, 0.3 mm, z 15), -27.2/-35.2 (7.5 MHz, 0 deg, z 30),
% -22.6/-35.2 dB (7.5 MHz, 15 deg, z 30).
% Part 2: width vs span (1 deg steps) against the same formula.
% Part 3: steered-PW grating-lobe angle, the pitch threshold
% lambda/(1+|sin theta|), and the level of the grating-lobe streak.
% Runtime about 10 s in Octave.
clear; close all; rng(1);
c = 1.54; % sound speed, mm/us
Nel = 128; % elements
FBW = 0.60; % -6 dB fractional bandwidth of the pulse-echo pulse
Fnum = 1.5; % receive F-number
sincf = @(x) (sin(pi*x) + (x == 0)) ./ (pi*x + (x == 0));
% kappa(rho): -6 dB width factor of sinc(2 a x) .* sinc(2 b x), computed numerically
xk = linspace(0, 6, 60001);
% lin: linear interpolation of h on its uniform grid, zero outside (q = fractional index from 0)
lin = @(h, q, L) (h(min(max(floor(q), 0), L - 2) + 1) .* (1 - (q - min(max(floor(q), 0), L - 2))) + ...
h(min(max(floor(q), 0), L - 2) + 2) .* (q - min(max(floor(q), 0), L - 2))) .* (q >= 0 & q <= L - 1);
w6 = @(y) 2*interp1(y(find(y < 0.5, 1) - [1 0]), xk(find(y < 0.5, 1) - [1 0]), 0.5);
%% Part 1: lateral PSF at the target depth, N angles over +-15 deg
f0 = 5; d = 0.30; zt = 30; lam = c/f0;
xs = -10:0.02:10; zs = zt*ones(size(xs));
sets = {0, linspace(-15, 15, 3), linspace(-15, 15, 11), linspace(-15, 15, 31)};
fprintf('Part 1: 5 MHz, d = %.2f mm (%.2f lambda), z = %d mm, F# %.1f\n', d, d/lam, zt, Fnum);
fprintf(' N Tx-only -6dB Rx-only -6dB two-way -6dB (mm)\n');
prof = cell(1, 4);
for is = 1:numel(sets)
ang = sets{is};
% ---------- synthesis (same block is reused below) ----------
xe = ((0:Nel-1) - (Nel-1)/2) * d; we = 0.9*d;
sg = 2*sqrt(2*log(2)) / (2*pi*FBW*f0); dt = 1/(20*f0);
rT = sqrt(xe.^2 + zt^2); ET = sincf(we*(xe./rT)/lam);
Tx = zeros(size(xs)); TW = zeros(size(xs));
for a = ang
s = sind(a); co = cosd(a);
te = xe*s/c + rT/c; amp = ET .* sqrt(zt./rT);
tg = (min(te) - 5*sg):dt:(max(te) + 5*sg); h = zeros(size(tg));
for e = 1:Nel
tt = tg - te(e); m = abs(tt) < 5*sg;
h(m) = h(m) + amp(e) * exp(-tt(m).^2/(2*sg^2)) .* exp(2i*pi*f0*tt(m));
end
L = numel(tg); hi = @(t) lin(h, (t - tg(1))/dt, L);
tau = (xs*s + zs*co)/c;
Tx = Tx + hi(tau);
for r = 1:Nel
msk = abs(xe(r) - xs) <= zs/(2*Fnum);
if ~any(msk), continue; end
B = (sqrt((xs(msk) - xe(r)).^2 + zs(msk).^2) - rT(r))/c;
TW(msk) = TW(msk) + ET(r) * hi(tau(msk) + B);
end
end
RX = zeros(size(xs));
for r = 1:Nel
msk = abs(xe(r) - xs) <= zs/(2*Fnum);
B = (sqrt((xs(msk) - xe(r)).^2 + zs(msk).^2) - rT(r))/c;
RX(msk) = RX(msk) + ET(r) * exp(-B.^2/(2*sg^2)) .* exp(2i*pi*f0*B);
end
% ------------------------------------------------------------
A = {abs(Tx)/max(abs(Tx)), abs(RX)/max(abs(RX)), abs(TW)/max(abs(TW))}; wd = zeros(1, 3);
for k = 1:3
y = A{k}; i0 = find(xs >= 0, 1); ir = i0 + find(y(i0:end) < 0.5, 1) - 1; il = i0 - find(y(i0:-1:1) < 0.5, 1) + 1;
if isempty(ir) || isempty(il), wd(k) = Inf; continue; end
xr = interp1(y([ir-1 ir]), xs([ir-1 ir]), 0.5); xl = interp1(y([il+1 il]), xs([il+1 il]), 0.5); wd(k) = xr - xl;
end
prof{is} = A;
fprintf(' %2d %8.3f %8.3f %8.3f\n', numel(ang), wd(1), wd(2), wd(3));
end
srx = 1/(2*Fnum); stx = sind(15);
y = abs(sincf(2*srx*xk) .* sincf(2*stx*xk)); wn = w6(y)*lam;
fprintf(' narrowband prediction, continuous +-15 deg: %.3f mm (kappa = %.3f); receive-only 1.207 lambda F# = %.3f mm\n', ...
wn, wn/lam*(stx + srx), 1.207*lam*Fnum);
%% Part 2: width vs angular span (1 deg steps), against kappa*lambda/(sin(theta_max) + 1/(2F#))
fprintf('Part 2: two-way -6 dB width vs half-span (1 deg steps)\n half-span N sim (mm) formula (mm) kappa\n');
for hs = [5 10 15 20]
ang = -hs:1:hs;
xe = ((0:Nel-1) - (Nel-1)/2) * d; we = 0.9*d; sg = 2*sqrt(2*log(2)) / (2*pi*FBW*f0); dt = 1/(20*f0);
rT = sqrt(xe.^2 + zt^2); ET = sincf(we*(xe./rT)/lam); xs2 = -2:0.01:2; zs2 = zt*ones(size(xs2)); TW = zeros(size(xs2));
for a = ang
s = sind(a); co = cosd(a); te = xe*s/c + rT/c; amp = ET .* sqrt(zt./rT);
tg = (min(te) - 5*sg):dt:(max(te) + 5*sg); h = zeros(size(tg));
for e = 1:Nel, tt = tg - te(e); m = abs(tt) < 5*sg; h(m) = h(m) + amp(e)*exp(-tt(m).^2/(2*sg^2)).*exp(2i*pi*f0*tt(m)); end
L = numel(tg); hi = @(t) lin(h, (t - tg(1))/dt, L);
tau = (xs2*s + zs2*co)/c;
for r = 1:Nel
msk = abs(xe(r) - xs2) <= zs2/(2*Fnum); if ~any(msk), continue; end
B = (sqrt((xs2(msk) - xe(r)).^2 + zs2(msk).^2) - rT(r))/c; TW(msk) = TW(msk) + ET(r)*hi(tau(msk) + B);
end
end
y2 = abs(TW)/max(abs(TW)); i0 = find(xs2 >= 0, 1); ir = i0 + find(y2(i0:end) < 0.5, 1) - 1; il = i0 - find(y2(i0:-1:1) < 0.5, 1) + 1;
wsim = interp1(y2([ir-1 ir]), xs2([ir-1 ir]), 0.5) - interp1(y2([il+1 il]), xs2([il+1 il]), 0.5);
stx = sind(hs); y = abs(sincf(2*srx*xk) .* sincf(2*stx*xk)); wf = w6(y)*lam;
fprintf(' +-%2d deg %2d %6.3f %6.3f %5.3f\n', hs, numel(ang), wsim, wf, wf/lam*(stx + srx));
end
%% Part 3: grating lobe of a steered plane wave, and its streak in the image
cases = [5 0.15 15 15; 5 0.30 15 15; 7.5 0.30 0 30; 7.5 0.30 15 30]; % f0 (MHz), d (mm), theta_tx (deg), zt (mm)
fprintf('Part 3: steered plane-wave grating lobe (single angle, then 11 angles over +-15 deg)\n');
fprintf(' f0 d/lam th_tx d_max/lam th_g Delta (mm) streak 1 angle 11 angles (dB)\n');
img = cell(1, size(cases, 1));
for ic = 1:size(cases, 1)
f0 = cases(ic, 1); d = cases(ic, 2); th = cases(ic, 3); zt = cases(ic, 4); lam = c/f0;
sgl = sind(th) - lam/d; if th == 0, sgl = -lam/d; end
if abs(sgl) <= 1, thg = asind(sgl); Dl = zt*(1 - cosd(th - thg))/cosd(thg); else thg = NaN; Dl = NaN; end
[X, Z] = meshgrid(-10:0.15:10, (zt - 3):0.1:(zt + 9));
lev = zeros(1, 2);
for pass = 1:2
if pass == 1, ang = th; else ang = linspace(-15, 15, 11); end
xe = ((0:Nel-1) - (Nel-1)/2) * d; we = 0.9*d; sg = 2*sqrt(2*log(2)) / (2*pi*FBW*f0); dt = 1/(20*f0);
rT = sqrt(xe.^2 + zt^2); ET = sincf(we*(xe./rT)/lam); TW = zeros(size(X));
for a = ang
s = sind(a); co = cosd(a); te = xe*s/c + rT/c; amp = ET .* sqrt(zt./rT);
tg = (min(te) - 5*sg):dt:(max(te) + 5*sg); h = zeros(size(tg));
for e = 1:Nel, tt = tg - te(e); m = abs(tt) < 5*sg; h(m) = h(m) + amp(e)*exp(-tt(m).^2/(2*sg^2)).*exp(2i*pi*f0*tt(m)); end
tau = (X*s + Z*co)/c; L = numel(tg); hc = h(:);
for r = 1:Nel
msk = abs(xe(r) - X) <= Z/(2*Fnum); if ~any(msk(:)), continue; end
tq = tau(msk) + (sqrt((X(msk) - xe(r)).^2 + Z(msk).^2) - rT(r))/c;
q = (tq - tg(1))/dt; k = floor(q); fr = q - k; ok = (k >= 0) & (k < L - 1); k(~ok) = 0;
TW(msk) = TW(msk) + ET(r)*((hc(k + 1).*(1 - fr) + hc(k + 2).*fr).*ok);
end
end
Aimg = abs(TW)/max(abs(TW(:)));
lev(pass) = 20*log10(max(Aimg(Z > zt + 1))); % strongest response more than 1 mm below the target
if pass == 1, img{ic} = 20*log10(Aimg + 1e-6); end
end
fprintf(' %4.1f %4.2f %3d %5.3f %6.1f %6.2f %6.1f %6.1f\n', f0, d/lam, th, 1/(1 + abs(sind(th))), thg, Dl, lev(1), lev(2));
end
%% Figures
figure(1);
nm = {'Tx-only', 'Rx-only', 'two-way'};
for k = 1:3
subplot(3, 1, k);
plot(xs, 20*log10(prof{1}{k} + 1e-6), 'k--', xs, 20*log10(prof{3}{k} + 1e-6), 'b-');
axis([-10 10 -60 3]); grid on; ylabel('dB');
title([nm{k} ' lateral pattern at z = 30 mm: 1 angle (dashed), 11 angles over +-15 deg']);
end
xlabel('x (mm)');
figure(2);
tl = {'5 MHz, d 0.15 mm (0.49\lambda), 15 deg, z 15 mm', '5 MHz, d 0.30 mm (0.97\lambda), 15 deg, z 15 mm', ...
'7.5 MHz, d 0.30 mm (1.46\lambda), 0 deg, z 30 mm', '7.5 MHz, d 0.30 mm (1.46\lambda), 15 deg, z 30 mm'};
for ic = 1:4
subplot(2, 2, ic); zt = cases(ic, 4);
imagesc(-10:0.15:10, (zt - 3):0.1:(zt + 9), img{ic}, [-60 0]); axis image; colormap(gray); colorbar;
xlabel('x (mm)'); ylabel('z (mm)'); title(tl{ic});
end
What to look for. Part 1 (5 MHz, 0.3 mm, ±15°, z 30 mm): Tx-only width infinite (flat) for one angle, 0.518/0.680/0.722 mm for 3/11/31 angles (0.722 against the flat-support 0.718); Rx-only 0.587 mm; two-way 0.611 → 0.420/0.479/0.490 mm against the formula 0.456 mm (κ = 0.877). Part 2: two-way widths 0.593/0.549/0.490/0.432 mm for ±5/10/15/20° against 0.544/0.507/0.456/0.404 mm. Part 3: thresholds 0.794λ at 15°; grating-lobe waves at −50.2° (5 MHz) and −25.2° (7.5 MHz), −43.2° unsteered; streak levels −30.2 (λ/2 pitch, no lobe), −24.3, −27.2, −22.6 dB for one angle and −42.9, −36.0, −35.2, −35.2 dB for 11 angles. Figure 2 shows the streak under the target.
23.13Self-check
Q1A 38.4 mm aperture at 5 MHz: what are the near-field length and the antenna far-field distance? Is unfocused imaging at 40 mm "far field"?
λ = 0.308 mm. \(D^2/(4\lambda)\) = 1.20 m; \(2D^2/\lambda\) = 9.57 m (\(D^2/\lambda\) = 4.79 m). At 40 mm the aperture is deep in its near field: \(N_F = D^2/(4\lambda z) = 30\). A plane wave's transmit profile there is the footprint, not a beam.
Q2A 2.5 MHz phased array with D = 20 mm is focused at 100 mm. Where is the intensity peak, roughly?
λ = 0.616 mm, \(N_F = 400/(4 \times 0.616 \times 100) = 1.62\). From the table, peak/F is 0.735 at \(N_F = 1.5\) and 0.815 at 2.0, so about 0.75F ≈ 75 mm, with a depth of field well below \(7\lambda F_\#^2\).
Q3You switch receive apodization from rect to Hann on an SNR-limited deep scan. What do you gain and lose?
Gain: one-way PSL −13.3 → −31.5 dB, ISLR −9.7 → −32.9 dB on the receive factor, so less clutter in cysts. Lose: −1.76 dB SNR against channel noise and a 1.66× wider receive main lobe (1.21 → 2.00 λ/D at −6 dB). If the image is noise-limited rather than clutter-limited, the trade is negative.
Q4192 elements, 7.5 MHz, 70 % bandwidth. Estimate the peak level of a grating lobe in the two-way image.
\(M = 0.883/0.70 = 1.26\) cycles. Peak \(\approx 1.064\,M/N = 1.064 \times 1.26/192 = 0.0070\), i.e. −43.1 dB relative to the main lobe (array factor only; the element factor lowers it further).
Q521 plane waves over ±10° at 5 MHz. What are the transmit F#, the replica distance and the SNR gain?
\(F_{\#,\mathrm{tx}} = 1/(2\tan 10^\circ) = 2.84\). Step 1°, \(\Delta(\sin\theta) = 2\sin 10^\circ/20 = 0.0174\), \(x_{\mathrm{rep}} = 0.308/0.0174\) = 17.7 mm. SNR gain \(10\log_{10} 21\) = 13.2 dB. With \(F_{\#,\mathrm{rx}} = 1.5\) the lateral width sits closer to receive-only than with ±15°.
Q6Imaging to 50 mm with 15 angles: maximum compounded frame rate?
\(\mathrm{PRF} \le c/(2z_{\max}) = 1540/(2 \times 0.05)\) = 15.4 kHz; \(f_{\text{frame}}\) = 15.4 kHz/15 = 1.03 kHz, before any reverberation margin.
Q7Why does a vernier pair (Tx every 3rd, Rx every 2nd element) have no two-way grating lobe although both one-way patterns do?
Its coarray has no periodic gaps: sums of multiples of 3d and 2d reach every lag except the one next to each end (Figure 23.B), and two isolated holes make no grating lobe. In the pattern picture, the transmit grating lobes (period \(\lambda z/(3d)\)) land near receive nulls, where the receive pattern is low, and the receive lobes (\(\lambda z/(2d)\)) near transmit nulls. The narrowband two-way PSL is −26.5 dB, the same as the full aperture, with 22 + 32 elements.
Q8Up to what steering angle is a 0.25 mm pitch free of transmit grating lobes at 5 MHz and at 7.5 MHz?
\(d/\lambda\) = 0.25/0.308 = 0.812 and 0.25/0.205 = 1.218. From \(\sin\theta_{\max} < \lambda/d - 1\): 0.232 → 13.4° at 5 MHz; at 7.5 MHz \(\lambda/d - 1 = -0.18 < 0\), so a lobe is visible even unsteered (at \(\pm\)55.2°).
Q9Plane waves over ±10° with receive F# 2 at 5 MHz: estimate the lateral −6 dB width, and the width with a single plane wave.
\(\sin 10^\circ = 0.174\), \(1/(2F_\#) = 0.25\), ratio 0.69, so κ ≈ 0.87 (numerically 0.867): \(w \approx 0.867 \times 0.308/0.424\) = 0.63 mm. One plane wave: \(1.207\lambda F_\#\) = 0.74 mm.
23.14Figures from the literature
Measured data to hold the models of this page against. Links only, no images reproduced; each figure number was checked against the published or author-posted text.
One plane wave versus 75, on the same array this page simulates
H. Liebgott, A. Rodriguez-Molares, F. Cervenansky, J. A. Jensen, O. Bernard, "Plane-wave imaging challenge in medical ultrasound," Proc. IEEE Int. Ultrasonics Symp. (IUS), 2016. Figs. 2 and 3, Table 1. doi:10.1109/ULTSYM.2016.7728908 (open copy: DTU Orbit)
PICMUS: 128 elements, 0.3 mm pitch, 0.27 mm elements, 5.2 MHz, 67 % band (Table 1), the parameters of Demo 23.7 and m23_planewave_compounding.m. Panels (b) and (d) of each figure are measured on a CIRS 040GSE phantom: wire targets and anechoic cysts with a single 0° plane wave (Fig. 2) and with 75 plane waves (Fig. 3). Look for the X-shaped arms around each wire and the filled-in cysts at one angle, and how both clean up with compounding, the receive-only to synthesized-transmit transition of Section 23.5.
F-number from element directivity, tested on phantom and carotid data
V. Perrot, M. Polichetti, F. Varray, D. Garcia, "So you think you can DAS? A viewpoint on delay-and-sum beamforming," Ultrasonics 111, 106309, 2021. Figs. 4, 5, 8 and 11. doi:10.1016/j.ultras.2020.106309 (open copy: arXiv:2007.11960)
Fig. 4 is the element directivity against element width over wavelength and Fig. 5 turns it into an F-number, the construction behind (19.2) in Module 19. Fig. 8 measures CNR and lateral resolution on the PICMUS phantom data as functions of the F-number and the assumed sound speed, with the 75-wave and single-wave references; Fig. 11 compares F# 1.4 with the full aperture in a carotid. Check where the measured optimum falls against the 0.5–0.7 predicted here for a 0.27 mm element at 5 MHz.
Synthetic aperture: measured angular resolution versus number of emissions
J. A. Jensen, S. I. Nikolov, K. L. Gammelmark, M. H. Pedersen, "Synthetic aperture ultrasound imaging," Ultrasonics 44, e5–e15, 2006. Fig. 2 and Fig. 14. doi:10.1016/j.ultras.2006.07.017 (author copy: DTU)
Fig. 2 shows the measured angular resolution of a synthetic-aperture system (64 channels, 5 MHz linear array) for 2 to 64 emissions, with boxcar and Hanning receive apodization: the coarray filling up emission by emission, Section 23.4 in hardware. Fig. 14 compares conventional and synthetic transmit aperture images of liver and kidney in vivo.
Contrast, CNR and gCNR measured across beamformers
A. Rodriguez-Molares, O. M. H. Rindal, J. D'hooge, S.-E. Måsøy, A. Austeng, M. A. Lediju Bell, H. Torp, "The generalized contrast-to-noise ratio: a formal definition for lesion detectability," IEEE Trans. Ultrason. Ferroelectr. Freq. Control 67(4), 745–759, 2020. Figs. 8 and 9. doi:10.1109/TUFFC.2019.2956855 (open copy: DUO)
Fig. 8 (CIRS phantom, synthetic transmit aperture) and Fig. 9 (carotid in vivo, focused) compare contrast, CNR and gCNR for DAS and six adaptive beamformers. The point for this module: contrast and CNR move with dynamic-range manipulation while gCNR does not, which is why the compounding table of 23.5 reports gCNR next to the 1D sidelobe numbers.
23.15Go deeper
- G. Montaldo, M. Tanter, J. Bercoff, N. Benech, M. Fink, "Coherent plane-wave compounding for very high frame rate ultrasonography and transient elastography," IEEE TUFFC 56(3), 489–506, 2009. doi:10.1109/TUFFC.2009.1067. The synthetic transmit focus and the angle count.
- W. F. Walker, G. E. Trahey, "The application of k-space in pulse echo ultrasound," IEEE TUFFC 45(3), 541–558, 1998. doi:10.1109/58.677599. Pulse-echo k-space and the coarray view of transmit/receive schemes.
- G. R. Lockwood, P.-C. Li, M. O'Donnell, F. S. Foster, "Optimizing the radiation pattern of sparse periodic linear arrays," IEEE TUFFC 43(1), 7–14, 1996. doi:10.1109/58.484457. Vernier arrays.
- C. Papadacci, M. Pernot, M. Couade, M. Fink, M. Tanter, "High-contrast ultrafast imaging of the heart," IEEE TUFFC 61(2), 288–301, 2014. doi:10.1109/TUFFC.2014.6722614. Diverging-wave compounding.
- V. Perrot, M. Polichetti, F. Varray, D. Garcia, "So you think you can DAS? A viewpoint on delay-and-sum beamforming," Ultrasonics 111, 106309, 2021. F-number, apodization and implementation choices.
- D. Garcia, L. Le Tarnec, S. Muth, E. Montagnon, J. Porée, G. Cloutier, "Stolt's f-k migration for plane wave ultrasound imaging," IEEE TUFFC 60(9), 1853–1867, 2013. doi:10.1109/TUFFC.2013.2771. The k-space mapping of plane-wave data as a reconstruction.
- A. Rodriguez-Molares et al., "The generalized contrast-to-noise ratio: a formal definition for lesion detectability," IEEE TUFFC 67(4), 745–759, 2020.
- J. A. Jensen, "Field: A program for simulating ultrasound systems," Medical & Biological Engineering & Computing, 1996. Spatial impulse responses, the reference for broadband fields.
- Y. Li, E. Wolf, "Focal shifts in diffracted converging spherical waves," Optics Communications, 1981. The low-Fresnel-number focal shift.
- J. W. Goodman, Introduction to Fourier Optics (Fresnel and Fraunhofer diffraction, Fresnel number). T. L. Szabo, Diagnostic Ultrasound Imaging: Inside Out, 2nd ed., 2014. R. S. C. Cobbold, Foundations of Biomedical Ultrasound, 2007. B. D. Steinberg, Principles of Aperture and Array System Design, 1976.