---
title: "Sonoridad"
description: "Sonoridad en sonos: Zwicker (ISO 532-1), Moore-Glasberg (ISO 532-2), Moore-Glasberg-Schlittenlacher variable en el tiempo (ISO 532-3) y la sonoridad del modelo de Sottek de ECMA-418-2, más las curvas isofónicas de ISO 226:2023."
references:
  - type: book
    authors: ["Fastl, H.", "Zwicker, E."]
    year: 2007
    title: "Psychoacoustics: Facts and models"
    edition: "3.ª ed."
    publisher: "Springer"
    doi: "10.1007/978-3-540-68888-4"
    note: "La psicoacústica de bandas críticas y enmascaramiento que sustenta el modelo de Zwicker y la sensación de sonoridad que los modelos más nuevos refinan."
  - type: article
    authors: ["Fletcher, H.", "Munson, W. A."]
    year: 1933
    title: "Loudness, its definition, measurement and calculation"
    journal: "The Journal of the Acoustical Society of America"
    volume: 5
    issue: 2
    pages: "82-108"
    doi: "10.1121/1.1915637"
    note: "Las mediciones originales de igual sonoridad que sustentan el concepto de nivel de sonoridad de la sección de tonos puros."
  - type: standard
    organization: "International Organization for Standardization"
    year: 2023
    title: "Acoustics — Normal equal-loudness-level contours"
    designation: "ISO 226:2023"
    url: "https://www.iso.org/standard/83117.html"
    note: "El modelo de isófonas y los parámetros de la Tabla 1 que sustentan los niveles de sonoridad de tonos puros: las curvas isofónicas (Fórmula 1), el nivel de sonoridad de tonos puros (Fórmula 2) y el umbral de audición."
  - type: standard
    organization: "International Organization for Standardization"
    year: 2017
    title: "Acoustics — Methods for calculating loudness — Part 1: Zwicker method"
    designation: "ISO 532-1:2017"
    url: "https://www.iso.org/standard/63077.html"
    note: "Sonoridad estacionaria y variable en el tiempo en sonos a partir del programa de referencia normativo del Anexo A.4, con la sonoridad percentil N5/N10, validada frente al conjunto del Anexo B."
  - type: standard
    organization: "International Organization for Standardization"
    year: 2017
    title: "Acoustics — Methods for calculating loudness — Part 2: Moore-Glasberg method"
    designation: "ISO 532-2:2017"
    url: "https://www.iso.org/standard/63078.html"
    note: "Sonoridad estacionaria a partir de patrones de excitación roex sobre la escala del número ERB, con suma binaural explícita."
  - type: standard
    organization: "International Organization for Standardization"
    year: 2023
    title: "Acoustics — Methods for calculating loudness — Part 3: Moore-Glasberg-Schlittenlacher method"
    designation: "ISO 532-3:2023"
    url: "https://www.iso.org/standard/69856.html"
    note: "Sonoridad variable en el tiempo de corto y largo plazo y el pico N_max."
  - type: standard
    organization: "Ecma International"
    year: 2025
    title: "Psychoacoustic metrics for ITT equipment — Part 2 (methods for describing human perception based on the Sottek Hearing Model)"
    designation: "ECMA-418-2, 4.ª ed."
    url: "https://ecma-international.org/publications-and-standards/standards/ecma-418/"
    note: "La sonoridad del modelo de Sottek (sone_HMS)."
---

import Video from '../../../../components/Video.astro';
import ThemeImage from '../../../../components/ThemeImage.astro';
import ReportPreview from '../../../../components/ReportPreview.astro';

Las métricas de nivel dicen cuánta *presión sonora* hay; la sonoridad dice
cuán fuerte la *percibe* realmente quien escucha. Esta página cubre las tres
familias de modelos de sonoridad que incluye phonometry: el método de
Zwicker (ISO 532-1), los métodos de Moore-Glasberg (ISO 532-2/3) y la
sonoridad del modelo de Sottek (ECMA-418-2), además de las curvas isofónicas
de tonos puros (ISO 226). El sharpness, la tonalidad y la aspereza están en
[Métricas de calidad sonora](/phonometry/es/guides/sound-quality/); las
métricas de habla en el
[índice de transmisión del habla](/phonometry/es/guides/speech-transmission/) y
el [índice de inteligibilidad del habla](/phonometry/es/guides/speech-intelligibility/).

## Sonoridad en sonos (ISO 532-1, Zwicker)

Los decibelios comprimen la percepción: 10 dB más se leen como *el doble de
sonoro*, y dos sonidos con el mismo dB(A) pueden diferir audiblemente según
cómo se reparta su energía entre las **bandas críticas** del oído. El método de
Zwicker modela explícitamente la cadena auditiva (transmisión del oído
externo/medio, análisis en bandas críticas sobre la escala de 24 Bark,
pendientes de enmascaramiento dependientes del nivel) y produce la
**sonoridad N en sonos**, una escala de razón: 4 sonos es el doble de sonoro
que 2 sonos. Por definición, un tono de 1 kHz a 40 dB SPL es 1 sono, y cada
+10 fonios duplica el valor en sonos.

<ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/diagram_zwicker_es.svg" alt="Cadena de sonoridad de Zwicker ISO 532-1: 28 niveles de banda de tercio de octava, transmisión y agrupación de bandas críticas inferiores, sonoridad de núcleo de las 20 bandas críticas, sonoridad específica sobre Bark, integrada en la sonoridad total N en sonos y el nivel de sonoridad en fonios" width="78%" loading="eager" />

La animación de abajo muestra esa integración en acción: al subir el nivel
de banda de un sonido de banda estrecha de 1 kHz, el patrón de sonoridad
específica N'(z) crece a lo largo del eje de Bark y el área bajo él es la
sonoridad total en sonos.

<Video
  name="anim_specific_loudness"
  width={2400}
  height={1350}
  title="Cómo la sonoridad específica se integra en la sonoridad total"
  description="El patrón de sonoridad específica de una banda estrecha de 1 kHz se construye sobre el eje de Bark mientras el nivel de banda sube de 45 a 85 dB, y el área bajo el patrón se integra en la sonoridad total en sonios."
/>

```python
import numpy as np
from phonometry import psychoacoustics

# Una grabación cruda y su calibración para que la guía funcione por sí sola
fs = 48000
x = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)   # cualquier grabación (unidades digitales)
sens = 1.0                                                # calibration_factor a pascales
levels_28 = np.full(28, 60.0)                             # 28 niveles de tercio de octava (dB)

# Desde una grabación sin calibrar: calibration_factor convierte unidades digitales en Pa
res = psychoacoustics.loudness_zwicker(x, fs, field="free", calibration_factor=sens)
print(f"N = {res.loudness:.1f} sone  ({res.loudness_level:.0f} phon)")   # 13.1 sone (77 phon)

# Señales variables en el tiempo: la sonoridad percentil N5 es el
# estándar para informes
res = psychoacoustics.loudness_zwicker(x, fs)          # stationary=False (por defecto)
print(f"{res.n5:.1f} {res.n10:.1f} {res.loudness:.1f}")   # 13.1 13.1 13.1 — N5, N10, Nmax

# Desde 28 niveles de tercio de octava (25 Hz .. 12.5 kHz)
res = psychoacoustics.loudness_zwicker_from_spectrum(levels_28, field="diffuse")

res.plot()   # N'(z) sobre la escala Bark — el patrón de sonoridad específica (requiere matplotlib)
```

<ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/loudness_pattern_es.svg" alt="Patrones de sonoridad específica sobre la escala Bark para un sonido de banda estrecha de 1 kHz y un sonido de banda ancha con el mismo nivel de banda" width="80%" />

*Mismo nivel de banda, sonoridad muy distinta: la energía repartida entre
muchas bandas críticas (rojo) suma muchos más sonos que el mismo nivel
concentrado en una sola banda (azul). El área bajo N'(z) es la sonoridad
total.*

<details>
<summary>Mostrar el código de esta figura</summary>

```python
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics

levels_28 = np.full(28, 60.0)                             # 28 niveles de tercio de octava (dB)
# Desde 28 niveles de tercio de octava (25 Hz .. 12.5 kHz)
res = psychoacoustics.loudness_zwicker_from_spectrum(levels_28, field="diffuse")

# En una línea — el patrón de sonoridad específica N'(z) desde el resultado:
res.plot()
plt.show()

# O reproduce la figura a mano — dos patrones con el mismo nivel de banda (60 dB),
# la energía repartida entre muchas bandas críticas frente a la banda de 1 kHz:
narrow = psychoacoustics.loudness_zwicker_from_spectrum(np.r_[np.full(16, -60.0), 60.0, np.full(11, -60.0)])
broad = psychoacoustics.loudness_zwicker_from_spectrum(np.full(28, 60.0))
z = np.arange(1, narrow.specific.size + 1) * 0.1          # eje Bark
fig, ax = plt.subplots()
for r, color, label in [
    (broad, "#ff7f0e", f"Banda ancha  N = {broad.loudness:.1f} sone"),
    (narrow, "#1f77b4", f"Banda estrecha 1 kHz  N = {narrow.loudness:.1f} sone"),
]:
    ax.fill_between(z, r.specific, color=color, alpha=0.3)
    ax.plot(z, r.specific, color=color, label=label)
ax.set_xlabel("Tasa de banda crítica z [Bark]")
ax.set_ylabel("Sonoridad específica N' [sone/Bark]")
ax.legend()
plt.show()
```

</details>

La implementación es un port de sala limpia del **programa de referencia
normativo** de la norma (Anexo A.4): las doce tablas de datos son exactas
dígito a dígito y el conjunto completo de validación del Anexo B se ejecuta en
CI: el caso de prueba estacionario reproduce el valor publicado hasta el
último dígito impreso, y las trazas N(t) de los pulsos de tono se mantienen
dentro de la banda de tolerancia del 5 % por muestra que fija la norma.

### Parámetros de `loudness_zwicker()`

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `x` | array 1D | Pa (tras calibración) | ≥ 8 ms a 48 kHz | Se remuestrea internamente a 48 kHz si es necesario |
| `fs` | int | Hz | > 0 | |
| `field` | str | — | `'free'` (por defecto) / `'diffuse'` | Corrección de campo sonoro (Tabla A.5) |
| `stationary` | bool | — | por defecto `False` | `True`: un único N a partir del espectro promediado |
| `calibration_factor` | float | Pa por unidad digital | por defecto `1.0` | De `sensitivity()` |

Devuelve un dataclass `ZwickerLoudness`: `loudness` (N, sonos),
`loudness_level` (fonios), `specific` (N′(z), 240 bins de 0,1 Bark) y, para los
análisis variables en el tiempo, `n5`, `n10`, `time`, `loudness_vs_time`
(traza a 500 Hz).

### Informe de ISO 532-1 (`.report()`)

`ZwickerLoudness.report(path)` renderiza una ficha PDF de una página con el
formato de un informe de sonoridad acreditado: la línea de base normativa, un
bloque opcional de metadatos de cabecera, una tabla compacta de métricas
(sonoridad total *N*, nivel de sonoridad *L*<sub>N</sub> y los percentiles
*N*<sub>5</sub>/*N*<sub>10</sub> para un resultado variable en el tiempo) junto
al patrón de sonoridad específica *N*′(z) (el propio `.plot()` del resultado),
el número único `N = X sono (LN = Y fonio)` en caja, una fila opcional de
veredicto y un pie con el descargo fijo. Usa el mismo contenedor
`ReportMetadata` y el mismo motor de renderizado que la
[ficha de aislamiento de ISO 717](/phonometry/es/guides/insulation-field/#informe-de-iso-717-report);
un `requirement` aportado se lee como la sonoridad máxima admisible en sonos
(una sonoridad menor cumple). El renderizado necesita reportlab
(`pip install phonometry[report]`); solo se admite `engine="reportlab"`. La
ficha se genera en inglés por defecto; pasa `language="es"` para una ficha en
español (cadenas fijas traducidas y coma como separador decimal), p. ej.
`res.report("loudness_fiche_es.pdf", language="es")`.

```python
from phonometry import psychoacoustics, ReportMetadata

res = psychoacoustics.loudness_zwicker_from_spectrum(levels_28, field="free")
res.report(
    "ficha_sonoridad.pdf",
    metadata=ReportMetadata(
        specimen="Electrodoméstico, ruido de funcionamiento estable",
        measurement_standard="ISO 532-1 método 1",
        laboratory="Laboratorio de referencia Phonometry",
        requirement=12.0,             # sonoridad máxima admisible (sonos)
    ),
)                                     # N (sonos) y LN (fonios)
```

La ficha de ejemplo se regenera con `make reports` y se conserva renderizada en
el repositorio; pulsa la vista previa para abrir el PDF.

<ReportPreview
	name="iso532_loudness_example"
	title="Informe de ejemplo de sonoridad ISO 532-1 (PDF)"
	description="Ficha de sonoridad de una página: una cabecera de metadatos, una tabla de métricas con la sonoridad total N y el nivel de sonoridad LN, el patrón de sonoridad específica sobre la tasa de banda crítica, el resultado de un solo número N = 8.2 sono (LN = 70.4 fonio) en caja y una fila de veredicto CUMPLE frente a un límite de 12 sonos."
	caption="Ficha de sonoridad de Zwicker (ZwickerLoudness.report), N en sonos con LN en fonios."
/>

## Nivel de sonoridad de tonos puros (ISO 226:2023)

Las curvas isofónicas normales relacionan el SPL de un tono puro con su *nivel
de sonoridad* percibido en fonios (el SPL de un tono de 1 kHz igual de fuerte).
`equal_loudness_contour(phon)` evalúa la Fórmula (1) de ISO 226:2023 en las 29
frecuencias preferentes de tercio de octava de la Tabla 1,
`loudness_level(spl, frequency)` es la inversa exacta (Fórmula 2) y
`hearing_threshold()` devuelve la columna del umbral de audición.
`equal_loudness_contours(phons)` agrupa toda una familia de curvas con el
umbral en un resultado `EqualLoudnessContours` representable:

```python
from phonometry import psychoacoustics

freqs, spl = psychoacoustics.equal_loudness_contour(40.0)   # la clásica isofónica de 40 fonios
phon = psychoacoustics.loudness_level(73.0, 63.0)           # 73 dB @ 63 Hz -> 40 fonios

# Toda la familia (20-90 fonios por defecto) más el umbral de audición:
res = psychoacoustics.equal_loudness_contours()
res.plot()   # el clásico gráfico de ISO 226 (necesita matplotlib)
```

<ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/equal_loudness_contours_es.svg" alt="Curvas isofónicas normales de ISO 226:2023 de 20 a 90 fonios con la curva del umbral de audición" width="80%" />

ISO 226:2023 define las curvas de 20 a 90 fonios; por encima de 80 fonios la fórmula solo es válida hasta 4 kHz, por lo que la curva de 90 fonios se detiene ahí y no se define ninguna curva superior.

<details>
<summary>Mostrar el código de esta figura</summary>

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

# Una línea — la familia de curvas directamente desde el resultado:
res = psychoacoustics.equal_loudness_contours()
res.plot()
plt.show()

# O reproduce la figura a mano — Fórmula (1) de ISO 226:2023 en las 29
# frecuencias preferentes de la Tabla 1, una curva por nivel de sonoridad:
fig, ax = plt.subplots()
for phon in [20, 40, 60, 80, 90]:
    freqs, spl = psychoacoustics.equal_loudness_contour(float(phon))
    ax.semilogx(freqs, spl, color="C0")
    ax.annotate(f"{phon} fonios", xy=(1000, phon + 1), fontsize=9)
ft, tf = psychoacoustics.hearing_threshold()
ax.semilogx(ft, tf, "--", color="C1", label="Umbral de audición $T_f$")
ax.set(xlabel="Frecuencia [Hz]", ylabel="Nivel de presión sonora [dB re 20 µPa]")
ax.grid(True, which="both", alpha=0.3)
ax.legend()
plt.show()
```

</details>

Validez según el apartado 4.1: 20–90 fonios (80 fonios por encima de 4 kHz); la
implementación se verifica en CI contra las tablas del Anexo B. Ojo: esto es la
sonoridad de *tonos puros*; la sonoridad de señales arbitrarias en sonos es lo
que calculan los modelos ISO 532 de esta página.

## Modelos avanzados de sonoridad

La ISO 532-1 de arriba es una de las **tres** familias de modelos de sonoridad
que incluye phonometry (cuatro métodos en la tabla de abajo). Esta sección
añade la sonoridad de **Moore-Glasberg** de ISO 532-2/532-3 y la sonoridad
del **modelo de Sottek** de ECMA-418-2:2025, cuyo front-end auditivo
compartido también impulsa la tonalidad y la aspereza de [Métricas de calidad sonora](/phonometry/es/guides/sound-quality/).

### Elegir un modelo de sonoridad

| Modelo | Norma | Estacionario / variable en el tiempo | Salida | Cuándo usarlo |
| :--- | :--- | :--- | :--- | :--- |
| Zwicker | ISO 532-1:2017 | ambos | sonos | Método de referencia; entrada en tercios de octava; rápido y muy citado |
| Moore-Glasberg | ISO 532-2:2017 | estacionario | sonos | Patrón de excitación roex; mejor para tonos y con suma binaural explícita |
| Moore-Glasberg-Schlittenlacher | ISO 532-3:2023 | variable en el tiempo | sonos (STL/LTL) | Sonoridad variable en el tiempo con trazas de corto/largo plazo y el pico N_max |
| Sottek (modelo auditivo) | ECMA-418-2:2025 | variable en el tiempo | sone_HMS | Comparte un único front-end auditivo con las métricas de tonalidad y aspereza de ECMA |

Los cuatro métodos están anclados de modo que un **tono de 1 kHz a 40 dB SPL
es ≈ 1 sono**; los valores no son intercambiables dígito a dígito porque los
modelos difieren en sus filtros auditivos y en su suma de sonoridad.

<ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/loudness_models_comparison_es.svg" alt="Sonoridad de un tono de 1 kHz en función del nivel para los modelos de Zwicker, Moore-Glasberg y Sottek, todos pasando por 1 sono a 40 dB SPL" width="80%" />

*Los tres modelos coinciden en el ancla de 1 sono / 40 dB y divergen con el
nivel: Zwicker duplica el valor en sonos cada +10 fonios, mientras que el modelo
de Sottek crece más lentamente (alrededor de 1,65× por cada 10 dB), una
diferencia intrínseca entre las sumas auditivas, no un error de calibración.*

<details>
<summary>Mostrar el código de esta figura</summary>

```python
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics

# Tono de 1 kHz, 20..80 dB SPL: los tres modelos pasan por 1 sono a 40 dB
fs = 48000
t = np.arange(fs) / fs
levels = np.arange(20.0, 81.0, 10.0)
zw, mg, ec = [], [], []
for spl in levels:
    x = np.sqrt(2) * 2e-5 * 10 ** (spl / 20) * np.sin(2 * np.pi * 1000 * t)
    zw.append(psychoacoustics.loudness_zwicker(x, fs, stationary=True).loudness)
    mg.append(
        psychoacoustics.loudness_moore_glasberg_from_spectrum([(1000.0, float(spl))]).loudness
    )
    ec.append(psychoacoustics.loudness_ecma(x, fs).loudness)

fig, ax = plt.subplots()
ax.plot(levels, zw, "o-", label="Zwicker (ISO 532-1)")
ax.plot(levels, mg, "s--", label="Moore-Glasberg (ISO 532-2)")
ax.plot(levels, ec, "^-.", label="Sottek (ECMA-418-2)")
ax.plot(40.0, 1.0, "o", color="k", markerfacecolor="none", markersize=10)   # el ancla compartida
ax.set(xlabel="Nivel de presión sonora [dB SPL]", ylabel="Sonoridad total N [sonos]")
ax.legend()
plt.show()
```

</details>

### Sonoridad de Moore-Glasberg (ISO 532-2)

Donde Zwicker usa bandas críticas fijas sobre la escala Bark, Moore-Glasberg
construye un **patrón de excitación** con filtros auditivos exponenciales
redondeados (roex) dependientes del nivel sobre la escala del número ERB
("Cam"), y luego aplica una transformación compresiva de excitación →
sonoridad específica con C = 0,0617 sonos/Cam (ISO 532-2:2017, Fórmula 7) y una
etapa de inhibición binaural. Reproduce los casos de tono y de banda ancha del
Anexo B con un uno o dos por ciento de error y, a diferencia de ISO 532-1,
modela la suma binaural explícitamente.

```python
import numpy as np
from phonometry import psychoacoustics

# El ancla definitoria: una componente sinusoidal de 1 kHz a 40 dB SPL,
# campo libre, binaural -> 1 sono / 40 fonios por construcción del sono.
res = psychoacoustics.loudness_moore_glasberg_from_spectrum([(1000.0, 40.0)], field="free")
print(f"N = {res.loudness:.3f} sone  ({res.loudness_level:.1f} phon)")   # 1.000 sono (40.0 fonios)

# Desde una grabación calibrada: se forma el espectro de líneas de banda
# estrecha (FFT, normalización que preserva la potencia) y se alimenta al
# método exacto de componentes sinusoidales (ISO 532-2 apartados 5.2/5.4).
fs = 48000
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)
res = psychoacoustics.loudness_moore_glasberg(x, fs, field="free", presentation="binaural")

res.plot()   # sonoridad específica N'(i) sobre la escala del número ERB (Cam)
```

<details>
<summary>Mostrar el código de esta figura</summary>

```python
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics

# Desde una grabación calibrada: se forma el espectro de líneas de banda
# estrecha (FFT, normalización que preserva la potencia) y se alimenta al
# método exacto de componentes sinusoidales (ISO 532-2 apartados 5.2/5.4).
fs = 48000
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)
res = psychoacoustics.loudness_moore_glasberg(x, fs, field="free", presentation="binaural")

# En una línea — el patrón de sonoridad específica N'(i) directo del resultado:
res.plot()
plt.show()

# O dibújalo a mano desde la rejilla del número ERB que ya lleva el resultado:
fig, ax = plt.subplots()
ax.fill_between(res.erb_number, res.specific, alpha=0.3)
ax.plot(res.erb_number, res.specific)
ax.set_xlabel("Número ERB [Cam]")
ax.set_ylabel("Sonoridad específica N' [sone/Cam]")
plt.show()
```

</details>

#### Parámetros de `loudness_moore_glasberg()`

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `x` | array 1D | Pa | no vacío | Señal de presión calibrada (envoltorio de señal) |
| `components` | lista de `(f, L)` | Hz, dB SPL | — | `_from_spectrum`: componentes sinusoidales discretas |
| `band_levels` | vector de 29 | dB SPL | 25 Hz .. 16 kHz | Entrada de `_from_third_octave` (bandas IEC 61260-1) |
| `fs` | int | Hz | > 0 | Solo en el envoltorio de señal |
| `field` | str | — | `'free'` (por defecto) / `'diffuse'` / `'eardrum'` | Transferencia del oído externo |
| `presentation` | str | — | `'binaural'` (por defecto) / `'diotic'` / `'monaural'` | Suma binaural |

Devuelve un `MooreGlasbergLoudness`: `loudness` (N, sonos), `loudness_level`
(fonios), `specific` (N′(i), 372 bins de 0,1 Cam), `erb_number`,
`centre_frequencies`, `field`, `presentation`.

### Sonoridad variable en el tiempo (ISO 532-3)

ISO 532-3 envuelve el mismo modelo de excitación / sonoridad específica en un
análisis espectral multirresolución deslizante (seis FFT paralelas, actualizadas
cada 1 ms) y dos integradores temporales en cascada: la **sonoridad de corto
plazo** S′(t), rápida, y la **sonoridad de largo plazo** S″(t), más lenta. La
sonoridad de largo plazo de pico N_max predice la sonoridad de sonidos de hasta
unos 5 s.

```python
import numpy as np
from phonometry import psychoacoustics

fs = 32000
t = np.arange(int(1.3 * fs)) / fs
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * t)

res = psychoacoustics.loudness_moore_glasberg_time(x, fs, field="free")
print(f"N_max = {res.n_max:.3f} sone  ({res.loudness_level_max:.0f} phon)")   # 1.000 sono (40 fonios)
print(f"sonoridad de largo plazo superada el 5% del tiempo: {res.percentiles[5.0]:.3f} sone")   # 0.999 sone

res.plot()   # sonoridad de corto plazo S'(t) y de largo plazo S''(t) frente al tiempo
```

<ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/moore_glasberg_time_loudness_es.svg" alt="Trazas de sonoridad de corto plazo y de largo plazo de Moore-Glasberg para un pulso de tono, mostrando el ataque rápido de la sonoridad de corto plazo y la relajación más lenta de la de largo plazo" width="80%" />

<details>
<summary>Mostrar el código de esta figura</summary>

```python
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics

fs = 32000
t = np.arange(int(1.3 * fs)) / fs
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * t)
res = psychoacoustics.loudness_moore_glasberg_time(x, fs, field="free")

# El resultado lleva ambas trazas sobre un eje temporal de 1 ms:
res.plot()
plt.show()

# O dibújalas directamente para ver la STL rápida frente a la LTL lenta:
fig, ax = plt.subplots()
ax.plot(res.time, res.short_term_loudness, label="Corto plazo S'(t)")
ax.plot(res.time, res.long_term_loudness, label="Largo plazo S''(t)")
ax.set_xlabel("Tiempo [s]")
ax.set_ylabel("Sonoridad [sone]")
ax.legend()
plt.show()
```

</details>

#### Parámetros de `loudness_moore_glasberg_time()`

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `signal` | array 1D o `(n, 2)` | Pa | no vacío | Mono = diótico; dos columnas = oídos izquierdo/derecho |
| `fs` | int | Hz | > 0 | |
| `field` | str | — | `'free'` (por defecto) / `'diffuse'` / `'eardrum'` | Transferencia del oído externo |
| `presentation` | str | — | `'binaural'` (por defecto) / `'diotic'` / `'monaural'` | Suma binaural |
| `percentiles` | secuencia | porcentaje | por defecto `(1, 5, 10, 50, 90, 95)` | Niveles de sonoridad de largo plazo excedidos |

Devuelve un `MooreGlasbergTimeVaryingLoudness`: `time` (rejilla de 1 ms),
`short_term_loudness` / `long_term_loudness` (sonos), sus `_level` en fonios,
`n_max`, `loudness_level_max`, un dict `percentiles`, `field`, `presentation`.

### Sonoridad del modelo de Sottek (ECMA-418-2)

ECMA-418-2:2025 especifica un único front-end auditivo (filtrado del oído
externo/medio, un banco de 53 filtros de tipo gammatone sobre la escala Bark_HMS
con z = 0,5 .. 26,5, rectificación de media onda, RMS de bloque y una no
linealidad compresiva, Fórmula 23) que **comparten** sus métricas de
sonoridad, tonalidad y aspereza. La sonoridad N se expresa en **sone_HMS**, y el
mismo ancla de 1 kHz/40 dB calibra el front-end (nuestro valor de sala limpia
0,984, con el promediado completo de bandas de la cláusula 6.2.3; el origen
del residuo está documentado en el docstring del módulo).

```python
import numpy as np
from phonometry import psychoacoustics

fs = 48000
t = np.arange(int(1.2 * fs)) / fs
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * t)

res = psychoacoustics.loudness_ecma(x, fs, field="free")
print(f"N = {res.loudness:.3f} sone_HMS")   # 0.984 sone_HMS
print(res.specific_loudness.shape)          # (53,) sonoridad específica media N'(z)

res.plot()   # sonoridad específica media N'(z) + N(l) dependiente del tiempo a 187.5 Hz
```

<ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/sottek_specific_loudness_es.svg" alt="Sonoridad específica media N'(z) del modelo de Sottek sobre las 53 bandas Bark_HMS para un tono de 1 kHz, con máximo en la banda crítica del tono" width="80%" />

<details>
<summary>Mostrar el código de esta figura</summary>

```python
import matplotlib.pyplot as plt
import numpy as np
from phonometry import psychoacoustics

fs = 48000
t = np.arange(int(1.2 * fs)) / fs
x = np.sqrt(2) * 2e-5 * 10 ** (40 / 20) * np.sin(2 * np.pi * 1000 * t)
res = psychoacoustics.loudness_ecma(x, fs, field="free")

# El resultado lleva la sonoridad específica media sobre las 53 bandas Bark_HMS:
res.plot()
plt.show()

# O dibuja N'(z) a mano frente a la escala de tasa de banda crítica:
fig, ax = plt.subplots()
ax.fill_between(res.bark, res.specific_loudness, alpha=0.3)
ax.plot(res.bark, res.specific_loudness)
ax.set_xlabel("Tasa de banda crítica z [Bark_HMS]")
ax.set_ylabel("Sonoridad específica N' [sone_HMS/Bark_HMS]")
plt.show()
```

</details>

#### Parámetros de `loudness_ecma()`

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `signal_in` | array 1D | Pa | no vacío | Señal de presión calibrada |
| `fs` | float | Hz | > 0 | Se remuestrea a 48 kHz internamente si es necesario (apartado 5.1.1) |
| `field` | str | — | `'free'` (por defecto) / `'diffuse'` | Filtro del oído externo/medio (apartado 5.1.3) |

Devuelve un `EcmaLoudness`: `loudness` (N, sone_HMS), `specific_loudness`
(N′(z), 53 bandas), `bark`, `centre_frequencies`, `time`, `loudness_vs_time`
(N(l) a 187,5 Hz), `field`.

## Véase también

- [Métricas de calidad sonora](/phonometry/es/guides/sound-quality/): sharpness,
  tonalidad y aspereza, la otra mitad de la calidad sonora.
- [Molestia psicoacústica e intensidad de fluctuación](/phonometry/es/guides/psychoacoustic-annoyance/):
  el modelo de Zwicker y Fastl que consume la sonoridad percentil N5.
- [Teoría](/phonometry/es/reference/theory/perception/): las ecuaciones que sustentan los modelos de sonoridad.
- Referencia de la API: [`psychoacoustics.loudness_zwicker`](/phonometry/es/reference/api/psychoacoustics/loudness-zwicker/), [`psychoacoustics.loudness_moore_glasberg`](/phonometry/es/reference/api/psychoacoustics/loudness-moore-glasberg/) y [`psychoacoustics.loudness_contours`](/phonometry/es/reference/api/psychoacoustics/loudness-contours/).
