← [Documentation index](README.md)

# Occupational Noise Exposure (ISO 9612)

A working day is rarely measured in one take: the daily exposure level a
regulation acts on has to be assembled from *samples* of a real shift, and
reported with an uncertainty a hygienist can defend. `lex_8h` (in
[Levels](levels.md)) turns *one* recording into a daily level. ISO 9612:2009,
the engineering method (accuracy grade 2), is the survey design *around* that
primitive: how to sample a real working day, how to combine the pieces, and how
to attach the normative uncertainty every occupational-hygiene report needs. The
`occupational_exposure` module adds the three **measurement strategies** and the
**Annex C** uncertainty budget on top of the energy-average machinery.

<picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/diagram_dosimeter_iso9612_dark.svg"><img src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/diagram_dosimeter_iso9612.svg" alt="Left: a worker wearing a personal sound exposure meter (IEC 61252), its microphone mounted about 0.04 m above the shoulder and at least 0.1 m from the entrance of the most-exposed ear canal, per ISO 9612 Clause 12.3. Right: the three measurement strategies drawn as timelines over an eight-hour working day, task-based (the day split into labelled tasks, at least three samples plus a duration each), job-based (five or more random samples spread over the homogeneous exposure group) and full-day (the whole shift measured at least three times), all feeding the LEX,8h and its Annex C uncertainty, chosen by work pattern from Table B.1" width="94%"></picture>

## 1. The three measurement strategies (Clauses 9-11)

The *task-based* strategy (Clause 9) splits the nominal day into tasks, takes
$I \ge 3$ samples per task, and energy-sums the task contributions

$$
L_{EX,8h,m} = L_{p,A,eqT,m} + 10 \log_{10}(T_m/T_0), \qquad T_0 = 8\ \text{h},
$$

so a loud but short task contributes little. The *job-based* (Clause 10) and
*full-day* (Clause 11) strategies instead take $N \ge 5$ (or three whole-day)
random samples over a homogeneous exposure group and normalise the effective-day
duration. The daily level is the same either way; the strategies differ in how
the **uncertainty** is built.

**Choosing a strategy.** ISO 9612 Table B.1 picks the strategy from the *work
pattern*, not from convenience, and the trade-off is coverage against effort.
The **task-based** strategy is the recommended default when the day
decomposes into a small number of well-defined tasks: because it measures each
task separately, it explains *where* the dose comes from (the per-task
breakdown above) and lets a short, loud task be sampled properly without
dragging out the whole survey, but it needs a reliable work analysis, and its
uncertainty grows if the task durations are themselves uncertain. The
**job-based** strategy suits a mobile worker with an unpredictable pattern or
a homogeneous group doing "the same job": random samples across the group
average over the variability instead of resolving it, which is robust when the
day cannot be cleanly cut into tasks but blind to which activity dominates.
The **full-day** strategy (a worn dosimeter capturing the entire shift,
repeated on several days) needs the least analysis and captures everything
including the unexpected, at the cost of the most wearer-days and the weakest
diagnostic value (one number per day, no breakdown, and false contributions
like knocks on the microphone are hard to spot). As a rule: resolve the dose
with task-based when you can, fall back to job-based for irregular work, and
use full-day when the pattern defies description or an independent whole-shift
check is wanted.

```python
from phonometry import hearing

# ISO 9612 Annex D — a welder's day split into three tasks. Each task level is
# the energy average of its Lp,A,eqT samples; durations carry a measured range.
tasks = [
    hearing.Task(samples=(70.0,), duration_hours=1.5, label="planning/breaks"),
    hearing.Task(samples=(80.1, 82.2, 79.6), duration_hours=5.0,
         duration_range=(4.0, 6.0), label="welding"),
    hearing.Task(samples=(86.5, 92.4, 89.3, 93.2, 87.8, 86.2), duration_hours=1.5,
         duration_range=(1.0, 2.0), label="cutting/grinding"),
]
res = hearing.task_based_exposure(tasks, include_duration_uncertainty=False, warn=False)
print(f"LEX,8h = {res.lex_8h:.1f} dB   U = {res.expanded_uncertainty:.1f} dB")
# LEX,8h = 84.3 dB   U = 2.7 dB
print(f"one-sided 95 % upper limit LEX,8h + U = {res.upper_limit:.1f} dB")   # 87.0 dB
for t in res.tasks:
    print(f"  {t.label:<16} Lp,A,eqT = {t.lp_aeqt:5.1f}   contributes {t.lex_8h_contribution:5.1f} dB")
#   planning/breaks  Lp,A,eqT =  70.0   contributes  62.7 dB
#   welding          Lp,A,eqT =  80.8   contributes  78.7 dB
#   cutting/grinding Lp,A,eqT =  90.1   contributes  82.8 dB

# The same shift measured job-based (Annex E) and full-day (Annex F): both use
# the Eq C.9 / Table C.4 sampling budget with k = 1.65 (one-sided 95 %).
job = hearing.job_based_exposure([88.1, 86.1, 89.7, 86.5, 91.1, 86.7], effective_duration_hours=7.5)
full = hearing.full_day_exposure([88.0, 91.9, 87.6, 90.4, 89.0, 88.4], effective_duration_hours=9.25)
print(f"job      LEX,8h = {job.lex_8h:.1f} dB   U = {job.expanded_uncertainty:.1f} dB")
# job      LEX,8h = 88.2 dB   U = 3.8 dB
print(f"full-day LEX,8h = {full.lex_8h:.1f} dB   U = {full.expanded_uncertainty:.1f} dB")
# full-day LEX,8h = 90.1 dB   U = 3.4 dB
```

<picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/exposure_uncertainty_dark.svg"><img src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/exposure_uncertainty.svg" alt="ISO 9612 Annex D task-based exposure: the three task LEX,8h contributions as bars, the energy-summed daily LEX,8h line and the one-sided 95 % upper limit LEX,8h + U band above it" width="80%"></picture>

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

```python
import matplotlib.pyplot as plt
from phonometry import hearing

# The ISO 9612 Annex D welder's day of the previous snippet.
tasks = [
    hearing.Task(samples=(70.0,), duration_hours=1.5, label="planning/breaks"),
    hearing.Task(samples=(80.1, 82.2, 79.6), duration_hours=5.0,
         duration_range=(4.0, 6.0), label="welding"),
    hearing.Task(samples=(86.5, 92.4, 89.3, 93.2, 87.8, 86.2), duration_hours=1.5,
         duration_range=(1.0, 2.0), label="cutting/grinding"),
]
res = hearing.task_based_exposure(tasks, include_duration_uncertainty=False, warn=False)

# One line: task contribution bars plus the LEX,8h and LEX,8h + U lines.
res.plot()
plt.show()
```

</details>

## 2. The Annex C uncertainty budget

Two subtleties are worth spelling out. First, the coverage factor is
$k = 1.65$ for a **one-sided** 95 % interval (Clause 14), because a hygienist
cares only about the *upper* bound: `res.upper_limit` = $L_{EX,8h} + U$ is the
value 95 % of measurements fall below, the number compared against an action
limit. Second, the task and job methods weight the *same* spread of samples
differently. The task sampling uncertainty $u_{1a}$ (Eq. C.6) divides the summed
squared deviations by $I(I-1)$ (the standard error of the mean, smaller by a
factor $\sqrt{I}$), whereas the job/full-day sampling uncertainty $u_1$ (Eq. C.12)
is the plain sample standard deviation with denominator $N-1$, whose contribution
$c_1 u_1$ is then read from **Table C.4** as a function of $(N, u_1)$. The same
raw scatter therefore inflates the job estimate more, which is the standard's
built-in penalty for coarser, fewer samples. (The printed job $L_{EX,8h}$ is
$88.2$ dB where Annex E reports $88.1$: the standard rounds the effective-day
level to $88.4$ before the duration normalisation; the library keeps it
unrounded.)

**What dominates the budget.** Annex C combines four sources in quadrature
(Table C.1): the **sampling** uncertainty ($u_{1a}$/$u_1$), the **duration**
uncertainty ($u_{1b}$, task-based only), the **instrument** ($u_2$, Table C.5)
and the **microphone position** ($u_3$, Clause C.6). The last two are small
and roughly fixed ($u_2 = 0.7$ dB for a class 1 sound level meter, 1.5 dB for
a class 2 meter or a personal exposimeter, and $u_3 = 1.0$ dB by default), so
in practice the **sampling term almost always dominates**: it scales with the
scatter of the measured levels, which in a real workplace easily reaches
several decibels and, entered in quadrature, swamps the sub-decibel
instrument and position terms. The practical consequence: a quadrature
budget is set by its largest term, so tightening the instrument grade buys
little once sampling scatter is large; the productive
move is *more samples* (the standard error falls as $1/\sqrt{I}$ or $1/\sqrt{N}$),
which is exactly what the Clause 9.3 / 10.4 advisories nudge you toward.
Because peak $L_{p,Cpeak}$ carries no Annex C sampling model (Table C.5,
Note 1), it is reported without an uncertainty, not with a zero one.

When a task's samples span **3 dB or more** (Clause 9.3), or the job contribution
$c_1 u_1$ exceeds 3.5 dB (Clause 10.4), or too few workers are covered
(Table 1 cumulative-duration), the result sets `sampling_advisory=True` and, with
`warn=True`, emits an `OccupationalExposureWarning` recommending more measurements. Peak
levels $L_{p,Cpeak}$ are reported **without** an uncertainty: Annex C gives no
method for them (Table C.5, Note 1), so peak-uncertainty is out of scope. The
three Annex D/E/F worked examples above are reproduced to the standard's printed
precision (Annex E's final rounding is disclosed above), and the theory is
derived on the [Theory](theory-environment-transport.md) page.

### `task_based_exposure()` / `job_based_exposure()` / `full_day_exposure()` parameters

| Parameter | Applies to | Type | Units | Range / default | Notes |
| :--- | :--- | :--- | :--- | :--- | :--- |
| `tasks` | task | list of `Task` | — | ≥ 1 | Each `Task` has `samples`, `duration_hours`, optional `duration_range`/`duration_samples`, `label`, `instrument` |
| `samples` | job / full-day | sequence | dB | ≥ 2 (≥ 5 / ≥ 3 advised) | Random `Lp,A,eqT` samples |
| `effective_duration_hours` | job / full-day | float | h | > 0 | Effective working-day duration $T_e$ |
| `instrument` | all | str | — | `'class1'`, `'class2'`, `'personal_exposimeter'` (default) | Selects $u_2$ (Table C.5) |
| `u3` | all | float | dB | default `1.0` | Microphone-position uncertainty (Clause C.6) |
| `include_duration_uncertainty` | task | bool | — | default `True` | `False` omits the $(c_{1b}u_{1b})^2$ term (Annex D case a) |
| `n_workers` / `sample_duration_hours` | job | int / float | — / h | default `None` | Table 1 cumulative-duration check |
| `warn` | all | bool | — | default `True` | Emit `OccupationalExposureWarning` for the sampling advisories |

All three return an `ExposureResult` with `lex_8h`, `combined_standard_uncertainty`
$u$, `expanded_uncertainty` $U = 1.65\ u$, `upper_limit` = $L_{EX,8h} + U$,
`sampling_advisory`, and (task-based) the per-task `tasks` breakdown; the
result's `.plot()` draws the per-task contribution bars with the $L_{EX,8h}$
and upper-limit lines (task-based results only, since the other strategies
carry no per-task breakdown).

## 3. The measurement report (`.report()`)

ISO 9612 Clause 15 lists what the measurement report shall state, down to the
requirement that the noise exposure level and the measurement uncertainty be
reported as *separate values*, each rounded to one decimal place.
`ExposureResult.report(path)` writes that report as a one-page PDF fiche laid
out like a prevention-service measurement sheet: the standard-basis line naming
the applied strategy, a header grid (company via `client`, worker(s)/job via
`specimen`, workplace via `test_room`, and the Clause 15 c `instrumentation`
and `calibration` free-text fields of `ReportMetadata`), the work analysis
(the per-task table with the contribution chart for a task-based result, or
the sampling summary with the Formula C.9 budget for job-based/full-day), the
boxed $L_{EX,8h}$ with $U$, $k = 1.65$ and the one-sided 95 % upper limit, an
assessment table against the exposure action values (80/85 dB(A)) and the
exposure limit value (87 dB(A)) of Directive 2003/10/EC with a PASS/FAIL
verdict against the limit value, and a footer identity block. A printed note
records that the limit value applies to the effective exposure with the worn
hearing protectors' attenuation taken into account, which the measured
$L_{EX,8h}$ does not include. `verbose=True` adds the per-task Annex C
uncertainty columns ($u_{1a}$, $u_{1b}$, $u_2$); `language="es"` renders the
Spanish fiche (nivel de exposición diario equivalente, comma decimals).
Rendering needs the optional `phonometry[report]` extra (reportlab), plus
matplotlib for the task-based chart.

```python
from phonometry import hearing, ReportMetadata

res = hearing.task_based_exposure(tasks, warn=False)  # the Annex D day above
res.report(
    "lex8h.pdf",
    metadata=ReportMetadata(
        client="Example fabrication works",
        specimen="Welders (homogeneous exposure group, 4 workers)",
        test_room="Steel assembly hall, line 2",
        instrumentation="Personal sound exposure meter (IEC 61252), s/n 0042",
        calibration="Calibrator IEC 60942 class 1; field checks within 0.3 dB",
        report_id="EXAMPLE-9612",
    ),
)   # LEX,8h = 84.3 dB, U = 3.2 dB -> lower action value exceeded, limit PASS
```

The rendered example fiche, regenerated with `make reports`, is kept in the
repository. Click the preview to open the PDF:

[![ISO 9612 occupational noise-exposure example report: a header with the company, exposure group, workplace and instrumentation/calibration, the task-based work-analysis table with durations, sample counts, task levels and LEX,8h contributions, the per-task contribution chart, the boxed LEX,8h = 84.3 dB with U = 3.2 dB, and the Directive 2003/10/EC assessment where the 80 dB(A) lower action value is exceeded and the 85/87 dB(A) values are not, ending in a PASS verdict](https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/reports/iso9612_exposure_example.webp)](https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/reports/iso9612_exposure_example.pdf)

*Occupational noise-exposure fiche (`ExposureResult.report`), the ISO 9612
Annex D task-based day with the Directive 2003/10/EC assessment.*

## See also

- [Levels](levels.md): the `lex_8h` / `sound_exposure` dose primitives
  (IEC 61252) and the LCpeak these strategies report alongside.
- [Measurement uncertainty](gum-uncertainty.md): the GUM machinery behind
  combined and expanded uncertainties.
- [Theory](theory-environment-transport.md): the derivation of the strategy formulas and the
  Annex C budget.
- API reference: [`hearing.occupational_exposure`](https://jmrplens.github.io/phonometry/reference/api/hearing/occupational-exposure/).

## References

- International Organization for Standardization. (2009). *Acoustics —
  Determination of occupational noise exposure — Engineering method*
  (ISO 9612:2009). [iso.org catalogue](https://www.iso.org/standard/41718.html).
  The implemented method: the three strategies, the microphone placement of
  Clause 12.3, the Annex C uncertainty budget and the Annex D/E/F worked
  examples.
- European Parliament and Council. (2003). *Directive 2003/10/EC on the
  minimum health and safety requirements regarding the exposure of workers to
  the risks arising from physical agents (noise)*. Official Journal of the
  European Union.
  [eur-lex.europa.eu](https://eur-lex.europa.eu/eli/dir/2003/10/oj/eng).
  The EU exposure action values (80/85 dB) and limit value (87 dB) that the
  `LEX,8h` and its upper limit are assessed against.
- National Institute for Occupational Safety and Health. (1998). *Criteria for
  a recommended standard: Occupational noise exposure — Revised criteria 1998*
  (DHHS/NIOSH Publication No. 98-126).
  [doi:10.26616/NIOSHPUB98126](https://doi.org/10.26616/NIOSHPUB98126),
  [free PDF](https://www.cdc.gov/niosh/docs/98-126/pdfs/98-126.pdf).
  The freely available criteria document behind the 85 dB(A) recommended
  exposure limit and the hearing-conservation rationale for measuring the
  daily dose.

## Standards

ISO 9612:2009, *Acoustics — Determination of occupational noise
exposure — Engineering method*: the task-based (Clause 9), job-based
(Clause 10) and full-day (Clause 11) strategies, the Annex C uncertainty budget
(Formulae C.6, C.9 and C.12, Tables C.4/C.5) and the one-sided coverage factor
k = 1.65 (Clause 14), validated against the worked examples of Annexes D, E
and F.
