7 files

process_SHPB.py - A Python algorithm for stress wave dispersion correction in split-Hopkinson pressure bar experiments

posted on 2023-02-06, 22:12 authored by Arthur Van LerbergheArthur Van Lerberghe, Andrew BarrAndrew Barr


When processing signals from split-Hopkinson pressure bar (SHPB) experiments, it is frequently presumed that longitudinal stress waves in the pressure bars travel one-dimensionally at a common velocity of c0. Hence, measurements recorded at the strain gauges are commonly simply translated to the end of the bar using a suitable time delay. In reality, stress waves travel at a certain phase velocity, cp, which varies with frequency, bar diameter, one-dimensional wave speed and Poisson’s ratio. As the frequency of a wave rises, the phase velocity drops, resulting in signal dispersion as it propagates down the bar. The dispersion of the stress pulse is followed by a frequency-dependent fluctuation in stress and strain throughout the bar cross-section. Therefore, a signal recorded on the surface of the bar at some distance from the specimen will not accurately represent the stresses the specimen was subjected to, and hence cannot be used to objectively measure the specimen response.

process_SHPB.py is the main algorithm required to process all the SHPB test data, from which the subroutines dispersion.py and dispersion_factors.py are called. The algorithm was inspired by a Matlab script created by Barr (2016).

The inputs for the key function process_SHPB.py are: raw file, which is the raw file collected from the SHPB test; sample data, which is a list containing the length, mass and dry mass of the sample tested; confinement, which specifies the confinement of the sample tested using the SHPB apparatus either ‘”None”, “Ring” or “Reservoir”; and correction, which is either a dispersion correction or a simple time shift analysis. In the 'Processed_Data' folder, all the necessary key results are saved as .csv files.

The subroutine dispersion.py, in process_SHPB.py, uses an adaptation of Tyas and Pope’s (2005) dispersion-correction approach to verify that the inferred axial stress and strain data appropriately represent the specimen behaviour, as specified below:

  1. The fast Fourier transform (FFT) is used to convert the time-domain strain signal to the frequency domain.
  2. Using Bancroft’s equation, a correction is made to the phase angle of each frequency component to account for dispersion over the distance between the strain gauge and the bar end.
  3. The amplitude of each frequency component is corrected using the factors m1, m2, v_ratio and norm_freq, which account for strain and Young’s modulus fluctuation over the bar cross section, respectively. Davies’ investigation of radial effects in a cylindrical pressure bar yielded these results.
  4. The inverse FFT is used to transform the signal back into the time domain.

To save time, dispersion.py utilises a subroutine dispersion_factors.py, which includes a precalculated, normalised look-up table of phase velocity, m1, m2, v_ratio and norm_freq. process_SHPB.py, includes a lookup table for a Poisson’s ratio of 0.29. More tables can be generated using the calculation method outlined in Tyas and Pope (2005) and the Python script phase_velocity.py, (Van Lerberghe, A., Barr, A. D. (2023)), available on GitHub and ORDA, see links below.


  • process_SHPB.py: Includes the main python function, with the documentation on the use of the function included in the file as comments. It requires dispersion.py, dispersion_factors.py, and dispersion_factors folder to run.
  • dispersion.py: A Python function, with the documentation on the use of the function included in the file as comments. It requires dispersion_factors.py to run.
  • dispersion_factors.py: A Python function, with the documentation on the use of the function included in the file as comments. It requires the folder dispersion_factors.
  • 'dispersion_factors' folder: A folder containing pre-calculated values of normalised frequency, normalised velocity and factors m1 and m2 for a material with a Poisson's ratio of 0.29 (i.e. stainless steel). This was calculated using the algorithm phase_velocity.py (Van Lerberghe, A., Barr, A. D. (2023)), available on GitHub and ORDA, see links below.


  • Tyas, A., Pope, D.J., (2005). Full correction of first-mode Pochhammer–Chree dispersion effects in experimental pressure bar signals. Measurement science and technology, 16(3), p.642.




Arthur Van Lerberghe avanlerberghe1@sheffield.ac.uk & Andrew D. Barr a.barr@sheffield.ac.uk.


EPSRC 165426-11-2

DSTL 165426-12-2



There is no personal data or any that requires ethical approval


The data complies with the institution and funders' policies on access and sharing

Sharing and access restrictions

The data can be shared openly

Data description

  • The file formats are open or commonly used

Methodology, headings and units

  • There is a file including methodology, headings and units, such as a readme.txt