4. Time-domain signatures of dropout
When a crash-test data channel drops out, the acquisition system rarely produces a clean blank. Most modern DAQ front ends, and nearly every vehicle-bus or sensor-interface layer, apply a hold behavior when a new sample fails to arrive: the last valid value is repeated until fresh data returns. The result is a time-domain signature that is easy to miss on a zoomed-out plot but unmistakable once you know what to look for. This section covers the three signatures that matter most for isolation — the zero-order hold (ZOH) plateau, the step discontinuity at reacquisition, and the statistical gap that sample-interval and variance metrics expose — and shows how to compute each from raw samples.
Why dropout looks like a plateau, not a hole
Consider a 10 kHz channel (Δt = 0.1 ms) recording a seat-track accelerometer during a 120 ms sled pulse. If the sensor harness momentarily opens for 3 ms, the front end has no new conversion to report. Depending on configuration it will either (a) repeat the previous sample (ZOH), (b) output the mid-scale or last-known value with a status flag, or (c) insert a NaN/flag code. Case (a) is by far the most common in production DAQ and the most dangerous, because the resulting waveform is numerically valid and visually plausible. A ZOH plateau is a run of identical consecutive samples whose length exceeds what the signal's own dynamics can produce. On a noisy accelerometer channel, two adjacent samples are almost never bit-identical; a run of 30 identical values at 10 kHz is a 3 ms hold, and that is a dropout until proven otherwise.
The key discriminator is sample-to-sample difference. Define the first difference d[n] = x[n] − x[n−1]. During normal acquisition, d[n] is small but nonzero and roughly zero-mean. During a ZOH, d[n] = 0 exactly for every sample inside the hold. So a robust detector counts consecutive zero first-differences and flags any run longer than a threshold derived from the channel's noise floor. If the channel is genuinely quiet (e.g., a static strain gauge at rest), exact-zero runs can occur naturally, so the threshold must be paired with the interval metric below rather than used alone.
Step discontinuities at reacquisition
When valid data resumes, the first fresh sample is compared against the held value, not against the true signal at that instant. If the true signal moved during the gap, the transition appears as an abrupt step. In the seat-track example, the accelerometer may have swung from +18 g to −6 g during a 3 ms hold; the recorded trace jumps 24 g in one sample interval. That step is a reacquisition artifact, not a physical event, and it corrupts any integration downstream (velocity and displacement will be wrong by the area of the missing segment).
Detecting the step is straightforward: compute the second difference or simply the magnitude of d[n] at the sample where the zero-run ends, and compare it against the channel's expected maximum slew rate. A useful rule is to bound the physical slew: for a ±50 g accelerometer with 5 kHz anti-alias bandwidth, the maximum legitimate change per 0.1 ms sample is roughly 2π·5000·(50 g)·0.0001 s ≈ 157 g/s·0.0001 s ≈ 0.016 g — far below a 24 g jump. Any first difference exceeding a few times the expected slew is a candidate reacquisition step. Confirm it by checking that the preceding samples form a ZOH run; a large step with no preceding hold is more likely a real transient or a glitch and should be handled by a different rule.
Gap detection with sample-interval and variance metrics
Two scalar metrics turn the visual signatures into numbers you can threshold and log. The first is the effective sample interval: for each sample, the time since the previous accepted sample. In a uniformly sampled stream this is constant at Δt; during a hold it is still Δt (because held samples are emitted on schedule), but the information interval — time since the last genuinely new value — grows. Track both: the nominal interval Δt and the run-length counter R[n] of consecutive identical samples. The gap duration is then R[n]·Δt, and the information age is the same quantity. A dropout is declared when R[n]·Δt exceeds a channel-specific limit, typically 2–5× the sensor's own response time.
The second metric is local variance. Over a sliding window of W samples (e.g., W = 50, i.e., 5 ms at 10 kHz), compute the sample variance s². During normal acquisition s² tracks the signal's local activity; during a ZOH it collapses to exactly zero. A variance floor of zero over a window wider than the noise correlation time is a strong dropout indicator, and it is robust to the quiet-channel false positive that plagues the zero-difference rule alone. Combine the two: flag when s² ≈ 0 and R[n]·Δt > limit. The conjunction suppresses both quiet-signal false alarms and single-sample glitches.
Putting the metrics to work: a reproducible check
The following Python fragment implements the conjunction rule on a single channel. It assumes x is a NumPy array of samples and dt is the nominal interval in seconds. The parameters are illustrative: a 10 kHz channel with a 5 ms variance window and a 2 ms gap limit.
import numpy as np
def dropout_mask(x, dt, var_window=50, gap_limit_s=2e-3, slew_limit=None):
d = np.diff(x, prepend=x[0])
# run length of consecutive identical samples
same = (d == 0).astype(int)
R = np.zeros_like(same)
for i in range(1, len(same)):
R[i] = R[i-1] + 1 if same[i] else 0
# sliding variance
s2 = np.array([np.var(x[max(0,i-var_window+1):i+1]) for i in range(len(x))])
gap = (R * dt) > gap_limit_s
quiet = s2 < 1e-12
mask = gap & quiet
if slew_limit is not None:
step = np.abs(d) > slew_limit
mask = mask | (step & np.roll(gap, 1))
return mask, R, s2
Run this on the seat-track channel and inspect the returned mask. For the 3 ms hold described above, R reaches 30, s2 collapses to zero across the hold, and the mask is True for the held samples plus the reacquisition sample. The expected output is a contiguous True run of about 31 samples; a scattered or single-sample True is a sign that the thresholds are too tight and the channel's own noise is being mistaken for a hold. Typical failure symptoms and their fixes: (1) mask fires on a genuinely quiet channel — raise gap_limit_s or require s2 to be exactly zero over a longer window; (2) mask misses a short 0.5 ms hold — lower gap_limit_s but verify the sensor's own response time first, since a hold shorter than the sensor bandwidth is not recoverable anyway; (3) mask fires on every sample after a real step — the np.roll(gap, 1) term is intended to catch only steps that follow a hold, so check that gap is not itself mis-set.
Reading the result and deciding what to do
Once the mask is trustworthy, the isolation decision follows from the signature shape. A ZOH plateau with a clean reacquisition step and a variance collapse points to a transport-layer dropout — harness, connector, or bus arbitration — because the sensor itself was still converting; the held value is the last good conversion. A plateau with no step at reacquisition suggests the signal was genuinely static and the "hold" may be benign, so cross-check against a second channel on the same harness. A step with no preceding hold is a different fault class (glitch or real transient) and should be routed to a separate rule. Record the gap duration, the step magnitude, and the sample index in the test log; those three numbers are what the post-test review needs to decide whether the run is valid or must be repeated with a repaired harness.
The three signatures are complementary by design: the ZOH plateau tells you where the gap is, the step tells you how much signal was lost, and the interval/variance metrics tell you whether to trust the flag on a noisy or quiet channel. Used together they convert a visual impression into a thresholded, loggable, reproducible detection that survives review.