<!-- canonical: https://jmrplens.github.io/phonometry/es/guides/loudness/ -->
Source: https://jmrplens.github.io/phonometry/es/guides/loudness/

Las métricas de nivel dicen cuánta *presión acústica* 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/).

## ¿Cómo calculo la sonoridad de Zwicker de ISO 532-1 con Python?

Llama a `psychoacoustics.loudness_zwicker(x, fs, calibration_factor=sens)`
sobre una grabación calibrada. Si solo tienes el espectro, usa
`loudness_zwicker_from_spectrum(levels_28)` con los 28 niveles de banda de
tercio de octava de 25 Hz a 12,5 kHz. Cualquiera de los dos resultados lleva
`loudness` en sonos, `loudness_level` en fonios y, para señales variables en el
tiempo, los percentiles `n5` y `n10`.

## 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.

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.

```python

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)
```

*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

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(language="es")
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.

## 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)
```

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

from phonometry import psychoacoustics

# Una línea — la familia de curvas directamente desde el resultado:
res = psychoacoustics.equal_loudness_contours()
res.plot(language="es")
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 acústica [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.

*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

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 acústica [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

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)
```

*El patrón de ISO 532-2 del ancla definitoria de 1 sonio. El pico no es una
línea espectral sino la excitación que producen los filtros roex alrededor del
tono, así que su anchura es la del filtro auditivo, no la de la resolución de
análisis.*

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

```python

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(language="es")
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

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
```

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

```python

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(language="es")
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

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
```

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

```python

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(language="es")
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`.

## Qué cubre esta guía

**Cubierto.** ISO 532-1:2017 (método de Zwicker): el método estacionario del
apartado 5 y el método variable en el tiempo del apartado 6, portado del
programa de referencia normativo del Anexo A.4 y validado frente al Anexo B,
con los percentiles `n5`/`n10`, mediante `loudness_zwicker()` y
`loudness_zwicker_from_spectrum()`. ISO 532-2:2017 (Moore-Glasberg): el
patrón de excitación roex del apartado 7 y la inhibición binaural del
apartado 8, mediante `loudness_moore_glasberg()` y sus variantes
`_from_spectrum`/`_from_third_octave`. ISO 532-3:2023
(Moore-Glasberg-Schlittenlacher): la sonoridad de corto plazo del apartado
7.8, la de largo plazo del apartado 7.9 y su pico N_max, mediante
`loudness_moore_glasberg_time()`. ECMA-418-2:2025 (modelo de Sottek): el
ensamblaje de sonoridad del apartado 8, mediante `loudness_ecma()`. ISO
226:2023: la Fórmula (1), la Fórmula (2) y los parámetros de curva de la
Tabla 1, mediante `equal_loudness_contour()`, `loudness_level()`,
`hearing_threshold()` y `equal_loudness_contours()`.

**No cubierto.** La combinación binaural de ECMA-418-2 (Fórmula 118, apartado
8.1.5) no está implementada: `loudness_ecma()` es monaural, así que analiza
cada canal por separado. El apartado 5 de ISO 532-3 exige remuestrear la
entrada a 32 kHz antes del análisis FFT deslizante. Esta implementación
procesa en cambio a la frecuencia de muestreo nativa, una desviación
documentada que se mantiene dentro de la incertidumbre expandida de la norma.
Remuestrea a 32 kHz primero si te importa la conformidad estricta apartado a
apartado.

## 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/).

## Respuestas rápidas

### ¿Cuál es la diferencia entre la sonoridad en sonos y el nivel de sonoridad en fonios?

La sonoridad N en sonos (ISO 532-1) es una escala de razón de la sonoridad percibida: 4 sonos es el doble de sonoro que 2 sonos y, por definición, un tono de 1 kHz a 40 dB SPL es 1 sono. El nivel de sonoridad en fonios (ISO 226) es el SPL de un tono puro de 1 kHz igual de fuerte, y cada +10 fonios duplica el valor en sonos.

### ¿Qué modelo de sonoridad elijo: Zwicker, Moore-Glasberg o Sottek?

El método de Zwicker (ISO 532-1:2017) es el de referencia: estacionario y variable en el tiempo, entrada en tercios de octava, rápido y muy citado. Moore-Glasberg (ISO 532-2:2017) es estacionario, construye patrones de excitación roex y modela la suma binaural explícitamente; ISO 532-3:2023 añade la sonoridad variable en el tiempo de corto y largo plazo con el pico N_max. El modelo de Sottek (ECMA-418-2:2025) se expresa en sone_HMS y comparte su front-end auditivo con las métricas de tonalidad y aspereza de ECMA.

### ¿En qué rango son válidas las curvas isofónicas de ISO 226:2023?

El apartado 4.1 de ISO 226:2023 define las curvas isofónicas normales de 20 a 90 fonios, evaluadas en las 29 frecuencias preferentes de tercio de octava de la Tabla 1; 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. Las curvas describen tonos puros, no señales arbitrarias.
