<!-- canonical: https://jmrplens.github.io/phonometry/es/perception/psychoacoustics/loudness/ -->
Source: https://jmrplens.github.io/phonometry/es/perception/psychoacoustics/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 el
método de referencia, la sonoridad en sonios de Zwicker (ISO 532-1), además
de las líneas isofónicas de tonos puros (ISO 226); las familias de modelos
más nuevas, Moore-Glasberg (ISO 532-2/-3) y la sonoridad del modelo de
Sottek (ECMA-418-2), están en
[Sonoridad avanzada](/phonometry/es/perception/psychoacoustics/advanced-loudness/).
La agudeza, la tonalidad y la aspereza están en
[Métricas de calidad
sonora](/phonometry/es/perception/psychoacoustics/sound-quality/); las
métricas de habla en el
[índice de transmisión del
habla](/phonometry/es/perception/speech/speech-transmission/) y
el [índice de inteligibilidad del
habla](/phonometry/es/perception/speech/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_level` en fonios y `loudness` en sonios — el $N$ estacionario único
con `stationary=True`, y si no el máximo $N_\text{max}$ de la traza de
sonoridad — más los percentiles de informe `n5` y `n10` cuando el análisis es
variable en el tiempo.

## Sonoridad en sonios (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 sonios**, una escala de razón: 4 sonios es el doble de sonoro
que 2 sonios. Por definición, un tono de 1 kHz a 40 dB SPL es 1 sonio, y cada
+10 fonios duplica el valor en sonios.

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

### Medir la entrada (apartado 4)

La sonoridad es una magnitud de nivel absoluto: en ella no se cancela nada, así
que una grabación sin calibrar o ponderada A produce un número verosímil que
sencillamente está mal, y el resultado no lleva ninguna señal de ello. Por eso
ISO 532-1 especifica la entrada antes de especificar el modelo.

**La cadena.** Un micrófono, un preamplificador y un amplificador que cumplan
la clase 1 de IEC 61672-1:2013, y una calibración de campo que convierta las
unidades digitales en pascales: ese factor es lo que espera
`calibration_factor`, y sale de la
[calibración](/phonometry/es/signals/metrology/calibration/). El apartado 4
fija la frecuencia de muestreo de la implementación de referencia en 48 kHz;
las demás se remuestrean a ella, cosa que la biblioteca hace internamente. Para
la entrada por niveles de banda, los 28 niveles de tercio de octava deben salir
de filtros conformes con la clase 1 de IEC 61260-1:2014, con frecuencias
centrales de 25 Hz a 12,5 kHz.

**Dos reglas sobre las propias muestras.** Ninguna ponderación frecuencial de
ningún tipo: la Nota 1 de la definición 3.2 establece que las ponderaciones
como la A no deben usarse para el cálculo de sonoridad, porque el modelo aplica
internamente la ponderación propia del oído y una entrada ponderada A la
pondera dos veces. Y presión acústica verdadera, no datos normalizados ni
escalados a pico (apartado 4, «valores correctos de presión acústica, sin datos
normalizados»). El `sens = 1.0` de los fragmentos de abajo es un marcador de
posición que mantiene ejecutable esta página, no un valor por defecto que
merezca conservarse: equivócate en 10 dB al calibrar y la sonoridad que se
informa se duplica o se reduce a la mitad (13,1 sonios pasan a 26,6 o a 6,5 en
la señal de ejemplo), lo que empequeñece cualquier diferencia entre los modelos
de la página siguiente.

**Dónde va el micrófono.** La Nota 2 de la definición 3.19 lo sitúa en el punto
donde estaría el centro de la cabeza de quien escucha, con esa persona ausente;
eso es lo que hace que la sonoridad calculada sea la de una presentación
*diótica*, el mismo sonido en ambos oídos. La geometría dibujada abajo es la
posición de observador de ECMA-74 — 1,00 m desde la caja de referencia, 1,50 m
sobre el plano reflectante — porque ISO 532-1 no prescribe distancia propia y
la toma de la norma de emisión que corresponda.

*Las tres vías hacia una entrada válida. El panel A da $N_\mathrm{F}$ y el panel B
$N_\mathrm{D}$; el tipo de campo forma parte del resultado, no es una preferencia.*

**Qué campo, y por qué hay que declararlo.** `field="free"` aplica la función
de transferencia de campo libre frontal de la cabeza y el oído externo y encaja
con un campo directo — cámara anecoica, cerca de una fuente, al aire libre;
`field="diffuse"` aplica la de incidencia aleatoria y encaja con una sala
reverberante o con una medición in situ. La corrección es una forma espectral
fija que se aplica a los niveles de banda antes de la etapa de bandas críticas,
máxima por encima de 1 kHz, donde más difieren la difracción en la cabeza y la
resonancia del canal auditivo: sobre un espectro plano de 60 dB el resultado en
campo difuso es de 33,9 sonios frente a 31,9 sonios en campo libre, un 6 % —
poco al lado de un error de calibración, bastante cuando se están comparando
dos productos. El apartado 4 exige especificar el tipo de campo y el apartado 7
lo mete en el informe, así que «N = 13,1 sonios» está incompleto: escribe $N_\mathrm{F}$
o $N_\mathrm{D}$, o pon «campo libre» al lado del número.

**Grabaciones con cabeza artificial.** El Anexo D gobierna la vía del simulador
de cabeza y torso: la grabación debe llevar ya una ecualización acorde con el
entorno de medida — de campo libre solo para una única fuente frontal a más de
1,5 m, de campo difuso en entornos reflectantes, ecualización ID en vehículos —
y cada canal de oído se analiza por separado, informando de los dos y citando
el máximo o la media como valor único.

**Qué tiene que contener el informe** (apartado 7): el sonido evaluado, una
referencia a ISO 532-1, qué método se usó (el estacionario del apartado 5 o el
variable en el tiempo del apartado 6), el campo sonoro F o D, el tipo de datos
de entrada (niveles de banda o señal temporal), la sonoridad en sonios y — en
un análisis variable en el tiempo — la función temporal de sonoridad, con
$N_\text{max}$ y $N_5$ cuando se requieran. `ZwickerLoudness.report()` imprime
la mitad acústica de esa lista; el resto llega por `ReportMetadata`.

```python

from phonometry import psychoacoustics

# Una grabación en bruto 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} sonios  ({res.loudness_level:.0f} fonios)")   # 13.1 sonios (77 fonios)

# Señales variables en el tiempo: la sonoridad percentil N5 es el
# estándar para informes.
# Un tren de 4,4 s de ráfagas tonales de 1 kHz que suben de 45 a 85 dB,
# la más sonora breve.
segments = []
for level, seconds in [(45.0, 0.6), (55.0, 0.6), (65.0, 0.6), (75.0, 0.6), (85.0, 0.25)]:
    n = int(seconds * fs)
    k = np.arange(n)
    env = np.minimum(1.0, np.minimum(k, n - 1 - k) / (0.02 * fs))   # rampas de 20 ms
    p = np.sqrt(2) * 2e-5 * 10 ** (level / 20)                      # amplitud de pico (Pa)
    segments += [p * np.sin(2 * np.pi * 1000 * k / fs) * env, np.zeros(int(0.35 * fs))]
bursts = np.concatenate(segments)

tv = psychoacoustics.loudness_zwicker(bursts, fs)      # stationary=False (por defecto)
print(f"{tv.n5:.1f} {tv.n10:.1f} {tv.loudness:.1f}")   # 14.5 11.4 22.5 — 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 sonios 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, "#d62728", f"Banda ancha plana a 60 dB - N = {broad.loudness:.1f} sonios"),
    (narrow, "#1f77b4", f"Banda estrecha de 1 kHz - N = {narrow.loudness:.1f} sonios"),
]:
    ax.fill_between(z, r.specific, color=color, alpha=0.3)
    ax.plot(z, r.specific, color=color, label=label)
ax.set_xlabel("Razón de banda crítica z [Bark]")
ax.set_ylabel("Sonoridad específica N' [sonios/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_level` (fonios), `specific`
($N'(z)$, 240 bins de 0,1 Bark) y, para los análisis variables en el tiempo,
`n5`, `n10`, `time` y `loudness_vs_time` (traza a 500 Hz). `loudness` ($N$,
sonios) cambia de significado con `stationary`: con `stationary=True` es el $N$
estacionario único del apartado 5, y con el valor por defecto
`stationary=False` es el máximo $N_\text{max}$ de la traza de sonoridad frente
al tiempo del apartado 6, que es la razón de que el primer fragmento de arriba,
ejecutado sobre un tono estable, ya informe de un máximo.

### Leer un resultado variable en el tiempo (apartado 6.4)

Un sonido fluctuante no tiene una sonoridad única, así que el apartado 6.4 de
ISO 532-1 informa de un percentil: $N_5$, la sonoridad superada el 5 % del
tiempo de análisis, porque la media aritmética de $N(t)$ queda
sistemáticamente por debajo de lo que juzga quien escucha; en el tren de
ráfagas de arriba la media es de 4,1 sonios frente a $N_5 = 14,5$. $N_{10}$ es
el compañero más benévolo para sonidos con picos breves, y `res.loudness` es
$N_\text{max}$: la magnitud correcta para buscar el peor instante, y la
equivocada para citarla como «la sonoridad».

*Qué es un percentil de una traza de sonoridad. La ráfaga breve de 85 dB fija
$N_\text{max}$ y casi nada más: ocupa menos del 6 % del registro, así que $N_5$
queda 8 sonios por debajo. El mismo registro analizado con `stationary=True`
devuelve 10,0 sonios, otra magnitud más, la quinta.*

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

```python

# `bursts` y `tv` vienen del fragmento de arriba.
plt.plot(tv.time, tv.loudness_vs_time, label="N(t)")
for value, label in [(tv.loudness, "Nmax"), (tv.n5, "N5"), (tv.n10, "N10")]:
    plt.axhline(value, linestyle="--", label=f"{label} = {value:.1f} sonios")
plt.xlabel("Tiempo [s]")
plt.ylabel("Sonoridad N [sonios]")
plt.legend()
plt.show()
```

</details>

Como $N_5$ es un porcentaje de la ventana de análisis, alargar o acortar el
registro lo mueve. Cita el tiempo de medición junto a $N_5$, mantenlo idéntico
entre los sonidos que se comparan (el apartado 6.4 lo exige) y no uses $N_5$
para impulsos aislados, que es exactamente el caso que caricaturiza la traza de
arriba. `loudness_vs_time` y `time` llevan la traza, así que un registro se
puede recortar al estado de funcionamiento de interés antes de leer el
percentil, y el intervalo de medición va en `ReportMetadata`, ya que la ficha
imprime $N_5$ sin él.

### 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_N$ y los percentiles
$N_5$/$N_{10}$ 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\ \text{sonio}$ ($L_N = Y\ \text{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/buildings/insulation/insulation-ratings/#informe-de-iso-717-report);
un `requirement` aportado se lee como la sonoridad máxima admisible en sonios
(una sonoridad menor cumple). El renderizado necesita reportlab y, para la
figura que incrusta la ficha, matplotlib (`pip install
"phonometry[report,plot]"`); 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 (sonios)
    ),
)                                     # N (sonios) 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 líneas 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 sonoro).
`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 sonios es lo
que calculan los modelos ISO 532, el método de Zwicker de arriba y las
familias más nuevas de
[Sonoridad avanzada](/phonometry/es/perception/psychoacoustics/advanced-loudness/).

Zwicker es el modelo de referencia, no el único. La sonoridad de
**Moore-Glasberg** de ISO 532-2, su extensión variable en el tiempo de
ISO 532-3 y la sonoridad del **modelo de Sottek** de ECMA-418-2, junto con
la tabla de elección de modelo que dice cuándo preferir cada uno, están en
[Sonoridad avanzada](/phonometry/es/perception/psychoacoustics/advanced-loudness/).

## Qué cubre esta guía

ISO 532-1:2017 (método de Zwicker): los requisitos de entrada e
instrumentación del apartado 4, el método estacionario del apartado 5 y el
método variable en el tiempo del apartado 6 con las reglas de percentiles del
apartado 6.4, 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()`; la lista de
contenidos del informe del apartado 7 y las indicaciones del Anexo D para
grabaciones con cabeza y torso. 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()`.

La sonoridad de Moore-Glasberg de ISO 532-2, el método variable en el tiempo
de ISO 532-3 y la sonoridad del modelo de Sottek de ECMA-418-2 se han mudado a
[Sonoridad
avanzada](/phonometry/es/perception/psychoacoustics/advanced-loudness/). Las
curvas de ISO 226:2023 describen solo tonos puros, y la norma no define
interpolación entre las 29 frecuencias tabuladas, así que `loudness_level()`
espera una de las frecuencias de la Tabla 1.

## Véase también

- [Sonoridad avanzada (ISO 532-2/-3, ECMA-418-2)](/phonometry/es/perception/psychoacoustics/advanced-loudness/):
  los modelos de sonoridad de Moore-Glasberg y Sottek y la tabla de elección
  de modelo.
- [Métricas de calidad sonora](/phonometry/es/perception/psychoacoustics/sound-quality/): agudeza,
  tonalidad y aspereza, la otra mitad de la calidad sonora.
- [Molestia psicoacústica e intensidad de fluctuación](/phonometry/es/perception/psychoacoustics/psychoacoustic-annoyance/):
  el modelo de Zwicker y Fastl que consume la sonoridad percentil $N_5$.
- [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/zwicker/) y [`psychoacoustics.loudness.contours`](/phonometry/es/reference/api/psychoacoustics/contours/).
- Teoría: [Sonoridad de Zwicker (ISO 532-1)](/phonometry/es/reference/theory/perception/#sonoridad-de-zwicker-iso-532-1): la integral de sonoridad específica de ISO 532-1 y el patrón de excitación sobre el que se calcula.

## Respuestas rápidas

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

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

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

El apartado 4.1 de ISO 226:2023 define las líneas 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.
