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.
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:
| Run | Start (ms) | End (ms) | Duration (ms) | Above 60 g? |
|---|---|---|---|---|
| 1 | 14.2 | 15.4 | 1.2 | Yes |
| 2 | 17.1 | 20.7 | 3.6 | Yes |
| 3 | 29.5 | 30.9 | 1.4 | Yes |
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.
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.
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.
| Field | Example value | Notes |
|---|---|---|
| Channel | Chest resultant a | Resultant of ax, ay, az |
| Sampling rate | 10 kHz | Uniform, verified |
| Filter class | CFC 180 | SAE J211 |
| Filter type | 2nd-order Butterworth, zero-phase | filtfilt |
| Threshold | 60 g | Strict greater-than |
| Max interval | 3.6 ms | Run 2, 17.1–20.7 ms |
| Limit | 3.0 ms | Per regulation |
| Result | Exceeded | Fail |
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.