3. Data acquisition

Before any injury metric can be computed, the raw transducer signals must be brought into the analysis environment in a form that preserves their physical meaning. In occupant safety testing, that meaning is defined by two standards working together: SAE J211 governs the channel classes, filter characteristics, and sign conventions, while ISO 6487 governs the calibration and data-channel requirements that make those signals traceable. This section focuses on the practical mechanics of importing accelerometer, load cell, and displacement time histories so that downstream filtering and metric calculation operate on correctly scaled, correctly oriented data.

Channel classes and what they imply for import

SAE J211 defines four channel classes based on the frequency content the transducer is expected to capture. The class determines the anti-alias filter that must be applied before sampling, and it also tells you the minimum sampling rate you should expect in the file.

Channel classTypical transducersAnti-alias cutoff (Hz)Minimum sample rate
CFC 60Displacement, belt payout, chest deflection100≥ 600 Hz
CFC 180Seat belt load cells, some structural accelerometers300≥ 1800 Hz
CFC 600Dummy accelerometers (head, chest, pelvis)1000≥ 6000 Hz
CFC 1000High-frequency accelerometers, some femur loads1650≥ 10000 Hz

When you import a file, the first check is whether the declared channel class matches the sample rate. A CFC 600 accelerometer recorded at 2000 Hz is undersampled and will alias; a CFC 60 displacement channel recorded at 10000 Hz is wasteful but not wrong. The import routine should read the channel metadata and flag mismatches rather than silently accepting them.

Sign conventions and coordinate systems

SAE J211 specifies that accelerometer signals are positive in the direction of the sensitive axis, with the axis orientation defined by the mounting. For occupant testing, the convention is typically:

  • +X forward (toward the front of the vehicle)
  • +Y to the right (from the occupant's perspective)
  • +Z upward

Load cells follow the same right-hand rule: tension is positive, compression is negative, unless the cell is explicitly mounted in reverse. Displacement channels are positive in the direction of increasing separation. These conventions must be recorded at import time, because a sign error in an accelerometer channel will invert the entire injury metric. A common failure mode is importing a chest acceleration channel that was mounted upside-down; the resulting HIC or chest deflection will be physically implausible (e.g., negative deflection during frontal impact).

Never assume the sign convention from the file name alone. Read the channel descriptor, and if it is ambiguous, verify against a known event such as the initial vehicle pulse or a static calibration check.

Reading the file: a practical import workflow

Most crash test data arrives as a .csv, .dat, or vendor-specific binary (e.g., .iso, .tst). The import step should produce a consistent in-memory structure: a time vector plus one or more named signal arrays, each with metadata (units, channel class, sign convention, calibration factor).

A minimal, reproducible import for a CSV with a header row might look like this:

import numpy as np
import pandas as pd

def load_j211_csv(path, time_col="Time", sample_rate=None):
    df = pd.read_csv(path)
    t = df[time_col].to_numpy(dtype=float)
    signals = {}
    for col in df.columns:
        if col == time_col:
            continue
        signals[col] = df[col].to_numpy(dtype=float)
    if sample_rate is None:
        dt = np.diff(t)
        sample_rate = 1.0 / np.median(dt)
    return {"time": t, "signals": signals, "fs": sample_rate}

After loading, verify three things before proceeding: (1) the time vector is monotonically increasing with no duplicate timestamps; (2) the sample interval is consistent (a jittery dt indicates a clock or export problem); and (3) each signal's units match the expected physical quantity. For load cells, confirm the calibration factor was applied—raw millivolt output must be converted to newtons or kilonewtons using the cell's rated output and excitation voltage.

Calibration and scaling

ISO 6487 requires that each data channel be traceable to a calibration. In practice, the file may contain either engineering units (already scaled) or raw counts/volts. If raw, apply the calibration factor:

# Example: load cell raw voltage to force
# sensitivity = 2.0 mV/V, excitation = 5.0 V, rated capacity = 22.24 kN
sensitivity_mv_v = 2.0
excitation_v = 5.0
rated_capacity_kn = 22.24
full_scale_mv = sensitivity_mv_v * excitation_v  # 10 mV at rated capacity
scale_kn_per_mv = rated_capacity_kn / full_scale_mv
force_kn = raw_mv * scale_kn_per_mv

For accelerometers, the calibration is typically given in mV/g; multiply by the reciprocal to get g, then by 9.80665 to get m/s². Displacement channels often use a linear voltage-to-distance factor (e.g., 10 mm/V). Always store the applied factor alongside the signal so the calculation is auditable.

Common import pitfalls and how to catch them

  • Time base mismatch: merging channels sampled at different rates without resampling. Resample to the lowest common rate or to a uniform grid before combining.
  • Offset drift: a non-zero pre-trigger baseline. Subtract the mean of the pre-trigger window (typically the first 50–100 ms before T0).
  • Unit confusion: g vs. m/s², kN vs. N, mm vs. m. A 9.81× or 1000× error is easy to miss until the metric is absurd.
  • Truncated files: missing the final samples due to a buffer flush. Check that the time vector ends at the expected test duration.
Build a small validation function that runs on every import: check monotonic time, consistent dt, pre-trigger baseline near zero, and signal range within the transducer's rated capacity. Catching these early saves hours of debugging later.

Visualizing the import result

The SVG below shows the data flow from raw channel files through the import and validation stage, with the three transducer types and their key metadata. It is not a step-by-step procedure but a structural view of what must be preserved at each stage.

Import Pipeline for J211 / ISO 6487 Channels Raw Channel Files .csv / .dat / .iso time + signal columns header metadata units, CFC class Import & Parse read time vector extract signal arrays apply calibration attach metadata Validate monotonic time consistent dt baseline ≈ 0 range within capacity Accelerometer CFC 600 / 1000 mV/g → m/s² sign: +X forward Load Cell CFC 180 / 600 mV/V → kN tension positive Displacement CFC 60 V → mm increasing separation + Unified Signal Object time vector + named arrays + units + CFC class + sign convention + calibration factor ready for filtering and injury metric calculation

The diagram emphasizes that the import stage is not merely reading numbers—it is preserving the metadata that gives those numbers physical meaning. Once the unified signal object is built, the next stage (filtering per the channel class) can proceed without ambiguity.

Practical checklist for a robust import

  1. Confirm the file's time column is in seconds and starts at or before T0.
  2. Read the channel descriptor for each signal: units, CFC class, sign convention.
  3. Apply calibration factors and record them in the signal metadata.
  4. Subtract the pre-trigger baseline offset.
  5. Verify sample rate against the declared CFC class.
  6. Check that signal peaks are within the transducer's rated range.
  7. Store everything in a structure that downstream code can consume without re-reading the raw file.

When these steps are followed, the imported data is ready for the filtering and metric computation stages. The most common source of erroneous injury metrics is not the metric formula itself but a sign error, unit error, or baseline offset introduced during import. Treating import as a first-class, validated stage is therefore essential for the entire calculation and reporting workflow.