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

El método de Zwicker de ISO 532-1 es la vía de referencia hacia la sonoridad
en sonios y está en
[Sonoridad](/phonometry/es/perception/psychoacoustics/loudness/), junto con
las líneas isofónicas de ISO 226. Esta página cubre las familias de modelos
más nuevas que phonometry incluye a su lado: 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/perception/psychoacoustics/sound-quality/).

La página empieza por la elección: qué modelo encaja con qué medición, y por
qué los valores en sonios de los cuatro métodos coinciden en el ancla de
1 kHz / 40 dB pero no son intercambiables dígito a dígito. Después, cada
modelo tiene su propia sección con un ejemplo resuelto, su figura y su tabla
de parámetros.

## Elegir un modelo de sonoridad

| Modelo | Norma | Estacionario / variable en el tiempo | Salida | Cuándo usarlo |
| :--- | :--- | :--- | :--- | :--- |
| [Zwicker](/phonometry/es/perception/psychoacoustics/loudness/) | ISO 532-1:2017 | ambos | sonios | Método de referencia; entrada en tercios de octava; rápido y muy citado |
| Moore-Glasberg | ISO 532-2:2017 | estacionario | sonios | 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 | sonios (STL/LTL) | Sonoridad variable en el tiempo con trazas de corto/largo plazo y el pico $N_\text{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 sonio**; 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 pasan por aproximadamente 1 sonio en el ancla de 40 dB (el
front-end de Sottek devuelve ahí 0,9845 sone_HMS) y divergen con el nivel:
Zwicker duplica el valor en sonios 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 cerca de 1 sonio 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 [sonios]")
ax.legend()
plt.show()
```

</details>

## La escala ERB<sub>N</sub> y el eje Cam

Todos los modelos de esta página salvo el de Zwicker se escriben sobre el eje
del **número ERB<sub>N</sub>**, así que conviene tener a mano la escala misma.
La cóclea se comporta como un banco de **filtros auditivos** paso banda
solapados; la anchura del filtro centrado en una frecuencia dada se resume con
su *ancho de banda rectangular equivalente*, el del filtro rectangular que dejaría
pasar la misma potencia con la misma respuesta de pico. Ajustando datos de
ruido con muesca de oyentes jóvenes a niveles moderados, Glasberg y Moore
(1990) lo convierten en una recta en frecuencia (Moore, *An Introduction to the
Psychology of Hearing* 6.ª ed., p. 76):

$$
\mathrm{ERB}_N = 24{,}7\,(4{,}37\,F + 1)\ \text{Hz},\qquad F \text{ en kHz}.
$$

Integrar $df/\mathrm{ERB}_N(f)$ convierte eso en una escala de frecuencia en la
que un paso es una anchura de filtro auditivo. La escala es el **número
ERB<sub>N</sub>** y su unidad es el **Cam**, por Cambridge:

$$
\mathrm{ERB}_N\ \text{número} = 21{,}4 \log_{10}(4{,}37\,F + 1)\ \text{Cam}.
$$

```python
from phonometry import psychoacoustics

cam = psychoacoustics.cam_from_frequency(1000.0)
print(round(psychoacoustics.erb_bandwidth(1000.0), 1))       # 132.4 Hz
print(round(cam, 2))                                         # 15.59 Cam
print(round(psychoacoustics.frequency_from_cam(cam), 1))     # 1000.0 Hz
```

La biblioteca expresa el mismo ajuste con una cifra significativa más,
$\mathrm{ERB}_N = 24{,}673\,(0{,}004368 f + 1)$ y
$21{,}366 \log_{10}(0{,}004368 f + 1)$, la precisión que emplea la implementación
de ISO 532-2; ambas formas concuerdan dentro del 0,2 % en todo el margen
audible, y esas cifras de más son las que hacen de `frequency_from_cam` una
inversa exacta. No son auxiliares privados del modelo de sonoridad:
`loudness_moore_glasberg` llama a esas mismas tres funciones, de modo que una
rejilla `MooreGlasbergLoudness.erb_number` y un eje Cam construido por ti no
pueden separarse.

*El filtro del oído no es una fracción constante de la frecuencia. Por debajo
de unos 500 Hz es bastante más estrecho que un tercio de octava, y por eso la
función de banda crítica «antigua», plana en baja frecuencia, ajusta tan mal
ahí las medidas directas; por encima es más ancho. El eje superior cuenta la
misma curva en Cam, de modo que pasos iguales sobre él son números iguales de
filtros auditivos.*

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

```python

from phonometry import psychoacoustics

f = np.geomspace(50.0, 16000.0, 400)
erb = psychoacoustics.erb_bandwidth(f)
third_octave = f * (2 ** (1 / 6) - 2 ** (-1 / 6))     # 23 % de f, como referencia

fig, ax = plt.subplots()
ax.loglog(f, erb, label="ERB$_N$ (Glasberg y Moore, 1990)")
ax.loglog(f, third_octave, "--", label="Tercio de octava (23 % de f)")
ax.set(xlabel="Frecuencia central [Hz]",
       ylabel="Ancho de banda rectangular equivalente ERB$_N$ [Hz]")
ax.legend()

# El eje Cam arriba: marcas donde caen números ERB_N enteros.
cam_ticks = np.arange(5.0, 40.0, 5.0)
ax2 = ax.twiny()
ax2.set_xscale("log")
ax2.set_xlim(ax.get_xlim())
ax2.set_xticks(psychoacoustics.frequency_from_cam(cam_ticks))
ax2.set_xticklabels([f"{c:.0f}" for c in cam_ticks])
ax2.set_xlabel("Número ERB$_N$ [Cam]")
plt.show()
```

</details>

### Parámetros de `erb_bandwidth()`, `cam_from_frequency()` y `frequency_from_cam()`

| Parámetro | Tipo | Unidades | Rango / defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `frequency` | float o array | Hz | ≥ 0 | `erb_bandwidth`, `cam_from_frequency` |
| `cam` | float o array | Cam | ≥ 0 | `frequency_from_cam` |

Cada una devuelve un float con entrada escalar y un array en caso contrario.
Las tres constantes se exportan como `ERB_C1`, `ERB_C2` y `CAM_C`.

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

### Qué grabación corresponde a qué argumentos

`field` y `presentation` no son preferencias: son descripciones de cómo llegó
el sonido a quien escucha, y equivocarlos cuesta más que cualquier diferencia
entre los modelos de esta página. El apartado 7.2 de ISO 532-2 lista las
situaciones de escucha y la función de transferencia que necesita cada una, y
el apartado 8.1 fija qué hacen con el resultado los dos oídos.

| Cómo se captó el sonido | `field=` | Por qué |
| :--- | :--- | :--- |
| Un micrófono en el centro de la posición que ocuparía la cabeza de quien escucha, ausente, con una única fuente frontal | `'free'` | Columna 2 de la Tabla 1, la transferencia de campo libre hasta la membrana timpánica |
| El mismo micrófono en una sala reverberante o in situ | `'diffuse'` | Columna 3 de la Tabla 1, la transferencia de campo difuso; también es la opción correcta para auriculares de campo difuso |
| Un micrófono de sonda a menos de 10 mm del tímpano (5 mm cuando hay componentes fuertes por encima de 3 kHz) | `'eardrum'` | Apartado 7.2.4: el espectro ya está en la membrana, así que no se aplica ninguna función de transferencia |
| Un simulador de cabeza y torso | `'eardrum'`, pero solo si el simulador es un modelo acústico fiel de un adulto medio | Apartado 7.2.5; si no, necesita su propio fichero de corrección, que esta API no sabe expresar — ecualiza antes la grabación a campo libre o a campo difuso y usa la opción que corresponda |

*Las cuatro situaciones del apartado 7.2, con la geometría que las decide. Las
distancias de la escena 3 son las de la propia norma: 10 mm desde la membrana
timpánica, 5 mm cuando el sonido tiene componentes fuertes por encima de
3 kHz.*

**El modo de fallo es silencioso y grande.** Aplicar una transferencia de campo
libre a una señal que ya contiene la resonancia del canal auditivo cuenta dos
veces una ganancia de unos 15 dB cerca de 3 kHz: un tono de 3 kHz a 70 dB da
13,8 sonios (78,0 fonios) con `field="free"` y 5,0 sonios (62,7 fonios) con
`field="eardrum"`, y nada en el resultado dice cuál de las dos era la
apropiada. En el otro sentido, una grabación de campo libre analizada como
`'eardrum'` se queda corta en la misma medida.

**`presentation` es el otro factor dos.** `monaural` calcula un oído con el
otro en silencio, `diotic` presenta la señal idéntica a los dos oídos — que es
lo que representa la grabación de un único micrófono en campo libre, ya que
ambos oídos escuchan el mismo campo — y `binaural` combina dos señales de oído
independientes a través de la etapa de inhibición de la norma. El tono
definitorio de 1 kHz a 40 dB es 1,000 sonios diótico y 0,667 sonios monoaural,
la razón 1,5 que enuncia el apartado 8.1, y la inhibición es la razón de que
dos oídos den alrededor de vez y media lo de un solo oído en vez de exactamente
el doble. Con una entrada de un solo espectro, `binaural` y `diotic` coinciden,
así que la distinción solo tiene efecto con la entrada de dos canales de
`loudness_moore_glasberg_time`. Ojo además con que `loudness_ecma()` solo
ofrece `'free'` y `'diffuse'`, así que el material referido al tímpano hay que
corregirlo antes de que llegue al modelo de ECMA-418-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\ \text{sonios/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 sonio / 40 fonios por construcción del sonio.
res = psychoacoustics.loudness_moore_glasberg_from_spectrum([(1000.0, 40.0)], field="free")
print(f"N = {res.loudness:.3f} sonios  ({res.loudness_level:.1f} fonios)")   # 1.000 sonios (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' [sonios/Cam]")
plt.show()
```

</details>

### Desde un espectro de tercio de octava (apartado 5.5)

El método exacto quiere componentes sinusoidales, pero el apartado 5.5 define
la entrada que un sonómetro entrega de verdad: los niveles de las 29 bandas de
tercio de octava contiguas de 25 Hz a 16 kHz sobre los centros nominales de
IEC 61260-1:2014. Cada banda se supone plana y se expande internamente en un
conjunto equivalente de componentes antes de que corra el método exacto. Hay
dos restricciones que conviene decir sin rodeos: exactamente 29 valores y una
rejilla fija — un sonómetro que registre de 20 Hz a 20 kHz hay que recortarlo a
ella, y uno que se detenga en 8 kHz no sirve en absoluto.

```python
# `psychoacoustics` lo importan los fragmentos de arriba.
# Un espectro de ventilación tal como lo registra un sonómetro: 29 bandas de
# tercio de octava, de 25 Hz a 16 kHz, en dB SPL.
band_levels = [42.0, 45.0, 48.0, 51.0, 54.0, 56.0, 57.0, 57.0, 56.0, 55.0,
               54.0, 53.0, 52.0, 51.0, 50.0, 49.0, 48.0, 47.0, 46.0, 45.0,
               43.0, 41.0, 39.0, 37.0, 34.0, 31.0, 28.0, 25.0, 22.0]

n_mg = psychoacoustics.loudness_moore_glasberg_from_third_octave(
    band_levels, field="diffuse")
print(f"{n_mg.loudness:.1f} sonios  ({n_mg.loudness_level:.1f} fonios)")  # 17.4 sonios (81.3 fonios)

# La misma medición pasada por ISO 532-1, que se detiene una banda antes:
n_zw = psychoacoustics.loudness_zwicker_from_spectrum(
    band_levels[:28], field="diffuse")
print(f"{n_zw.loudness:.1f} sonios  ({n_zw.loudness_level:.1f} fonios)")  # 13.8 sonios (77.9 fonios)
```

Las dos normas ni siquiera coinciden en dónde termina el espectro: ISO 532-2
toma 29 bandas hasta 16 kHz e ISO 532-1 toma 28 hasta 12,5 kHz, que es la razón
del recorte. El resto de la diferencia son los modelos: excitación roex y suma
binaural explícita frente a la sonoridad de núcleo de ISO 532-1. Usa
`field="diffuse"` para una medición en sala hecha con un sonómetro corregido a
campo libre — el argumento de campo es donde más se equivoca quien entra por
niveles de banda.

### `loudness_moore_glasberg()` y sus variantes `_from_spectrum` / `_from_third_octave`

Los tres puntos de entrada solo se diferencian en cómo se aporta el espectro, y
comparten `field` y `presentation`.

| Parámetro | Se aplica a | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- | :--- |
| `x` | `loudness_moore_glasberg` | array 1D | Pa | no vacío | Señal de presión calibrada |
| `fs` | `loudness_moore_glasberg` | int | Hz | > 0 | |
| `components` | `_from_spectrum` | lista de `(f, L)` | Hz, dB SPL | — | Componentes sinusoidales discretas |
| `band_levels` | `_from_third_octave` | vector de 29 | dB SPL | 25 Hz .. 16 kHz | Centros nominales de IEC 61260-1; exactamente 29 |
| `field` | las tres | str | — | `'free'` (por defecto) / `'diffuse'` / `'eardrum'` | Transferencia del oído externo (apartado 7.2) |
| `presentation` | las tres | str | — | `'binaural'` (por defecto) / `'diotic'` / `'monaural'` | Suma binaural (apartado 8.1) |

Devuelve un `MooreGlasbergLoudness`: `loudness` ($N$, sonios), `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_\text{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} sonios  ({res.loudness_level_max:.0f} fonios)")   # 1.000 sonios (40 fonios)
print(f"sonoridad de largo plazo superada el 5% del tiempo: {res.percentiles[5.0]:.3f} sonios")   # 0.999 sonios

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

La sonoridad de corto plazo sube en unas pocas decenas de milisegundos y cae
despacio, imitando la sensibilidad rápida del oído al ataque y su recuperación
más lenta; la de largo plazo vuelve a integrar esa traza con una constante de
tiempo mucho mayor, así que apenas reacciona a una sílaba suelta y sigue en
cambio el nivel global de un suceso. El máximo de esa traza lenta,
$N_\text{max}$, es el predictor que la norma da para la sonoridad de un
sonido breve, y su validez se acaba hacia los 5 s porque más allá el oyente
deja de juzgar el sonido como un único suceso. Por eso mismo los percentiles
van a su lado: para un sonido que fluctúa sin una estructura clara de sucesos,
un percentil de la sonoridad de largo plazo (típicamente el valor al 5 %) es el
estadístico estable, mientras que $N_\text{max}$ lo fijaría el único peor
instante.

*Un pulso de 200 ms a 1 kHz y 60 dB SPL: la sonoridad de corto plazo alcanza
4,8 sonios en unas pocas decenas de milisegundos y se relaja deprisa, mientras
la de largo plazo integra hasta 3,6 sonios y decae lentamente tras el final del
pulso; el par de constantes de tiempo que definen los apartados 7.8/7.9 de
ISO 532-3.*

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

```python

from phonometry import psychoacoustics

# La figura es un pulso, no un tono estacionario: 1 kHz a 60 dB SPL, abierto
# entre los 200 y los 400 ms de un registro de 0,8 s.
fs = 48000
t = np.arange(int(0.8 * fs)) / fs
sig = np.zeros_like(t)
on = (t >= 0.2) & (t < 0.4)
sig[on] = np.sqrt(2) * 2e-5 * 10 ** (60 / 20) * np.sin(2 * np.pi * 1000 * t[on])
burst = psychoacoustics.loudness_moore_glasberg_time(sig, fs)
print(round(float(burst.short_term_loudness.max()), 1),
      round(float(burst.long_term_loudness.max()), 1))   # 4.8  3.6

# El resultado lleva ambas trazas sobre un eje temporal de 1 ms:
burst.plot(language="es")
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` (sonios), 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
la misma ancla de 1 kHz/40 dB calibra el front-end. La implementación de sala
limpia devuelve 0,9845 sone_HMS para esa ancla en lugar de exactamente 1: el
residuo del 1,55 % viene del promediado de bandas que impone el apartado 6.2.3
sobre las bandas que caen en la frontera entre tamaños de bloque y que excita
el flanco inferior del tono, cerca de 800 a 900 Hz — sin ningún promediado de
bandas la cadena da 0,955; con el promediado restringido a las vecinas del
mismo tamaño de bloque, 0,996; y con el recálculo completo entre grupos que
exige la norma, 0,9845. La constante de calibración $c_N$ se conserva en su
valor tabulado literal en vez de reajustarse, que es la razón de que la
desviación se vea siquiera; la
[referencia de la API de `psychoacoustics.loudness.ecma`](/phonometry/es/reference/api/psychoacoustics/ecma/)
lleva la explicación completa.

```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:.4f} sone_HMS")   # 0.9845 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
```

*El tono de 1 kHz a 60 dB SPL, N = 2,8 sone_HMS: un tono más sonoro que el
ancla de 40 dB del fragmento de arriba, que da 0,98 sone_HMS. La sonoridad es
el área bajo $N'(z)$, así que un sonido de banda ancha que reparta un patrón
bajo sobre muchas bandas puede pesar más que este pico único.*

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

```python

from phonometry import psychoacoustics

# La figura es el tono de 60 dB, no el ancla de 40 dB del fragmento de arriba.
fs = 48000
t = np.arange(int(1.2 * fs)) / fs
x = np.sqrt(2) * 2e-5 * 10 ** (60 / 20) * np.sin(2 * np.pi * 1000 * t)
res = psychoacoustics.loudness_ecma(x, fs, field="free")
print(f"N = {res.loudness:.1f} sone_HMS")   # 2.8 sone_HMS

# 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 razón 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("Razón 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

El ancho de banda ERB<sub>N</sub> y la escala Cam de Glasberg y Moore (1990)
de Moore 6.ª ed. pp. 76-77, mediante `erb_bandwidth()`, `cam_from_frequency()`
y `frequency_from_cam()`. 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_\text{max}$, mediante
`loudness_moore_glasberg_time()`. ECMA-418-2:2025 (modelo de Sottek): el
ensamblaje de sonoridad del apartado 8, mediante `loudness_ecma()`.

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

- [Sonoridad](/phonometry/es/perception/psychoacoustics/loudness/): el método de referencia de
  Zwicker (ISO 532-1), su ficha acreditada y las líneas isofónicas de ISO 226.
- [Métricas de calidad sonora](/phonometry/es/perception/psychoacoustics/sound-quality/): la
  tonalidad, la aspereza y la intensidad de fluctuación construidas sobre el
  mismo front-end de ECMA-418-2.
- [Teoría](/phonometry/es/reference/theory/perception/): las ecuaciones que sustentan los modelos de sonoridad.
- Referencia de la API: [`psychoacoustics.loudness.moore_glasberg`](/phonometry/es/reference/api/psychoacoustics/moore-glasberg/), [`psychoacoustics.loudness.moore_glasberg_time`](/phonometry/es/reference/api/psychoacoustics/moore-glasberg-time/) y [`psychoacoustics.loudness.ecma`](/phonometry/es/reference/api/psychoacoustics/ecma/).
- Teoría: [Modelos avanzados de sonoridad y calidad sonora](/phonometry/es/reference/theory/perception/#modelos-avanzados-de-sonoridad-y-calidad-sonora): qué cambian los modelos de Moore-Glasberg y de Sottek respecto al de Zwicker, y por qué los tres discrepan donde lo hacen.

## Respuestas rápidas

### ¿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_\text{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.
