DEV Community

Cover image for Instrumented Headform Signal Processing for HIC Calculation in Impact Testing
Robin | Mechanical Engineer
Robin | Mechanical Engineer

Posted on

Instrumented Headform Signal Processing for HIC Calculation in Impact Testing

The HIC (Head Injury Criterion) calculation sounds simple — integrate the acceleration signal over time. In practice, getting a valid HIC number from a head impact test requires careful attention to signal conditioning, filtering, and sampling rate. Here's the technical detail.

Sensor Setup

The standard headform accelerometer setup per ECE 22.06, FMVSS 208, and related standards:

  • Triaxial accelerometer at headform centre of gravity (CG)
  • Accelerometer range: ±2000g (motorcycle) or ±500g (industrial)
  • Sensitivity: 1–2 mV/g typical
  • Natural frequency: >10 kHz (to avoid mechanical resonance in measurement band)

Mount the accelerometer with minimal mass adapter — any added mass shifts the CG and invalidates the test.

Signal Conditioning Chain

Accelerometer → Charge Amplifier → Anti-alias Filter → ADC → DAQ

Specifications:
- Charge amplifier: <0.1% linearity, bandwidth DC to 10kHz
- Anti-alias filter: 4th order Butterworth, fc = 1650Hz (per SAE J211 channel class 1000)
- ADC: 16-bit minimum, ≥10kHz sample rate
- DAQ: timestamp accuracy ±10μs
Enter fullscreen mode Exit fullscreen mode

SAE J211 Filtering

All automotive and helmet impact standards require SAE J211 Channel Class filtering applied to raw acceleration data before HIC calculation:

  • Channel Class 1000: fc = 1650 Hz (head acceleration in crash testing)
  • Filter type: 4-pole Butterworth (implemented as zero-phase forward-backward filter)
  • Apply to raw data BEFORE calculating any derived quantities
from scipy.signal import butter, filtfilt
import numpy as np

def sae_j211_filter(accel_data, sample_rate, channel_class=1000):
    # fc = 0.6 * channel_class (SAE J211 formula)
    fc = 0.6 * channel_class  # = 600 Hz for CC1000
    nyq = sample_rate / 2
    normal_cutoff = fc / nyq
    b, a = butter(4, normal_cutoff, btype='low', analog=False)
    filtered = filtfilt(b, a, accel_data)
    return filtered
Enter fullscreen mode Exit fullscreen mode

HIC Calculation

def calculate_hic(time_s, accel_g, max_interval=0.036):
    """
    Calculate Head Injury Criterion (HIC)
    time_s: time array in seconds
    accel_g: resultant acceleration in g (filtered per SAE J211)
    max_interval: maximum time interval in seconds (0.036s per ECE 22.06)
    """
    dt = time_s[1] - time_s[0]
    n = len(time_s)
    max_hic = 0

    for i in range(n):
        t1 = time_s[i]
        for j in range(i+1, n):
            t2 = time_s[j]
            dt_interval = t2 - t1
            if dt_interval > max_interval:
                break
            # Integrate acceleration over interval
            integral = np.trapz(accel_g[i:j+1], time_s[i:j+1])
            mean_a = integral / dt_interval
            hic = dt_interval * (mean_a ** 2.5)
            if hic > max_hic:
                max_hic = hic

    return max_hic

# Also calculate peak resultant acceleration
def peak_resultant(ax, ay, az):
    resultant = np.sqrt(ax**2 + ay**2 + az**2)
    return np.max(resultant)
Enter fullscreen mode Exit fullscreen mode

Pass/Fail Check

def evaluate_impact(peak_g, hic, standard='ECE22.06'):
    limits = {
        'ECE22.06': {'peak_g': 275, 'hic': 2400},
        'ANSI_Z89': {'peak_g': 400, 'hic': None},
        'DOT_FMVSS218': {'peak_g': 400, 'hic': None},
    }
    lim = limits[standard]
    peak_pass = peak_g <= lim['peak_g']
    hic_pass = (hic <= lim['hic']) if lim['hic'] else True
    return {'peak_g_pass': peak_pass, 'hic_pass': hic_pass,
            'overall': peak_pass and hic_pass}
Enter fullscreen mode Exit fullscreen mode

The Neometrix Head Impact Test Rig implements this signal chain with integrated SAE J211 filtering and automated HIC reporting.
https://neometrixgroup.com/products/head-impact-test-rig

Top comments (0)