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
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
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)
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}
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)