Skip to content

Integrated and Statistical Levels

Standards: IEC 61672IEC 61252ISO 1996BS 7445Key references: Kinsler et al. 2000Bies et al. 2017

A noise measurement rarely ends with a waveform: it ends with a handful of single numbers that a limit, a regulation or a report can be checked against. This page is that reduction chain, computed directly from the calibrated signal in pascals rather than from meter readouts: the equivalent continuous level /, the percentile levels , the event and peak measures (/SEL, ), the noise dose of IEC 61252 and the whole-day descriptors / with the ISO 1996-1 rating levels. Working from the signal means each definition (an integral, a percentile, an energy sum) is applied exactly, with no detector or display approximation in between.

Which descriptor fits which question follows the ISO 1996-1 quantity families (BS 7445-1 is the survey-practice guide to the same choice, and Bies, Hansen & Howard 2017, §2.5 surveys them side by side):

  • Accumulated exposure over an interval: /, the energy mean. It answers “how much sound arrived in total”, regardless of how it was distributed in time.
  • How the fluctuating level was distributed: the percentiles : as the background level, as the intrusive traffic indicator, as the median. Two signals with the same can have very different spreads.
  • Single events of different durations, compared fairly: SEL, the event’s whole energy normalized to one second.
  • Hearing-risk screening: and the dose measures, which feed the occupational workflow of Occupational exposure (ISO 9612).
  • Long-term community annoyance: / and the ISO 1996-1 rating levels, which weight evening and night energy before averaging the day.

Two boundaries with the sibling pages are worth keeping sharp. The integrated metrics here deliberately bypass the exponential detector: and SEL have no time constant, and Fast/Slow ballistics enter only through the percentile levels, which are defined on the time-weighted level track (see Time Weighting). And everything on this page assumes the signal is already in pascals: the sensitivity factor that gets it there is the subject of Calibration.

The equivalent continuous level integrates the squared pressure over the measurement time:

and is the same integral after A-weighting the signal. is the level exceeded of the time: the -th percentile of the time-weighted level distribution.

import numpy as np
from phonometry import metrology
# recording: a calibrated microphone capture (Pa) — recorded through your measurement chain. Synthesized here so the guide runs standalone.
fs = 48000
recording = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)
sensitivity = 1.0 # calibration_factor (see Calibration)
# Equivalent continuous level of the whole recording
level = metrology.leq(recording, calibration_factor=sensitivity)
# A-weighted Leq (the standard environmental noise metric)
la = metrology.laeq(recording, fs, calibration_factor=sensitivity)

Both accept 1D signals (returning a scalar) or 2D [channels, samples] arrays (returning one level per channel), and support dbfs=True for digital full-scale analysis (calibration does not apply in dBFS mode).

Why the energy mean and not the arithmetic mean of dB values? Because sound doses add as energy: two periods at 60 dB and 80 dB do not average to 70 dB; the 80 dB half dominates and = 77 dB. Averaging decibels directly underestimates every fluctuating noise. is the level of the steady sound carrying the same energy as the real, fluctuating one, which is why regulations are written in terms of it.

The same rule governs every combination of levels: period levels into a whole-day value, microphone positions into a room average, repeated measurements into a mean. Combine energies, 10 * np.log10(np.mean(10 ** (L / 10))), never the dB values. The arithmetic-mean error is one-sided (it always under-reads) and grows with the spread, so it does not cancel out over many measurements: with values spread over 10 dB it already costs a couple of decibels. The few normative formulas that do average decibels directly are deliberate approximations and say so (ISO 1996-2 offers one as a substitute for repeated-measurement uncertainty and warns it inflates once levels spread beyond 3 dB, see the uncertainty section below); everywhere else, energy.

ParameterType / shapeUnitsRange / defaultNotes
x1D or 2D arraydigital units (or Pa if calibrated)non-empty2D is [channels, samples]; returns one level per channel
fsintHz> 0 (laeq only)leq needs no sample rate (pure RMS integral)
calibration_factorfloatPa per digital unitdefault 1.0From sensitivity()
dbfsbooldefault FalseTrue: 0 dBFS = full-scale RMS sine; ignores calibration

ln_levels computes statistical levels from the time-weighted envelope: L10 is the level exceeded 10 % of the time (event peaks), L50 the median, L90 the background level.

import numpy as np
from phonometry import metrology
# A steady tone gives L10 = L50 = L90; percentiles only tell a story for a
# *fluctuating* level. Synthesize 3 s alternating between a quiet and a
# ~10 dB louder half-second so the statistics separate.
fs = 48000
rng = np.random.default_rng(0)
segment = fs // 2 # 0.5 s per level
quiet = 0.02 * rng.standard_normal(segment) # background
loud = 0.06 * rng.standard_normal(segment) # ~10 dB louder events
varying = np.tile(np.concatenate([quiet, loud]), 3)
stats = metrology.ln_levels(varying, fs, n=(10, 50, 90), weighting="A")
print(f"LA10={stats[10]:.1f} LA50={stats[50]:.1f} LA90={stats[90]:.1f} dB")
# LA10=66.6 LA50=65.2 LA90=58.5 dB -> L10 (events) > L50 (median) > L90 (background)
Fast level history of fluctuating noise with the L10, L50 and L90 statistical levels markedFast level history of fluctuating noise with the L10, L50 and L90 statistical levels marked

L10 tracks the event peaks, L50 the median level and L90 the background.

Show the code for this figure
import numpy as np
import matplotlib.pyplot as plt
from phonometry import metrology
# The fluctuating signal of the ln_levels example: 0.5 s of background
# alternating with 0.5 s of ~10 dB louder events, repeated 3 times
fs = 48000
rng = np.random.default_rng(0)
segment = fs // 2
quiet = 0.02 * rng.standard_normal(segment)
loud = 0.06 * rng.standard_normal(segment)
varying = np.tile(np.concatenate([quiet, loud]), 3)
# Fast mean-square envelope -> level vs time, plus the percentile levels
envelope = metrology.time_weighting(varying, fs, mode="fast")
level_t = 10 * np.log10(np.maximum(envelope, 1e-12) / (2e-5) ** 2)
stats = metrology.ln_levels(varying, fs, n=(10, 50, 90))
t = np.arange(varying.size) / fs
fig, ax = plt.subplots()
ax.plot(t, level_t, linewidth=0.8, label="Fast level Lp(t)")
for i, (n_value, style) in enumerate([(10, "--"), (50, "-"), (90, "-.")], 1):
ax.axhline(float(stats[n_value]), color=f"C{i}", linestyle=style,
label=f"L{n_value} = {stats[n_value]:.1f} dB")
ax.set(xlabel="Time [s]", ylabel="Level [dB]")
ax.legend(loc="lower right")
plt.show()

Options: mode selects the envelope ballistics ('fast', 'slow', 'impulse'), weighting applies A/C weighting first, and calibration_factor/dbfs behave as in leq. The integrator attack transient (~5τ) is discarded before taking percentiles, so the leading settling ramp is not counted in the low percentiles.

Formally, is the -th percentile of the distribution of the time-weighted level: the recording is first turned into a level-vs-time envelope (Fast by default), and is the envelope value exceeded 10 % of the time. That makes the ballistics choice part of the metric: an from a Slow envelope is systematically lower than from a Fast one on impulsive noise, so regulations always name the time weighting.

and the family answer different questions about the same level history. is an energy mean, so the loudest moments dominate it: a single second at 100 dB lifts the of an otherwise steady 60 dB hour to about 66 dB, while , and even barely move (a one-second event occupies far less than 10 % of the hour). Percentiles are rank statistics, robust against rare events by construction. In practice:

  • (and ) is the dose metric: regulations, exposure and annoyance models are written in it precisely because it refuses to ignore rare loud events.
  • estimates the residual (background) level under an intermittent source, which is how ISO 1996-2 Annex I uses it.
  • tracks event peaks; the spread is a quick intermittency indicator.
  • measures how “peaky” the history is: for steady noise the two nearly coincide, and the more the level fluctuates the further climbs above the median (for a Gaussian level distribution with standard deviation dB, ).

One caution: percentiles do not combine. Two hours with known values do not yield the two-hour by any formula; recompute it from the pooled envelope. values, by contrast, combine exactly by time-weighted energy averaging, which is what composite_rating_level does below.

ParameterType / shapeUnitsRange / defaultNotes
x1D or 2D arraydigital unitsnon-empty2D returns per-channel dicts
fsintHz> 0Needed by the envelope detector
ntuple of ints%default (10, 50, 90)Any exceedance percentages, e.g. (1, 5, 95)
modestr'fast' (default), 'slow', 'impulse'IEC 61672-1 ballistics of the envelope
weightingstr or None'A', 'C', 'G', 'Z', None (default)Frequency weighting before the envelope
calibration_factor / dbfsfloat / boolas leqSame semantics as in leq()
import numpy as np
from phonometry import metrology
# recording: a calibrated microphone capture (Pa) — recorded through your measurement chain. Synthesized here so the guide runs standalone.
fs = 48000
recording = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)
sensitivity = 1.0 # calibration_factor (see Calibration)
# C-weighted peak (IEC 61672-1 §5.13) - occupational action limits use this
peak = metrology.lc_peak(recording, fs, calibration_factor=sensitivity)
# A single noise event and a work-shift sample (slices of a real recording)
event = recording
shift_sample = recording
# Sound exposure level: single-event level normalized to 1 s (LAE)
lae = metrology.sel(event, fs, weighting="A", calibration_factor=sensitivity)
# Daily noise dose (IEC 61252): exposure in Pa²·h and LEX,8h / LEP,d
E = metrology.sound_exposure(shift_sample, fs, duration_hours=8, calibration_factor=sensitivity)
lex = metrology.lex_8h(shift_sample, fs, duration_hours=8, calibration_factor=sensitivity)

lc_peak is verified against the one-cycle/half-cycle reference responses of IEC 61672-1:2013 Table 5, sel against the Table 4 LAE toneburst column, and the dose functions against the IEC 61252 anchors (3.2 Pa²h ↔ exactly 90 dB). lc_peak polyphase-oversamples the C-weighted signal by oversample (default 8) before taking the maximum, recovering the true inter-sample peak: a raw on-grid maximum under-reads sustained HF tones by up to ~1.15 dB (an 8 kHz tone at 48 kHz is only 6 samples/cycle). Set oversample=1 to detect the peak on the original sample grid. With duration_hours, the input is treated as a representative sample of that exposure period; without it, the input is the whole event.

SEL: comparing events of different duration

Section titled “SEL: comparing events of different duration”

A 4 s train pass-by and a 30 s one cannot be compared by their alone: the longer event delivers more energy at the same level. The sound exposure level compresses the whole event energy into exactly one second:

so events of any duration become directly comparable, and identical events sum as . This is the building block of airport and railway noise models.

A vehicle pass-by level history with its Leq over the whole event and the equal-energy one-second SEL blockA vehicle pass-by level history with its Leq over the whole event and the equal-energy one-second SEL block
Show the code for this figure
import numpy as np
import matplotlib.pyplot as plt
from phonometry import metrology
# A vehicle pass-by: noise under a gaussian energy envelope (dBFS analysis)
fs = 48000
t = np.arange(int(8.0 * fs)) / fs
rng = np.random.default_rng(11)
x = 0.3 * np.exp(-0.5 * ((t - 4.0) / 1.1) ** 2) * rng.standard_normal(t.size)
level = 10 * np.log10(np.maximum(metrology.time_weighting(x, fs, mode="fast"), 1e-12))
l_sel = float(metrology.sel(x, fs, dbfs=True))
l_eq = float(metrology.leq(x, dbfs=True))
print(f"Leq = {l_eq:.1f} dBFS, SEL = {l_sel:.1f} dBFS")
# Leq = -16.6 dBFS, SEL = -7.6 dBFS -> the 1 s block carries the event energy
fig, ax = plt.subplots()
ax.plot(t, level, linewidth=1.0, label="Fast level of the event")
ax.hlines(l_eq, 0, 8, color="C2", linestyle="--",
label=f"Leq over the whole event = {l_eq:.1f} dBFS")
ax.fill_between([3.5, 4.5], -55, l_sel, color="C1", alpha=0.25)
ax.hlines(l_sel, 3.5, 4.5, color="C1", linewidth=2,
label=f"SEL = {l_sel:.1f} dBFS: same energy in 1 s")
ax.set(xlabel="Time [s]", ylabel="Level [dBFS]", ylim=(-55, l_sel + 6))
ax.legend(loc="lower left")
plt.show()

Occupational regulations limit the daily dose, not the level. IEC 61252 expresses it as sound exposure in pascal-squared-hours (the time integral of the squared A-weighted pressure) and the equivalent normalized 8 h level:

The anchor worth memorizing: 3.2 Pa²h ⇔ exactly 90 dB over 8 h (the CI suite enforces it). Half the dose is −3 dB; double duration at the same level is +3 dB.

FunctionKey parametersReturnsStandard anchor
lc_peak(x, fs, calibration_factor=1.0, dbfs=False)dbfs=True references full-scale peak (1.0), not RMSLCpeak [dB]IEC 61672-1 §5.13, Table 5 tone bursts
sel(x, fs, weighting=None, ...)weighting='A' gives LAESEL [dB]IEC 61672-1 Table 4 (LAE column)
sound_exposure(x, fs, duration_hours=None, ...)duration_hours treats x as a sample of that periodE [Pa²h]IEC 61252
lex_8h(x, fs, duration_hours=None, ...)same sampling semanticsLEX,8h [dB]IEC 61252 (≡ LEP,d)

lex_8h rates one recording; assembling a full working day from task or job samples, with the normative ISO 9612 uncertainty budget, continues in Occupational Noise Exposure.

Environmental noise: Lden, Ldn and rating levels (ISO 1996-1)

Section titled “Environmental noise: Lden, Ldn and rating levels (ISO 1996-1)”

Regulatory noise assessment weights evenings and nights more heavily. lden() implements the day-evening-night level of ISO 1996-1:2016 (3.6.4: +5 dB evening, +10 dB night, default 12/4/8 h periods, adjustable because countries define them differently), ldn() the day-night variant (3.6.5), and composite_rating_level() the general whole-day composite of clause 6.5 (Formulae 5-6) for arbitrary periods with source or character adjustments (Table A.1: e.g. +5 dB regular impulsive, +12 dB highly impulsive, +3 to +6 dB prominent tones):

from phonometry import environmental
l = environmental.lden(63.2, 58.1, 51.4) # from LAeq per period
r = environmental.composite_rating_level([(63.2, 12, 0.0), # day
(58.1, 4, 5.0), # evening (+5)
(51.4, 8, 10.0)]) # night (+10) == environmental.lden
Synthetic 24-hour urban LAeq profile with day, evening and night bands, the +5 and +10 dB weighted period levels and the resulting LdenSynthetic 24-hour urban LAeq profile with day, evening and night bands, the +5 and +10 dB weighted period levels and the resulting Lden
Show the code for this figure
import numpy as np
import matplotlib.pyplot as plt
from phonometry import environmental
# Synthetic hourly LAeq of an urban road (dB), hours 00 to 23
laeq_h = np.array([48, 46, 45, 45, 46, 50, 56, 64, 66, 65, 63, 63,
64, 63, 63, 64, 65, 66, 65, 64, 63, 62, 61, 50], dtype=float)
def period_leq(idx):
return 10 * np.log10(np.mean(10 ** (laeq_h[idx] / 10))) # energy mean
ld = period_leq(np.arange(7, 19)) # day 07-19
le = period_leq(np.arange(19, 23)) # evening 19-23
ln_ = period_leq(np.r_[23, np.arange(0, 7)]) # night 23-07
l_den = environmental.lden(ld, le, ln_)
print(f"Lden = {l_den:.1f} dB") # Lden = 64.3 dB
fig, ax = plt.subplots()
ax.axvspan(19, 23, color="C1", alpha=0.15) # evening
ax.axvspan(23, 24, color="C0", alpha=0.15); ax.axvspan(0, 7, color="C0", alpha=0.15)
ax.step(np.arange(25), np.r_[laeq_h, laeq_h[-1]], where="post",
color="0.3", label="Hourly LAeq")
ax.hlines(ld, 7, 19, color="C2", linestyle="--", label="Lday (+0 dB)")
ax.hlines(le + 5, 19, 23, color="C1", linestyle="--", label="Levening + 5 dB")
ax.hlines([ln_ + 10, ln_ + 10], [23, 0], [24, 7], color="C0",
linestyle="--", label="Lnight + 10 dB")
ax.hlines(l_den, 0, 24, color="C3", linewidth=2, label=f"Lden = {l_den:.1f} dB")
ax.set(xlabel="Hour of day", ylabel="Level [dB]", xlim=(0, 24))
ax.legend(loc="upper left", fontsize=8, ncol=2)
plt.show()

lden() / ldn() / composite_rating_level() parameters

Section titled “lden() / ldn() / composite_rating_level() parameters”
FunctionKey parametersNotes
lden(lday, levening, lnight, hours=(12, 4, 8))period LAeq values [dB]; hours must sum to 24+5 dB evening, +10 dB night (3.6.4)
ldn(lday, lnight, hours=(15, 9))+10 dB night (3.6.5)
composite_rating_level(periods)iterable of (level_db, hours, adjustment_db); hours positive, finite and summing to 24General Formulae (5)-(6); adjustments per Table A.1

Where you put the microphone changes the number: ISO 1996-2 fixes the receiver positions and their façade corrections. The diagram is measurement context; apply the corrections to your levels before analysis:

Environmental noise measurement positions per ISO 1996-2: free field, 2 m from the facade and flush-mounted, with their correctionsEnvironmental noise measurement positions per ISO 1996-2: free field, 2 m from the facade and flush-mounted, with their corrections

Combine with laeq() per time period to go from recordings to Lden, and with the tone_to_noise_ratio() / prominence_ratio() verdicts of Prominent Discrete Tones to justify tonal adjustments.

Determining levels: tonal adjustment, residual noise and uncertainty (ISO 1996-2)

Section titled “Determining levels: tonal adjustment, residual noise and uncertainty (ISO 1996-2)”

ISO 1996-2:2017 is the determination part: how the measured level is turned into a rating level and reported with its uncertainty. The rating-level summation and the time-of-day penalties live in ISO 1996-1 (above); ISO 1996-2 supplies the tonal adjustment, the residual-noise correction and the uncertainty budget.

Tonal adjustment (engineering method, Annex C). From the energy-summed tone level and the masking-noise level in the critical band around a tone, the audibility above the masking threshold is dB (Formula (C.3)), and the adjustment is for , for and above (Formulae (C.4)–(C.6)). The critical bandwidth is 100 Hz up to 500 Hz and 20 % of above (Table C.1). The one-third-octave survey method (tonal_seeking_survey) flags a band exceeding both neighbours by 15/8/5 dB (low/mid/high), and tonal_adjustment_from_mean_audibility maps the ISO/PAS 20065 mean audibility to (Table J.1).

ISO 1996-2 tonal adjustment Kt as a piecewise function of the tonal audibility: zero below 4 dB, rising linearly to 6 dB between 4 and 10 dB, and 6 dB above, with the four Annex C.5 worked examples and a mid-range tone markedISO 1996-2 tonal adjustment Kt as a piecewise function of the tonal audibility: zero below 4 dB, rising linearly to 6 dB between 4 and 10 dB, and 6 dB above, with the four Annex C.5 worked examples and a mid-range tone marked
Show the code for this figure
import matplotlib.pyplot as plt
from phonometry import environmental
# ISO 1996-2:2007 Annex C.5, Example 2 (two tones near 400 Hz):
res = environmental.assess_tonal_audibility(tone_level=54.1, masking_noise_level=45.2,
centre_frequency=430.0)
print(res.audibility, res.adjustment) # ΔLta ≈ 11.1 dB -> Kt = 6 dB
res.plot()
plt.show()

Residual-noise correction (Clause 10.4). residual_sound_correction() applies (Formula (16)). With a residual within 3 dB of the measured level no correction is allowed: the uncorrected measured level is then the reportable value, as an upper bound of the specific sound (exposed as reportable_upper_bound, with reliable=False). gaussian_residual_level() estimates the residual from percentile levels (Annex I) and rejects inverted percentile orderings.

Measurement uncertainty (Clause 4, Annex F). combined_standard_uncertainty() forms (Formula (2)) and environmental_expanded_uncertainty() applies (95 %) or (80 %); residual_correction_uncertainty() carries the residual-correction sensitivity (Formulae (F.7)/(F.8)) and uncertainty_from_repeated_measurements() the repeated-measurement standard uncertainty: the primary energy-domain route (Formulae (17)+(19)), with the level-domain Note 2 substitute (Formula (20)) reported alongside as approximate_uncertainty and a warning when the levels spread beyond 3 dB, where the substitute grossly inflates.

from phonometry import environmental
tonal = environmental.assess_tonal_audibility(54.1, 45.2, 430.0) # TonalAssessmentResult
kt = tonal.adjustment # 6 dB
tonal.plot() # this audibility on the Kt curve, as in the figure above
corr = environmental.residual_sound_correction(measured_level=58.0, residual_level=50.0)
u = environmental.combined_standard_uncertainty([0.59, 0.3, 2.0, 0.40, 0.38]) # 2.18 dB (G.2)
environmental.expanded_uncertainty(u) # 4.36 dB (k = 2)

Short-time fractional-octave analysis: one level per band per window, time-aligned across bands.

import numpy as np
from phonometry import metrology
# recording: a calibrated microphone capture (Pa) — recorded through your measurement chain. Synthesized here so the guide runs standalone.
fs = 48000
recording = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)
bank = metrology.OctaveFilterBank(fs=48000, fraction=3)
levels, freq, times = bank.spectrogram(recording, window_time=0.125, overlap=0.5)
# levels: (bands, frames) — ready for pcolormesh(times, freq, levels)
One-third-octave spectrogram of a logarithmic sweep with two tone burstsOne-third-octave spectrogram of a logarithmic sweep with two tone bursts

A logarithmic sweep plus two tone bursts, resolved in time and in standardized 1/3-octave bands.

Show the code for this figure
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import chirp
from phonometry import metrology
# Log sweep 80 Hz -> 8 kHz plus two tone bursts, in a little noise
fs = 48000
t = np.arange(int(4.0 * fs)) / fs
x = 0.5 * chirp(t, f0=80, t1=4.0, f1=8000, method="logarithmic")
x[int(1.0 * fs):int(1.3 * fs)] += np.sin(2 * np.pi * 4000 * t[: int(0.3 * fs)])
x[int(2.5 * fs):int(2.8 * fs)] += np.sin(2 * np.pi * 250 * t[: int(0.3 * fs)])
x += 0.01 * np.random.default_rng(42).standard_normal(t.size)
bank = metrology.OctaveFilterBank(fs=fs, fraction=3, order=6, limits=[50.0, 12000.0])
levels, freq, times = bank.spectrogram(x, window_time=0.125, overlap=0.5)
fig, ax = plt.subplots()
mesh = ax.pcolormesh(times, freq, levels, shading="auto")
ax.set_yscale("log")
ax.set(xlabel="Time [s]", ylabel="Frequency [Hz]")
fig.colorbar(mesh, label="Level [dB]")
plt.show()
  • Multichannel input (channels, samples) returns (channels, bands, frames).
  • times holds each window’s center in seconds.
  • mode='peak' gives per-window peak-holding levels instead of RMS.
  • zero_phase=True filters bands forward-backward so per-band group delay does not skew the frames (offline analysis only).
ParameterTypeUnitsRange / defaultNotes
x1D or 2D arraydigital unitsnon-empty2D returns (channels, bands, frames)
window_timefloats> 0; default 0.125Frame length (0.125 s mirrors Fast)
overlapfloat0 ≤ overlap < 1; default 0.5Fraction of window overlap (0 = none)
modestr'rms' (default) or 'peak'Per-window detector
detrendbooldefault TrueRemove each band’s DC offset before the level (improves low-frequency accuracy)
zero_phasebooldefault FalseForward-backward filtering (offline only)
calibration_factor / dbfsconstructor-onlySet on OctaveFilterBank(...), not per call

See Calibration and dBFS to convert digital units to physical SPL, and Time Weighting for the envelope details. The ISO 9612 occupational strategies continue in Occupational Noise Exposure, the ECMA-418-1 tonal-prominence verdicts in Prominent Discrete Tones, and the ISO 226 equal-loudness contours live with the perception metrics in Loudness. Whether a single Leq is a fair summary of a measurement at all is a stationarity question - the data qualification tests answer it objectively from segment mean squares.

Covered. IEC 61672-1:2013’s Fast/Slow/Impulse envelope ballistics behind the percentile levels, the C-weighted peak of clause 5.13 (lc_peak, verified against Table 5) and the sound exposure level (sel, verified against the Table 4 LAE column); IEC 61252:1993’s sound exposure and LEX,8h (sound_exposure, lex_8h); ISO 1996-1:2016’s Lden, Ldn and composite rating level (clause 6.5, environmental.lden/ldn/ composite_rating_level); and ISO 1996-2:2017’s tonal adjustment (Annex C), residual-noise correction (Clause 10.4) and measurement uncertainty budget (Clause 4, Annex F).

Not covered. IEC 61252 was revised in 2025; only the formulae of the implemented first edition (1993) are here, not the newer one. ISO 1996-2 fixes the receiver positions and the façade corrections that turn a raw measurement into the level this page’s functions expect: those position and correction procedures are not implemented, only the arithmetic that follows once you have applied them.

What is the difference between Leq and SEL?

Section titled “What is the difference between Leq and SEL?”

is the equivalent continuous level: the energy mean of the squared pressure over the measurement time , referenced to . SEL, the sound exposure level ( when A-weighted), compresses the whole event energy into exactly one second: with , so events of any duration become directly comparable and identical events sum as .

What sound exposure corresponds to 90 dB over an 8-hour working day?

Section titled “What sound exposure corresponds to 90 dB over an 8-hour working day?”

Per IEC 61252:1993, the sound exposure is the time integral of the squared A-weighted pressure, expressed in pascal-squared-hours, and (equivalent to ) is the corresponding level normalized to 8 h. The anchor worth memorizing: 3.2 Pa²h corresponds to exactly 90 dB over 8 h. Half the dose is -3 dB, and double duration at the same level is +3 dB.

What penalties does Lden apply to evening and night noise?

Section titled “What penalties does Lden apply to evening and night noise?”

, the day-evening-night level of ISO 1996-1:2016 (3.6.4), adds +5 dB to the evening level and +10 dB to the night level before energy-averaging the whole day, with default periods of 12, 4 and 8 hours, adjustable because countries define them differently. The day-night variant (3.6.5) keeps only the +10 dB night penalty.

Created and maintained by· GitHub· PyPI· All projects