---
title: "Underwater acoustics: radiated noise and pile driving"
description: "ISO 18405 reference levels (SPL, SEL, peak) re 1 µPa, the ISO 17208 ship radiated noise level and equivalent monopole source level via the Lloyd's-mirror correction, and the ISO 18406 single-strike, peak and cumulative pile-driving sound exposure."
---

Underwater sound is referenced to **1 µPa** (not the 20 µPa of airborne
acoustics), and its exposure to **1 µPa²·s**. This page covers the ISO 18405
reference levels realised as the shared primitives, the ISO 17208 ship
**radiated noise level** and equivalent **monopole source level**, and the
ISO 18406 percussive **pile-driving** single-strike, peak and cumulative sound
exposure. Every quantity is an exact closed form, verified analytically.

## 1. Reference levels (ISO 18405)

Three primitives, referred to 1 µPa, are computed from a captured pressure
signal (in Pa):

$$
\mathrm{SPL} = 10\lg\frac{\langle p^2\rangle}{p_0^2}, \qquad
\mathrm{SEL} = 10\lg\frac{\int p^2\,dt}{E_0}, \qquad
L_{p,\mathrm{pk}} = 20\lg\frac{\max|p|}{p_0},
$$

with `p₀ = 1 µPa` and `E₀ = 1 µPa²·s`. The sound pressure level is the
mean-square level (ISO 18406 Formula 7); the sound exposure level integrates the
squared pressure over the record (Formulae 3–4); the peak level is the
zero-to-peak value.

```python
import phonometry as ph

spl = ph.sound_pressure_level(pressure)        # dB re 1 µPa
sel = ph.sound_exposure_level(pressure, fs)     # dB re 1 µPa²·s
pk = ph.peak_sound_pressure_level(pressure)     # dB re 1 µPa
```

To re-reference a level between the underwater (1 µPa) and airborne (20 µPa)
conventions — a `20·lg(20) ≈ 26.02` dB shift, **not** an energy/intensity
equivalence — use `underwater_to_in_air_spl` / `in_air_to_underwater_spl`. For
background-noise subtraction, reuse the ISO 3744 `background_noise_correction`
(`K1`) helper.

## 2. Ship radiated noise and source level (ISO 17208-1/-2)

A surface ship measured in deep water is described first by its **radiated noise
level** and then by an **equivalent monopole source level**:

$$
L_{\mathrm{RN}} = 20\lg\frac{p_{\mathrm{rms}}}{p_0} + 20\lg\frac{r}{r_0}
\ \ \mathrm{dB\ re\ 1\ \mu Pa\!\cdot\! m}, \qquad
L_s = L_{\mathrm{RN}} + \Delta L,
$$

where the Lloyd's-mirror surface correction (ISO 17208-2 Formula 3) for a
nominal source depth `d_s = 0.7·D` (D = mean draught) and `u = k·d_s`,
`k = 2πf/c`, is

$$
\Delta L = -10\lg\frac{2u^4 + 14u^2}{14 + 2u^2 + u^4}\ \mathrm{dB}.
$$

`ΔL` diverges at low `u` (grazing / low frequency) and tends to `−10·lg(2) =
−3.01` dB as `u → ∞`. The reported source level is an *equivalent monopole
broadside* value and must be quoted with its source depth.

<img class="light-only" src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/ship_source_level.svg" alt="Ship radiated noise level and equivalent monopole source level versus frequency, with the Lloyd's-mirror surface correction on a twin axis showing its low-frequency divergence and its approach to −3 dB at high frequency" style="width:82%"><img class="dark-only" src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/ship_source_level_dark.svg" alt="Ship radiated noise level and equivalent monopole source level versus frequency, with the Lloyd's-mirror surface correction on a twin axis showing its low-frequency divergence and its approach to −3 dB at high frequency" style="width:82%">

```python
import phonometry as ph

lrn = ph.radiated_noise_level(2e-6, 100.0)   # p_rms = 2 µPa, r = 100 m
res = ph.monopole_source_level(lrn, 200.0, draught=6.0)
print(res.source_level, res.surface_correction, res.source_depth)
res.plot()   # RNL, Ls and ΔL vs frequency (needs matplotlib)
```

`hydrophone_depths` gives the three ISO 17208-1 measurement depths from the
15°/30°/45° depression angles, and `source_level_uncertainty` the tabulated
expanded uncertainty (5 dB ≤100 Hz, 3 dB 125 Hz–16 kHz, 4 dB >16 kHz).

<details>
<summary>Show the code for this figure</summary>

```python
import numpy as np
import phonometry as ph

freqs = np.array([20, 25, 31.5, 40, 50, 63, 80, 100, 125, 160, 200, 250, 315,
                  400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150,
                  4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000.0])
rnl = 175.0 - 12.0 * np.log10(freqs / 20.0)
res = ph.monopole_source_level(rnl, freqs, draught=6.0)
res.plot()
```

</details>

## 3. Pile-driving sound (ISO 18406)

Percussive pile driving radiates one impulsive pulse per hammer strike. Each
strike has a **single-strike sound exposure level** `SEL_ss`; over a driving
sequence the exposures add to a **cumulative sound exposure level**:

$$
\mathrm{SEL_{cum}} = 10\lg\sum_{n} 10^{\mathrm{SEL}_n/10},
\qquad\text{and for } N \text{ identical strikes } = \mathrm{SEL_{ss}} + 10\lg N.
$$

<img class="light-only" src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/pile_driving.svg" alt="A percussive pile-driving strike pressure waveform with its peak marked, and below it the cumulative sound exposure level growing as SEL_ss plus ten times the logarithm of the number of strikes" style="width:82%"><img class="dark-only" src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/pile_driving_dark.svg" alt="A percussive pile-driving strike pressure waveform with its peak marked, and below it the cumulative sound exposure level growing as SEL_ss plus ten times the logarithm of the number of strikes" style="width:82%">

```python
import phonometry as ph

sel_ss = ph.single_strike_sel(strike_pressure, fs)   # dB re 1 µPa²·s
sel_cum = ph.cumulative_sel_identical(sel_ss, 2000)   # 2000 strikes
res = ph.pile_strike_metrics(strike_pressure, fs)
print(res.single_strike_sel, res.peak_spl, res.pulse_duration)
res.plot()   # waveform + cumulative energy (needs matplotlib)
```

`pile_strike_metrics` bundles the single-strike SEL, the peak sound pressure
level, the SPL/Leq and the 90 %-energy pulse duration for one recorded strike;
`cumulative_sel` sums a sequence of differing per-strike SELs.

<details>
<summary>Show the code for this figure</summary>

```python
import numpy as np
import phonometry as ph

fs = 48000
t = np.arange(int(0.3 * fs)) / fs
envelope = np.where(t < 0.01, t / 0.01, np.exp(-(t - 0.01) / 0.04))
pressure = 8000.0 * envelope * np.sin(2 * np.pi * 180.0 * t)
res = ph.pile_strike_metrics(pressure, fs)
res.plot()
```

</details>

---

**Standards.** ISO 18405:2017, *Underwater acoustics — Terminology*: the 1 µPa
sound-pressure and 1 µPa²·s sound-exposure references and the definitions of
sound pressure level, sound exposure level and peak sound pressure level.
ISO 17208-1:2016 and ISO 17208-2:2019, *Underwater acoustics — Quantities and
procedures for description and measurement of underwater sound from ships*: the
radiated noise level, the deep-water three-hydrophone geometry, the tabulated
source-level uncertainty and the equivalent monopole source level via the
Lloyd's-mirror surface correction (Formula 3) for a `0.7·draught` source depth.
ISO 18406:2017, *Underwater acoustics — Measurement of radiated underwater sound
from percussive pile driving*: the single-strike (Formulae 3–4), peak and
cumulative (Formulae 8–9) sound exposure. All quantities are verified against
exact analytic oracles. General underwater propagation modelling (ray, normal
mode, parabolic equation) is out of scope here.
