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

Lo *molesto* que resulta un sonido depende de algo más que de su sonoridad.
Fastl y Zwicker, *Psychoacoustics: Facts and Models*, combinan cuatro
sensaciones psicoacústicas (**sonoridad**, **agudeza**, **aspereza** e
**intensidad de fluctuación**) en una única **molestia psicoacústica** $PA$, un
escalar que crece con la sonoridad y se eleva aún más cuando el sonido es agudo,
áspero o fluctúa lentamente. Esta página cubre el modelo exacto de $PA$
(Ecs. 16.2–16.4), la **intensidad de fluctuación** que consume, tanto la forma
cerrada para ruido de banda ancha modulado en amplitud (Ec. 10.2) como el modelo
de señal de Osses et al. (2016), y la utilidad que deriva las cuatro sensaciones
a partir de una grabación.

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

```python

from phonometry import psychoacoustics

n5 = np.linspace(4.0, 60.0, 200)
profiles = [
    ("Base neutra: S = 1.75 acum, F = R = 0", 1.75, 0.0, 0.0),
    ("Sonido agudo: S = 3.5 acum", 3.5, 0.0, 0.0),
    ("Áspero + fluctuante: F = 1.2 vacil, R = 0.7 asper", 2.0, 1.2, 0.7),
]
fig, ax = plt.subplots()
for label, s, f, r in profiles:
    pa = [psychoacoustics.psychoacoustic_annoyance(v, s, f, r).annoyance for v in n5]
    ax.plot(n5, pa, label=label)

ex = psychoacoustics.psychoacoustic_annoyance(30.0, 2.0, 0.5, 0.3)
ax.plot([30.0], [ex.annoyance], "o", label=f"Ejemplo resuelto (PA = {ex.annoyance:.2f})")
ax.set_xlabel("Sonoridad percentil N5 [sonios]")
ax.set_ylabel("Molestia psicoacústica PA")
ax.legend()
plt.show()
```

</details>

## 1. Las cuatro sensaciones

La molestia psicoacústica se apoya en cuatro sensaciones auditivas, cada una con
su propio modelo y unidad en la biblioteca:

- **Sonoridad**: la sonoridad percentil $N_5$ (la sonoridad superada el 5 % del
  tiempo), en **sonios**, del modelo de Zwicker variable en el tiempo de la ISO
  532-1 (`loudness_zwicker`, véase [Sonoridad](/phonometry/es/perception/psychoacoustics/loudness/)).
- **Agudeza** $S$, en **acum**: el balance espectral hacia las altas
  frecuencias, DIN 45692 (`sharpness_din`).
- **Aspereza** $R$, en **asper**: la dureza de la modulación de amplitud rápida
  (~70 Hz), modelo de Sottek ECMA-418-2 (`roughness_ecma`).
- **Intensidad de fluctuación** $F$, en **vacil**: la sensación de fluctuación
  lenta (~4 Hz) de la sonoridad (§3 más abajo).

## 2. Molestia psicoacústica (Ecs. 16.2–16.4)

El modelo exacto (Fastl y Zwicker Ec. 16.2; origen Widmann 1992) escala $N_5$
por un factor que crece con la ponderación de agudeza $w_S$ y la ponderación
combinada de aspereza/fluctuación $w_{FR}$:

$$
PA = N_5\left(1 + \sqrt{w_S^2 + w_{FR}^2}\right), \qquad
w_S = (S - 1{,}75)\,0{,}25\,\log_{10}(N_5 + 10)\ \ (S > 1{,}75\ \mathrm{acum}), \qquad
w_{FR} = \frac{2{,}18}{N_5^{0{,}4}}\,(0{,}4\,F + 0{,}6\,R).
$$

$w_S$ es cero para $S \le 1{,}75\ \text{acum}$ (la agudeza solo añade molestia
por encima de
ese umbral); $w_{FR}$ pondera la aspereza con más peso que la intensidad de
fluctuación (0,6 frente a 0,4). Esas dos elecciones son todo el juicio de
modelado que hay en la fórmula, y cuesta menos fiarse de ellas una vez vistas:

*Un sonido tiene que ser más agudo que la referencia de 1,75 acum antes de que
la agudeza cueste nada en absoluto, y el abanico por encima de ese punto es la
dependencia de $w_S$ con la sonoridad. A la derecha, la misma magnitud de
sensación compra alrededor de la mitad más de molestia cuando llega como
aspereza que cuando llega como intensidad de fluctuación.*

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

```python

# `psychoacoustics` lo importa el fragmento de arriba.
sharpness = np.linspace(1.0, 5.0, 200)
for n5 in (10.0, 30.0, 60.0):
    w_s = [psychoacoustics.psychoacoustic_annoyance(n5, float(s), 0.0, 0.0).w_s
           for s in sharpness]
    plt.plot(sharpness, w_s, label=f"N5 = {n5:g} sonios")
plt.axvline(1.75, linestyle="--")
plt.xlabel("Agudeza S [acum]")
plt.ylabel("Ponderación de agudeza wS")
plt.legend()
plt.show()

# La misma magnitud gastada en aspereza o en intensidad de fluctuación, con
# N5 = 30 sonios y S = 2.0 acum fijos:
rough = psychoacoustics.psychoacoustic_annoyance(30.0, 2.0, 0.0, 1.5).annoyance
fluct = psychoacoustics.psychoacoustic_annoyance(30.0, 2.0, 1.5, 0.0).annoyance
print(round(rough, 1), round(fluct, 1))   # 45.4 40.5
```

</details>

`psychoacoustic_annoyance` toma las cuatro
magnitudes directamente y devuelve la molestia junto con las dos ponderaciones
intermedias:

```python
from phonometry import psychoacoustics

res = psychoacoustics.psychoacoustic_annoyance(30.0, 2.0, 0.5, 0.3)   # N5, S, F, R
print(round(res.annoyance, 4))   # 37.0477
print(round(res.w_s, 4), round(res.w_fr, 4))   # 0.1001 0.2125

res.plot()   # PA junto a sus ponderaciones wS y wFR (necesita matplotlib)
```

**Qué significa ese número.** $PA$ no lleva unidad ni criterio. Está construido
de modo que un sonido neutro — agudeza igual o menor que 1,75 acum, sin
aspereza y sin fluctuación — tenga un $PA$ igual a su $N_5$ en sonios, y toda
cualidad aguda, áspera o fluctuante solo puede empujarlo *por encima* de ese
suelo. Así que lee $PA$ como «la sonoridad que vale este sonido una vez tenido
en cuenta su carácter»: el 37,05 del ejemplo resuelto frente a un $N_5$ de
30 sonios dice que el carácter cuesta un 23 %. El objetivo es comparar —
ordenar dos diseños del mismo producto, o cuantificar lo que ha comprado un
arreglo — y no existe ningún límite contra el que citarlo.

:::caution
**Esta no es la molestia de la evaluación de ruido ambiental.** La molestia
psicoacústica es un escalado de laboratorio de un solo sonido. No dice nada de
la exposición a largo plazo, la franja horaria, la actitud de la población
hacia la fuente ni el porcentaje de altamente molestos, que es asunto de los
niveles de evaluación y de las relaciones exposición-respuesta de
[Niveles ambientales](/phonometry/es/environment/assessment/environmental-levels/).
Un $PA$ de 37 no es «un 37 % de altamente molestos», y las dos magnitudes no
son convertibles.
:::

La figura de arriba barre $PA$ frente a $N_5$ para tres perfiles: una base
neutra ($S = 1{,}75\ \text{acum}$, $F = R = 0$, de modo que $PA = N_5$), un
sonido agudo y un
sonido áspero y fluctuante, ambos elevados sobre la base, con el ejemplo
resuelto marcado.

El modelo es tan compacto que cabe entero en un dibujo: dos ponderaciones y
una combinación. El diagrama recorre con él el ejemplo resuelto, sensación a
sensación.

### 2.1 A partir de una señal (estimación de ingeniería)

`psychoacoustic_annoyance_from_signal` es una utilidad que deriva las cuatro
sensaciones a partir de una señal de presión calibrada y las combina: $N_5$ de
la sonoridad de Zwicker variable en el tiempo de la ISO 532-1, $S$ de la agudeza
DIN 45692, $R$ de la aspereza de Sottek ECMA-418-2 y $F$ del modelo de señal
de
intensidad de fluctuación.

La utilidad vale lo que valga el registro que se le dé, y ninguno de los dos
puntos de entrada de esta página admite un argumento de calibración, así que
`x` tiene que venir ya como **presión calibrada en pascales**; de dónde sale
ese factor está en
[Medir la entrada](/phonometry/es/perception/psychoacoustics/loudness/#medir-la-entrada-apartado-4),
en la página de sonoridad. Más allá de la calibración: sin ponderar; un único
estado de funcionamiento declarado, no una subida de régimen; lo bastante largo
como para que $N_5$ sea el percentil de algo y para que el análisis de
fluctuación de ~4 Hz tenga suficientes periodos de modulación, lo que en la
práctica significa varios segundos y la misma duración para todos los diseños
que se comparen; y un `field=` acorde con cómo se captó el sonido. Un fragmento
de dos segundos da un $N_5$ que es casi $N_\text{max}$ y una $F$ sesgada a la
baja. Una grabación binaural o con cabeza artificial se analiza un oído cada
vez, ya ecualizada a campo libre o a campo difuso, y lo habitual es informar
del canal más sonoro.

```python

from phonometry import psychoacoustics

# Una grabación en bruto y su calibración para que la guía funcione por sí
# sola. Aquí no hay argumento calibration_factor, así que x tiene que estar ya
# en pascales.
fs = 48000
t = np.arange(int(5.0 * fs)) / fs
x = (1.0 + 0.8 * np.sin(2 * np.pi * 4.0 * t)) * np.sin(2 * np.pi * 1000 * t)
x *= 2e-5 * 10 ** (70 / 20) / np.sqrt(np.mean(x**2))   # calibrada a 70 dB SPL

res = psychoacoustics.psychoacoustic_annoyance_from_signal(x, fs, field="free")
print(f"PA = {res.annoyance:.1f}  (N5 = {res.n5:.1f} sonios, S = {res.sharpness:.2f} acum,"
      f" R = {res.roughness:.2f} asper, F = {res.fluctuation_strength:.2f} vacil)")

res.plot()   # la misma vista PA / wS / wFR, ahora con las cuatro sensaciones derivadas
```

Las cuatro sensaciones tienen que salir del *mismo* registro y del mismo estado
de funcionamiento: PA es una regla de combinación, no una medición por derecho
propio, así que calcular $N_5$ sobre un minuto y $R$ sobre dos segundos de ese
minuto mezcla en silencio dos sonidos distintos. Cita cada sensación con el
modelo que la produjo.

:::caution
**Advertencia sobre la mezcla de modelos.** Este compuesto mezcla familias de
modelos: $N_5$ y $S$ de la familia Zwicker, $R$ de Sottek y $F$ de Osses. El
modelo $PA$ se calibró con sensaciones de la familia Zwicker, así que trata la
utilidad de señal como una *estimación de ingeniería*. Para resultados exactos y
reproducibles, calcula las cuatro magnitudes con los modelos en los que confíes
y pásalas directamente a `psychoacoustic_annoyance` (la función de cuatro
argumentos es el modelo exacto).
:::

## 3. Intensidad de fluctuación

La **intensidad de fluctuación** $F$ (vacil) cuantifica la percepción de la
fluctuación *lenta* de la sonoridad. Como la aspereza, es una sensación de paso
de banda de la frecuencia de modulación, pero su máximo se sitúa aproximadamente
un orden de magnitud más abajo, en $f_\mathrm{mod} \approx 4\ \text{Hz}$ en lugar del
máximo de la
aspereza en ~70 Hz. Por definición, un tono de 1 kHz a 60 dB, modulado en
amplitud al 100 % a 4 Hz, produce 1 vacil. Esta página cubre dos de los tres
modelos de intensidad de fluctuación de la biblioteca: la forma cerrada de
Fastl y Zwicker para ruido de banda ancha modulado en amplitud (§3.1) y el
modelo de señal de Osses et al. (2016) para señales arbitrarias (§3.2). La
intensidad de fluctuación normativa del modelo de Sottek (apartado 9 de
ECMA-418-2), en vacil_HMS, está en
[Métricas de calidad sonora](/phonometry/es/perception/psychoacoustics/sound-quality/):
ojo con que la unidad de esta página es el vacil y la de aquella el vacil_HMS,
así que las dos no son el mismo número para el mismo sonido.

*Los dos modelos sobre el mismo estímulo, que es la comparación que el aviso de
abajo convierte en regla. Los dos son pasos de banda centrados cerca de 4 Hz,
pero sobre ruido de banda ancha AM el modelo de señal supera a la forma
cerrada en alrededor de la mitad, porque acumula la modulación banda a banda a
lo largo de todo el eje de Bark. Sobre el tono AM para el que se calibró, a la
derecha, se porta bien.*

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

```python

from phonometry import psychoacoustics

# Panel izquierdo, los dos modelos sobre el mismo estímulo: ruido de banda
# ancha AM a 60 dB, modulación 100 %.
fmod = np.logspace(np.log10(0.5), np.log10(32.0), 240)
f_bbn = [psychoacoustics.fluctuation_strength_am_noise(60.0, 1.0, fm) for fm in fmod]

rng = np.random.default_rng(3)
tn = np.arange(int(4.0 * fs)) / fs
noise = rng.standard_normal(tn.size)
fm_noise = [0.5, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0]
f_noise = []
for fm in fm_noise:
    am = (1.0 + np.sin(2 * np.pi * fm * tn)) * noise
    am = am / np.sqrt(np.mean(am ** 2)) * 2e-5 * 10 ** (60 / 20)
    f_noise.append(psychoacoustics.fluctuation_strength(am, float(fs)).fluctuation_strength)
print(round(f_noise[3], 1), round(f_bbn[np.argmin(np.abs(fmod - 4.0))], 1))   # 5.5 3.7

fig, ax = plt.subplots()
ax.semilogx(fmod, f_bbn, label="forma cerrada, Ec. 10.2")
ax.semilogx(fm_noise, f_noise, "s--", label="modelo de señal de Osses 2016")
ax.axvline(4.0, ls="--", color="0.4")
ax.set_xlabel("Frecuencia de modulación f_mod [Hz]")
ax.set_ylabel("Intensidad de fluctuación F [vacil]")
ax.legend(loc="upper right")
plt.show()
```

</details>

### 3.1 Forma cerrada para ruido de banda ancha AM (Ec. 10.2)

Para ruido de banda ancha modulado sinusoidalmente en amplitud, Fastl y Zwicker
dan una forma cerrada (Ec. 10.2) en función del factor de modulación $m$, el
nivel $L$ y la frecuencia de modulación $f_\mathrm{mod}$:

$$
F = \frac{5{,}8\,(1{,}25\,m - 0{,}25)\,[0{,}05\,(L/\mathrm{dB}) - 1]}
{(f_\mathrm{mod}/5\,\mathrm{Hz})^2 + (4\,\mathrm{Hz}/f_\mathrm{mod}) + 1{,}5}\ \ \mathrm{vacil}.
$$

El denominador es el paso de banda a 4 Hz: alcanza su mínimo cerca de
$f_\mathrm{mod} \approx 3{,}7\ \text{Hz}$ y crece a ambos lados. El resultado se
limita a 0 (la sensación
desaparece por debajo de ~20 dB o $m < 0{,}2$). Esta forma exacta es el valor a
citar para el ruido de banda ancha AM.

```python
from phonometry import psychoacoustics

print(round(psychoacoustics.fluctuation_strength_am_noise(60.0, 1.0, 4.0), 4))   # 3.6943 vacil
```

### 3.2 El modelo de señal de Osses 2016

`fluctuation_strength` implementa el modelo de señal de Osses et al. (2016):
construye un patrón de excitación sobre 47 filtros auditivos, extrae la
modulación de envolvente de ~4 Hz por banda, la pondera y la combina, y
devuelve
la $F$ global (vacil) junto con la intensidad de fluctuación específica sobre el
eje de Bark y la traza dependiente del tiempo.

```python
from phonometry import psychoacoustics

res = psychoacoustics.fluctuation_strength(x, fs)
print(round(res.fluctuation_strength, 2))   # 0.65 vacil para la señal de arriba
res.plot()   # intensidad de fluctuación específica F′(z) sobre el eje de Bark (requiere matplotlib)
```

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

```python

from phonometry import psychoacoustics

# El estímulo tipo referencia: un tono de 1 kHz a 70 dB SPL, modulado en
# amplitud al 100 % a 4 Hz, donde la sensación es máxima.
fs = 48000
t = np.arange(int(2.0 * fs)) / fs
am = (1.0 + np.sin(2 * np.pi * 4.0 * t)) * np.sin(2 * np.pi * 1000 * t)
am = am / np.sqrt(np.mean(am ** 2)) * 2e-5 * 10 ** (70 / 20)
res = psychoacoustics.fluctuation_strength(am, float(fs))
print(round(res.fluctuation_strength, 2))    # 1.09 vacil

# En una línea: la intensidad de fluctuación específica sobre el eje de Bark.
res.plot(language="es")
plt.show()

# O dibuja f'(z) a mano con los arrays que ya lleva el resultado:
fig, ax = plt.subplots()
ax.fill_between(res.bark_axis, res.specific, alpha=0.3)
ax.plot(res.bark_axis, res.specific)
ax.set_xlabel("Razón de banda crítica z [Bark]")
ax.set_ylabel("Intensidad de fluctuación específica [vacil/Bark]")
plt.show()
```

</details>

La sensación se queda donde está la energía modulada, en las bandas críticas
en torno a la portadora, y por eso la forma cerrada de §3.1 y el modelo de
señal divergen para ruido de **banda ancha** modulado: allí la modulación se
reparte por todo el eje de Bark y el modelo banda a banda acumula más de la
que admite la forma cerrada única.

:::note
**Sin norma numérica.** La intensidad de fluctuación no tiene norma ISO/IEC. Esta
es una implementación de sala limpia a partir del artículo de Osses 2016,
calibrada para que el tono AM de 1 kHz / 60 dB / $m = 1$ / 4 Hz marque
1,00 vacil por construcción, y contrastada con los valores de la literatura de
la Tabla 1 de Osses 2016 y con la referencia abierta SQAT (usada solo como
oráculo numérico).
En el barrido de tono AM a 70 dB
$f_\mathrm{mod} \in \{1, 2, 4, 8, 16, 32\}\ \text{Hz}$ da
`[0,40, 0,79, 1,09, 1,05, 0,17, 0,09]` vacil frente a la literatura
`[0,39, 0,84, 1,25, 1,30, 0,36, 0,06]` ($r$ de Pearson $= 0{,}98$, máximo
correcto a 4 Hz, dentro de ~2,1×). La exactitud para tonos FM no se persigue
explícitamente.
Para **ruido de banda ancha AM** el modelo de señal sobreestima el nivel absoluto
(reparte la energía modulada entre las bandas); cita la forma cerrada
`fluctuation_strength_am_noise` (§3.1) para ese estímulo.
:::

## Qué cubre esta guía

Fastl y Zwicker, en *Psychoacoustics: Facts and Models*, dan el modelo exacto
de $PA$, Ecs. 16.2-16.4 (origen Widmann 1992), que ejecuta
`psychoacoustic_annoyance`. También dan la forma cerrada para ruido de banda
ancha AM, Ec. 10.2, que ejecuta `fluctuation_strength_am_noise`. El modelo de
señal de Osses et al. (2016) para la intensidad de fluctuación se ejecuta como
`fluctuation_strength`, contrastado con los valores de su Tabla 1 y con la
referencia SQAT. `psychoacoustic_annoyance_from_signal` deriva las cuatro
magnitudes a partir de una señal ($N_5$ Zwicker de la ISO 532-1, $S$ de la DIN
45692, $R$ de ECMA-418-2) y las combina con el modelo exacto.

La exactitud del modelo de Osses 2016 para tonos FM no se persigue
explícitamente. Aquí solo se validan estímulos AM. El front-end también se
aparta del planteamiento exacto del artículo (tramas de 2 s, solape del 90 %, umbral
absoluto de audición). Como resultado, un tono estacionario de 1 kHz marca
unos 0,09 vacil en vez de 0, y el ruido de banda ancha estacionario marca unos
0,15-0,19 vacil. Para el ruido de banda ancha AM, cita
`fluctuation_strength_am_noise` (§3.1) en vez de `fluctuation_strength`, que
sobreestima ese estímulo. La intensidad de fluctuación normativa del modelo de
Sottek del apartado 9 de ECMA-418-2 no está implementada en esta página: está
en [Métricas de calidad
sonora](/phonometry/es/perception/psychoacoustics/sound-quality/).

## Véase también

- [Sonoridad](/phonometry/es/perception/psychoacoustics/loudness/): la sonoridad
  percentil $N_5$ de ISO 532-1 que este modelo toma como primer argumento, y las
  reglas de captación que la grabación tiene que cumplir antes de que nada de
  esto sirva.
- [Métricas de calidad sonora](/phonometry/es/perception/psychoacoustics/sound-quality/):
  la agudeza $S$ de DIN 45692, la aspereza $R$ de ECMA-418-2 y la intensidad de
  fluctuación normativa en vacil_HMS de la misma sensación que esta página
  modela en vacil.
- [Sonoridad avanzada](/phonometry/es/perception/psychoacoustics/advanced-loudness/):
  los modelos de sonoridad alternativos, y por qué mezclar familias hace del
  compuesto una estimación de ingeniería.
- [Niveles ambientales](/phonometry/es/environment/assessment/environmental-levels/):
  la molestia de la comunidad, la otra cosa que significa la palabra, y los
  niveles de evaluación con los que se valora.
- Teoría: [Modelos avanzados de sonoridad y calidad sonora](/phonometry/es/reference/theory/perception/#modelos-avanzados-de-sonoridad-y-calidad-sonora): las métricas de sonoridad y de calidad sonora que combina el modelo de molestia, deducidas una a una.
- Referencia de la API: [`psychoacoustics.quality.annoyance`](/phonometry/es/reference/api/psychoacoustics/annoyance/) y [`psychoacoustics.quality.fluctuation_strength`](/phonometry/es/reference/api/psychoacoustics/fluctuation-strength/).
