3. Compute 3 ms Chest Acceleration Criterion

What the 3 ms criterion actually measures

The 3 ms chest acceleration criterion (often written as a3ms or "3 ms clip") answers a single question: for how long does the filtered chest resultant acceleration stay above a given threshold? It is not a peak-value metric. A very short spike of 90 g that lasts 1.5 ms is less injurious by this criterion than a sustained 62 g plateau lasting 4 ms, because the criterion rewards duration above threshold rather than instantaneous magnitude. In FMVSS 208 and the associated dummy-injury literature, the chest criterion is typically evaluated at a 60 g threshold with a 3 ms maximum allowable duration, and the reported value is the maximum continuous time interval during which the filtered signal exceeds that threshold.

Two details dominate the result and are the usual source of disagreement between analysts:

  • Filtering. The acceleration must be processed with the channel-frequency-class filter appropriate to the chest channel. For chest acceleration the standard practice is CFC 180 (SAE J211), not CFC 600 or CFC 1000. Using the wrong class shifts the peak and, more importantly, changes how long the signal lingers near the threshold.
  • Interval definition. The "3 ms" is a continuous exceedance window. Two separate 2 ms excursions above 60 g do not add up to 4 ms; each is evaluated independently, and the criterion is the longest single contiguous run.

The figure below shows the processing chain and the interval logic that this case implements: raw chest resultant acceleration → CFC 180 low-pass → threshold crossing detection → contiguous-interval measurement → maximum interval reported against the 3 ms limit.

Raw chest a(t) resultant, g CFC 180 filter SAE J211 low-pass Threshold test a > 60 g ? Interval scan contiguous runs max Δt vs 3 ms Interval logic on the filtered signal time (ms) g 60 g Δt₁ ≈ 1.2 ms Δt₂ ≈ 3.6 ms max interval = Δt₂ = 3.6 ms 3.6 ms > 3 ms → criterion exceeded

Building the calculation from a filtered time history

The implementation below assumes the chest resultant acceleration has already been standardized (units in g, time in seconds, uniform sampling) and that a CFC 180 filter has been applied. The function is deliberately self-contained: it takes a time vector and a filtered acceleration vector, applies the threshold, finds contiguous exceedance runs, and returns the maximum interval together with the run boundaries so the result can be audited.

import numpy as np

def cfc180_lowpass(t, a, dt=None):
    """Second-order Butterworth low-pass at the CFC 180 corner frequency.
    SAE J211 CFC 180 -> fc = 180 Hz (channel class corner)."""
    from scipy.signal import butter, filtfilt
    if dt is None:
        dt = np.mean(np.diff(t))
    fs = 1.0 / dt
    fc = 180.0
    b, a_coef = butter(2, fc / (fs / 2.0), btype="low")
    return filtfilt(b, a_coef, a)

def three_ms_criterion(t, a_filtered, threshold_g=60.0):
    """Return (max_interval_s, start_time, end_time, exceeded_flag)."""
    above = a_filtered > threshold_g
    if not np.any(above):
        return 0.0, None, None, False

    # Find contiguous runs of True
    idx = np.flatnonzero(above)
    splits = np.where(np.diff(idx) > 1)[0]
    runs = np.split(idx, splits + 1)

    best = 0.0
    best_start = best_end = None
    for run in runs:
        t0 = t[run[0]]
        t1 = t[run[-1]]
        dur = t1 - t0
        if dur > best:
            best, best_start, best_end = dur, t0, t1

    return best, best_start, best_end, best > 0.003

Two implementation choices matter for reproducibility. First, the filter is applied with filtfilt (zero-phase, forward-backward) so the filtered peak is not shifted in time; a causal one-pass filter would bias the interval boundaries. Second, the interval is measured from the first sample above threshold to the last sample above threshold within a contiguous run — not from the crossing interpolation. For a 10 kHz signal this introduces at most 0.1 ms of quantization, which is acceptable against a 3 ms limit but should be documented.

Worked example with teaching data

Consider a synthetic chest resultant acceleration sampled at 10 kHz over 50 ms, with a main pulse peaking near 72 g at 18 ms and a secondary shoulder near 63 g at 30 ms. After CFC 180 filtering, suppose the exceedance runs are:

RunStart (ms)End (ms)Duration (ms)Above 60 g?
114.215.41.2Yes
217.120.73.6Yes
329.530.91.4Yes

The maximum continuous interval is 3.6 ms (run 2), which exceeds the 3 ms limit, so the criterion is failed for this channel. Note that the peak value alone (72 g) would not tell you this; the failure is driven by the width of the main pulse above 60 g. If the analyst had mistakenly applied CFC 600, the sharper filtered peak would shorten run 2 to roughly 2.8 ms and the criterion would appear to pass — a classic false negative caused by filter-class error.

Do not sum non-contiguous runs. Runs 1 and 3 together total 2.6 ms, but they are separated by a dip below 60 g and must be evaluated independently. Reporting 2.6 ms as a combined interval is a common and incorrect shortcut.

Verification and failure symptoms

To confirm the implementation, run it against a known reference: a rectangular pulse of exactly 3.0 ms width at 65 g should return a maximum interval of 3.0 ms (within one sample). A pulse of 2.9 ms should return exceeded_flag = False. If your function returns a duration longer than the pulse width, check that you are not including the filter's ringing tails; if it returns shorter, verify that the threshold comparison uses strict > consistently and that the time vector is monotonic.

Typical failure symptoms and their causes:

  • Interval reported as zero despite a visible peak above 60 g — units mismatch (acceleration still in m/s², so 60 g threshold never crossed).
  • Interval inflated by several milliseconds — filter not applied, or applied with too low a corner frequency, leaving a broad shoulder above threshold.
  • Different results between analysts — one used CFC 180, the other CFC 600, or one measured crossing-to-crossing while the other used sample indices.
Record the filter class, corner frequency, sampling rate, threshold, and interval definition alongside the reported value. The 3 ms criterion is only meaningful when those four parameters are stated, because each one can flip a marginal pass into a fail.

Deliverable: criterion record sheet

The following record captures everything needed to reproduce and audit a single 3 ms evaluation. Fill one row per chest channel per simulation.

FieldExample valueNotes
ChannelChest resultant aResultant of ax, ay, az
Sampling rate10 kHzUniform, verified
Filter classCFC 180SAE J211
Filter type2nd-order Butterworth, zero-phasefiltfilt
Threshold60 gStrict greater-than
Max interval3.6 msRun 2, 17.1–20.7 ms
Limit3.0 msPer regulation
ResultExceededFail

With the filtered curve, the interval scan, and this record in hand, the 3 ms chest criterion becomes a deterministic, auditable number rather than a peak-reading judgment call — and it is ready to be compared across simulations in later overlay work.