Skip to content

psychoacoustics.loudness_moore_glasberg

Stationary loudness per ISO 532-2:2017 (Moore-Glasberg method).

Clean-room implementation of the spectral loudness model of ISO 532-2:2017, the third calculation method of the ISO 532 series (distinct from the Zwicker method of ISO 532-1 and the Sottek model of ECMA-418-2). The procedure of Clause 7 (Figure 1) transforms a stationary sound spectrum into a loudness value through five stages:

  • the fixed outer-ear and middle-ear transfer functions that map the recorded spectrum to the spectrum at the cochlea (clauses 7.2, 7.3, Table 1);
  • the level-dependent rounded-exponential (roex) auditory filter bank that turns that spectrum into an excitation pattern along the ERB-number scale (clause 7.4, Formulae 1-6), sampled at ERB-number i from 1.8 Cam to 38.9 Cam in 0.1 Cam steps;
  • the compressive transformation of excitation into specific loudness N'(i) in sone/Cam (clause 7.5, Formulae 7-9, Tables 2-4);
  • the binaural inhibition model that combines the two ears (clause 8.1, Formulae 10-13); and
  • the integration of specific loudness over the ERB-number scale to the total loudness N in sone, with the loudness level L_N in phon obtained by inverting the loudness/loudness-level relationship of Table 5 (clause 8.2).

The specific-loudness calibration constant C of Formula (7) is the value tabulated by the standard (0.0617 sone/Cam); a 1 kHz tone at 40 dB SPL presented binaurally in a free field yields 1.000 sone by definition of the sone (clause 3.17), which this implementation reproduces without tuning.

The stationary method is spectrum based. loudness_moore_glasberg_from_spectrum takes the exact sinusoidal-component representation of clauses 5.2/5.4, loudness_moore_glasberg_from_third_octave takes the 29 one-third-octave band levels of clause 5.5, and loudness_moore_glasberg forms the narrowband (FFT) line spectrum of a calibrated pressure signal and feeds it to the exact sinusoidal-component method.

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

loudness_moore_glasberg(
x: list[float] | np.ndarray,
fs: float,
*,
field: Literal['free', 'diffuse', 'eardrum'] = 'free',
presentation: Literal['binaural', 'diotic', 'monaural'] = 'binaural',
) -> MooreGlasbergLoudness

Moore-Glasberg loudness of a calibrated stationary pressure signal.

Convenience wrapper around loudness_moore_glasberg_from_spectrum: the signal’s narrowband (FFT) line spectrum is formed and each bin is passed to the exact sinusoidal-component method of ISO 532-2:2017 (clauses 5.2/5.4). Because the model computes the excitation pattern per spectral component (Formula 5), a pure tone enters as a single line - so a calibrated 1 kHz tone at 40 dB SPL yields 1.000 sone / 40 phon (the definitional anchor), matching loudness_moore_glasberg_from_spectrum. The signal must be calibrated so that x is the instantaneous sound pressure in pascals.

Parameters

NameDescription
xSingle-channel calibrated pressure signal in pascals.
fsSampling rate in Hz (positive).
field"free" (default), "diffuse" or "eardrum".
presentation"binaural" (default; alias "diotic") or "monaural".

Returns: A MooreGlasbergLoudness.

loudness_moore_glasberg_from_spectrum(
components: Sequence[tuple[float, float]] | np.ndarray,
*,
field: Literal['free', 'diffuse', 'eardrum'] = 'free',
presentation: Literal['binaural', 'diotic', 'monaural'] = 'binaural',
) -> MooreGlasbergLoudness

Moore-Glasberg loudness from a sinusoidal-component spectrum.

Implements the exact spectral input of ISO 532-2:2017 clauses 5.2/5.4: the sound is specified as a set of discrete sinusoidal components, each a (frequency_Hz, level_dB_SPL) pair (levels re 20 uPa in the stated sound field). Bands of noise can be represented by the equivalent set of closely spaced components of clause 5.3.

Parameters

NameDescription
componentsSequence of (frequency_Hz, level_dB) pairs (or an (n, 2) array). An empty spectrum yields zero loudness.
fieldListening condition setting the outer-ear transfer: "free" (frontal free field, default), "diffuse" (diffuse field) or "eardrum" (levels already specified at the tympanic membrane, e.g. a flat earphone).
presentation"binaural" (default; "diotic" is an equivalent alias: the same sound at both ears) or "monaural" (one ear only).

Returns: A MooreGlasbergLoudness.

A 1 kHz tone at 40 dB SPL in a free field presented binaurally yields 1.000 sone / 40 phon by definition of the sone.

loudness_moore_glasberg_from_third_octave(
band_levels: Sequence[float] | np.ndarray,
*,
field: Literal['free', 'diffuse', 'eardrum'] = 'free',
presentation: Literal['binaural', 'diotic', 'monaural'] = 'binaural',
) -> MooreGlasbergLoudness

Moore-Glasberg loudness from 29 one-third-octave band levels.

Implements the practical spectral input of ISO 532-2:2017 clause 5.5: the sound is specified by the sound pressure levels in the 29 adjacent one-third-octave bands with nominal centre frequencies 25 Hz to 16 kHz (IEC 61260-1). Each band is expanded into the equivalent set of sinusoidal components and the exact method is applied.

Parameters

NameDescription
band_levels29 band levels in dB SPL (re 20 uPa), 25 Hz..16 kHz.
field"free" (default), "diffuse" or "eardrum".
presentation"binaural" (default; alias "diotic") or "monaural".

Returns: A MooreGlasbergLoudness.

MooreGlasbergLoudness(
loudness: float,
loudness_level: float,
specific: np.ndarray,
erb_number: np.ndarray,
centre_frequencies: np.ndarray,
field: str,
presentation: str,
)

Result of an ISO 532-2:2017 Moore-Glasberg loudness calculation.

loudness is the total loudness N in sone; loudness_level is the loudness level L_N in phon (obtained by inverting the loudness/loudness- level relationship of Table 5). specific holds the specific loudness N’(i) in sone/Cam sampled at the ERB-number grid erb_number (Cam), i.e. i from 1.8 Cam to 38.9 Cam in 0.1 Cam steps (372 values), and centre_frequencies the corresponding auditory-filter centre frequencies in Hz. For a binaural (diotic) result the specific-loudness pattern is that of a single ear before binaural inhibition; the total loudness already includes the binaural summation. field and presentation echo the listening conditions.

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

Plot the specific loudness N’(i) over the ERB-number scale.

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

Created and maintained by· GitHub· PyPI· All projects