Skip to content
This documentation describes version 4.0.0, which is not released yet. The current version on PyPI is 3.3.0 and does not carry everything described here.

psychoacoustics.loudness.moore_glasberg_time

Time-varying loudness per ISO 532-3:2023 (Moore-Glasberg-Schlittenlacher).

Clean-room implementation of the time-varying loudness model of ISO 532-3:2023, the extension of the stationary Moore-Glasberg method of ISO 532-2:2017 to sounds whose loudness changes over time. The procedure of Clause 7 turns a calibrated pressure waveform into two time histories:

  • the short-term loudness S'(t) in sone (clause 7.8), the momentary loudness of a short segment such as a spoken word or a musical note; and
  • the long-term loudness S''(t) in sone (clause 7.9), the loudness of a longer segment such as a whole sentence or musical phrase.

The signal chain is:

  • a running short-term spectrum computed from six parallel Hann-windowed FFTs whose segment durations (2, 4, 8, 16, 32 and 64 ms) trade temporal against spectral resolution, each contributing only its own frequency range, updated every 1 ms (clause 7.3);
  • the level-dependent rounded-exponential excitation pattern of ISO 532-2 sampled on the ERB-number grid from 1.75 Cam to 39 Cam in 0.25 Cam steps (clause 7.4, Formulae 1-6);
  • the compressive transformation of excitation into instantaneous specific loudness N'(i) in sone/Cam (clause 7.5, Formulae 7-9, Tables 2-4, with sone/Cam);
  • an attack/release temporal smoothing of the specific loudness at every centre frequency to the short-term specific loudness (clause 7.6, Formulae 10-13);
  • the across-frequency smoothing and binaural inhibition of ISO 532-2 (clause 7.7, Formulae 14-17), and integration over the ERB-number scale to the short-term loudness of each ear and their binaural sum (clause 7.8);
  • a slower attack/release temporal smoothing of the short-term loudness to the long-term loudness (clause 7.9, Formulae 18-21).

The loudness of a sound lasting up to about 5 s is well predicted by the maximum of the long-term loudness (clause 7.9); this n_max and the corresponding loudness level in phon (Table 5) are the headline results the standard asks to report (clause 9). A steady 1 kHz tone at 40 dB SPL presented binaurally in a free field yields a long-term loudness of 1.000 sone (40 phon) by definition of the sone; the additive spectral calibration of clause 7.3 (nominally +3.32 dB per component) is set so this anchor holds exactly.

Conformance mode for the sampling rate. Clause 5 prescribes converting the input to 32 kHz and clause 7.3 uses fixed 2048-point FFTs; this implementation deliberately processes at the native sampling rate and grows the FFT to max(2048, next_pow2(segment)) so the 64 ms Hann window is never truncated at 44.1/48 kHz (see test_low_freq_band_not_truncated_across_sample_rates). The spectral calibration _SPECTRAL_CAL_DB was fixed against the 32 kHz anchor; at other rates the Annex C.1 anchor reproduces with a 0.3 % cross-rate spread (a 0.5 s tone reads n_max = 0.9918 / 0.9926 / 0.9900 at 32 / 44.1 / 48 kHz; a settled 1.3 s tone 1.0000 / 1.0000 / 0.9982), far inside the standard’s 2.8 phon expanded uncertainty. These values are pinned by the test suite; resample to 32 kHz first if letter-of-standard processing is required.

Auto-generated from the source docstrings by scripts/generate_api_docs.py (make api-docs). Do not edit by hand.

loudness_moore_glasberg_time(
signal: Signal | Sequence[float] | np.ndarray,
fs: float | None = None,
*,
field: Literal['free', 'diffuse', 'eardrum'] = 'free',
presentation: Literal['binaural', 'diotic', 'monaural'] = 'binaural',
percentiles: Sequence[float] = (1.0, 5.0, 10.0, 50.0, 90.0, 95.0),
) -> MooreGlasbergTimeVaryingLoudness

Time-varying loudness of a calibrated pressure signal (ISO 532-3:2023).

Implements the Moore-Glasberg-Schlittenlacher method: a running short-term spectrum (six parallel FFTs, clause 7.3) feeds the ISO 532-2 excitation and specific-loudness model (clauses 7.4, 7.5), which is integrated over time to the short-term loudness S'(t) (clauses 7.6-7.8) and long-term loudness S''(t) (clause 7.9). The signal must be calibrated so its samples are the instantaneous sound pressure in pascals.

Parameters

NameDescription
signalCalibrated pressure signal in pascals. A 1-D array is treated as diotic (the same sound at both ears) for a binaural/diotic presentation, or as the single active ear for a monaural presentation; a two-channel (n, 2) array gives the left and right ear signals. Accepts a phonometry.io.Signal, which is where “calibrated” comes from without arithmetic: this model reads absolute levels, so an uncalibrated record is taken as if one digital unit were one pascal and the answer is wrong by however far that is from true.
fsSampling rate in Hz (positive). Required for a bare array; a Signal brings its own, and an explicit value that disagrees with it raises instead of silently winning.
fieldListening condition setting the outer-ear transfer: "free" (frontal free field, default), "diffuse" (diffuse field) or "eardrum" (levels already at the tympanic membrane).
presentation"binaural"/"diotic" (default) or "monaural".
percentilesFractions (percent) for which the exceeded long-term loudness is reported.

Returns: A MooreGlasbergTimeVaryingLoudness.

A steady 1 kHz tone at 40 dB SPL, binaural, free field, yields a peak long-term loudness of 1.000 sone (40 phon) by definition of the sone.

MooreGlasbergTimeVaryingLoudness(
time: np.ndarray,
short_term_loudness: np.ndarray,
long_term_loudness: np.ndarray,
short_term_loudness_level: np.ndarray,
long_term_loudness_level: np.ndarray,
n_max: float,
loudness_level_max: float,
percentiles: dict[float, float],
field: str,
presentation: str,
)

Result of an ISO 532-3:2023 time-varying loudness calculation.

time is the frame time axis in seconds (1 ms spacing, clause 7.3). short_term_loudness and long_term_loudness are the binaural short-term S'(t) (clause 7.8) and long-term S''(t) (clause 7.9) loudness traces in sone; short_term_loudness_level and long_term_loudness_level are the corresponding loudness levels in phon (Table 5). n_max is the maximum of the long-term loudness (sone) - the predictor of the loudness of sounds up to about 5 s (clause 7.9) - and loudness_level_max the phon value it maps to. percentiles gives the long-term-loudness values (sone) exceeded for the stated fraction of the active trace (e.g. percentiles[5] is the level exceeded 5 % of the time); the standard itself reports only the peak long-term loudness (clause 9), the percentiles are provided as a convenience. field and presentation echo the listening conditions.

MooreGlasbergTimeVaryingLoudness.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the short-term and long-term loudness against time.

Requires matplotlib (pip install phonometry[plot]); returns the Axes. See phonometry._plot.psychoacoustics.