For the pipeline designers · Wellspring revB s/n 1001 · 5 Nov 2026
Wellspring Tiled-Chirp Validation
The deployed estimator, reproduced bit-for-bit offline, and a periodic-excitation variant (4096-sample period, 64 repeats, 61 coherently summed) measured on hardware against it, with dark frames to separate noise, interference and signal-borne terms in the floor.
IMX WS-IMX 2.5-1 (Stage 1) · CPLD WS-CPLD 1.1 · fs = 25 MHz, fc = 5 MHz, nc = 6, β = 40 dB · 10 mm steel, single coil · readings forced over SWD, every stage dumped
A step-by-step version for electronics engineers is published as a separate page, “Wellspring Signal Chain Walkthrough”.
Result
Estimators agreeTwo signal-borne floor terms
On 10 + 10 readings of the same plate, the periodic scheme reproduces the deployed A-scan to a correlation of 0.99999. The peak amplitude ratio is −0.41 dB, against the −0.42 dB predicted from the matched-filter energy. Peak scatter is 0.11 % for both. Beyond 20 µs the tiled floor is 6.7 dB higher. That excess is accounted for by (i) aliasing of the plate's impulse response beyond the 151.8 µs unambiguous range, and (ii) LFM range–Doppler coupling of a ≈ 690 kHz modulation, which the faster sweep moves into the window. Thermal or electronic noise and comb-coherent interference are each ≥ 40 dB and ≈ 0 dB, respectively, from mattering.
0.99999ρ(mean A-scans), legacy vs tiled
−0.41 dBpeak ratio; predicted 20 log(61/64) = −0.42
20 / 20IMX outputs reproduced bit-exactly from their own ADC records*
+0.4 dBdark-frame power on comb teeth vs between
690 kHzmodulation inferred from coupling ghosts at ±1481 µs (legacy) and 23.1 µs (tiled)
* One legacy reading differs in 1 of 2156 samples (last-bit rounding).
Same transducer and plate, three systems. The fielded 8-channel RDC (9 stored readings), Wellspring with the deployed estimator, and Wellspring with the periodic estimator (10 each). The main lobe is at 0.56 µs and the echo train is the same in all three. Absolute amplitude across boards also depends on coil placement.
1 · DEPLOYED ESTIMATORWhat the firmware computes
The reference is synthesised in the frequency domain on the positive half-band only (genchirp.c), so c is analytic:
C(f) = exp[−½(2π(f − fc)σ)²] · exp[j·½(2π(f − fc))²·√(S² − 1)·σ²] · exp[−j2πf·ncS/(2fc)], 0 ≤ f < fs/2
σ = (nc/fc) / √(8 ln β), c = F−1{C} / max|·|
Gaussian magnitude (the only window in the chain), quadratic phase (stretch S), linear phase (centring delay ncS/2fc)
In time this is a Gaussian-envelope LFM with σt = Sσ and sweep rate k = √(S² − 1)/(2πσ²S²): a down-sweep at k = 4.66 × 10⁸ Hz/s for the deployed S = 8738.1, as measured from the captured chirp. The DAC receives Re c, quantised to 14 bits. The estimator is
y = F−1{ R · C* · 𝟙[k < N/2] }, R = F{r}, r[n] = (ADC[n] − 2¹³)/2¹³, N = 2¹⁸
Re y[m] = Σn r[n + m] · Re c[n] (circular), Im y = H{Re y}
The half-band mask is a no-op (C is zero there to 3 × 10⁻¹⁶). The A-scan is Re y rotated to put zero lag at sample 300, trimmed to 2156. |y| is the analytic envelope, computed and discarded.
Two implementation details matter for exact reproduction. The BLE configuration carries S = 8738.1 as float32, not N/30 = 8738.13; with the latter the chirp phase is off by 0.64 rad at fc. The spectral product is formed in float32 with fused multiply-add, re = fma(ar, br, −aibi), im = fma(ar, bi, aibr), which adds ≈ 1.4 × 10⁻⁷ relative error over double precision. Modelled that way, all 131,072 bins and all 2156 output samples match the IMX exactly.
Group delay. τg(f) of C and R spans 9 → 1.5 ms across the band; conj(C) flattens it to ≈ 0, which is the compression. The receive spectrogram shows ±5 V burst impulses and aliased 2nd and 3rd harmonics of the sweep.
Equivalent forms on the same record: rfft correlation with Re c (4.4e-8 of peak), no half-band mask (4.4e-8), float32 throughout (5.7e-8), DAC codes as the reference (2.5e-6). Direct dot products agree to 6 digits.
2 · PERIODIC ESTIMATORTiled excitation and coherent fold
The same synthesis at N = P = 4096 (S = 136.53, so the chirp fills one 163.84 µs period) is inherently P-periodic, being an inverse DFT. It is transmitted K = 64 times back to back, so the CPLD still plays its fixed 2¹⁸ record. With a linear, time-invariant channel h, the received periods reach steady state once the ring-up has decayed, and the first D = 3 are discarded:
a[j] = Σk=DK−1 r[kP + j] = (K − D) · (hP ⊛P xP)[j] + Σk nk[j], hP[m] = Σq h[m + qP]
yP = FP−1{ A · CP* }, A = FP{a}
The fold is a comb with teeth every fs/P = 6103.5 Hz (first nulls ±100 Hz). hP is the impulse response aliased modulo P: range ambiguity at (P − 300)·Ts = 151.8 µs after zero lag.
Point-spread function. ρ = F−1{|C|²}. Since |C| depends on fc, nc and β but not on S, the compressed pulse is the same for both estimators; the normalised PSFs differ by 2 × 10⁻¹⁶.
Gain. For a unit reflector the output amplitude scales as G = (periods summed) · Σ(Re c)². The chirp energy is proportional to its length, so GP/GN = 61 E4096/E2¹⁸ = 0.953. That is −0.42 dB in amplitude and −0.21 dB in white-noise SNR (noise rms scales as √G).
Sweep rate. k ∝ √(S² − 1)/S² ≈ 1/S, so kP = 64 kN = 2.98 × 10¹⁰ Hz/s. This is what moves the coupling ghosts in §4.
Offline, from the morning capture. T1: periodic tiles, continuous at the seams. T2: PSFs overlay. T3/T4: that reading carried a −37 dB comb at 6.6 µs spacing at all lags, negative included, so it was interference and not echoes. It is absent from every capture in §3–4.
Implementation (Stage 1, IMX only). One period is uploaded 64× in a single SPI transfer. The readback is streamed one 8 KiB period at a time into int32 a[P], and the existing double-precision pocketfft matched filter then runs at P. The CPLD and BLE are unchanged. Readback seams show no glitches (deviation at chunk edges 5–8 codes against a median 31).
3 · MEASUREMENT10 + 10 readings on the plate
| Deployed (N = 2¹⁸) | Periodic (P = 4096, 61 summed) |
| Output vs model | bit-exact 9/10 (1 sample in 1) | bit-exact 10/10 |
| Peak, mean ± sd | −29,650 ± 32 (0.11 %) | −28,293 ± 31 (0.11 %) |
| Peak sample | 314 (all) | 314 (all) |
| Mean-A-scan floor, lag < −2 µs | −73.0 dB | −70.3 dB |
| Mean-A-scan floor, lag > 20 µs | −80.5 dB | −73.8 dB |
| Inter-reading sd, lag > 20 µs | −94.1 dB | −78.6 dB |
| Steady-state check, rms(rk − rk−1) | — | k = 1: 77–279 codes; k ≥ 2: 15–76 |
Deterministic vs stochastic content. Top: envelope of the mean A-scan, i.e. echoes, sidelobes, aliasing and coherent interference. Bottom: inter-reading standard deviation per lag, i.e. random terms. The periodic estimator shows narrow stochastic peaks at ≈ 23 and 46 µs.
4 · FLOOR DECOMPOSITIONDark frames, aliasing and range–Doppler coupling
Noise. Three no-TX frames (DAC held at mid-scale) put through both estimators give ≈ −118 dB (deployed) and −117 dB (periodic) re each one's own peak. Electronic noise is 40 dB below either floor.
Comb-coherent interference. The §3.5 concern was interference on the 6103.5 Hz teeth getting the same ×61 gain as the echoes. In the dark frames, tooth bins carry +0.4 dB over off-tooth bins (+0.5 dB weighted by |C|²). The strongest in-band lines (6.996, 4.012 and 2.984 MHz) are off-tooth; fs/8 = 3.125 MHz sits on a tooth at +6 dB over the in-band median.
(i) Aliased impulse response. The mean deployed correlation still holds −52 dB of plate response beyond 151.8 µs. Folding it modulo P predicts a late floor of −74.8 dB in the periodic estimate; the measured excess (periodic mean minus scaled deployed mean) is −74.5 dB.
(ii) Range–Doppler coupling. A multiplicative modulation at fm produces spectral copies at ±fm, which an LFM matched filter maps to lags τ = ±fm/k (the ridge of the LFM ambiguity function). The deployed correlation shows random-phase ghosts at ±1481 µs (−47 dB sd) and ±2962 µs, giving fm = 1481 µs × 4.66 × 10⁸ Hz/s ≈ 690 kHz. These lie far outside the deployed window. With kP = 64 kN the same term lands at 23.1, 46.3 and 69.4 µs, inside the periodic window, and is the stochastic term seen in §3. The source is not identified; supply ripple on the TX path is the candidate (inferred).
Dark frames. Top: noise through each estimator (≈ −117 dB) and the predicted aliasing term (green) against the periodic floor. Bottom: dark-frame spectrum in band at 95 Hz resolution, teeth marked.
One modulation, two lags. Deployed: ghosts at ±1.48 and ±2.96 ms (window shaded). Periodic: 23.1, 46.3 and 69.4 µs (dashed), offset by the 0.5 µs main-lobe position.
5 · QUESTIONS FOR THE DESIGNERSChoices the data does not settle
- Unambiguous range. At P = 4096 the aliased tail is −74 dB on 10 mm steel, 35 dB under the second echo. What wall thickness and ring-down must the cloud algorithm tolerate? P = 8192 doubles the range to 315.6 µs; with D = 3 that leaves 29 of 32 periods summed: 29/32 → −0.86 dB amplitude and −0.43 dB SNR against the deployed estimator, or 0.44 dB below P = 4096 (inferred).
- Coupling ghosts. τghost = fm/kP scales with P. Keeping a 690 kHz term outside the 74 µs window needs kP < 9.3 × 10⁹ Hz/s, i.e. P ≥ 16384 (ghost at 93 µs): 16 periods, 13 summed, 13/16 → −1.80 dB amplitude and −0.90 dB SNR against the deployed estimator (inferred). Is removing the modulation at source preferred to choosing P around it?
- Discard length. D = 3 covers ADC wake-up and ring-up on this plate (rms change from period 2 onward is at the steady level). Should D follow the expected echo-train duration, as §3.5 suggests?
- Amplitude scale. The periodic output is 0.953× the deployed one. Should the cloud compensate, or the firmware rescale by 64/61, so fielded and new readings share a scale?
- Window. The Gaussian |C| (40 dB at the band edges) is the only taper. With a P-periodic excitation, would a different spectral taper trade sidelobe level against the aliased-tail floor more favourably?