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

Un tono estacionario inmerso en ruido de banda ancha resalta cuando emerge de
forma audible por encima del ruido que de otro modo lo enmascararía, la
condición objetiva previa a las penalizaciones tonales del análisis de ruido.
**ISO/PAS 20065:2016** es el *método de ingeniería* que cuantifica esa
audibilidad: a partir de un espectro de banda estrecha (FFT) obtiene, para cada
tono prominente, la **audibilidad** $\Delta L$: cuántos decibelios supera el nivel
del tono al umbral de enmascaramiento del ruido circundante. (Que un tono sea
*molesto* es un juicio de valoración posterior e independiente.) Es el método
detallado al que remite **ISO 1996-2:2017** (la vía simplificada del Anexo C
está en [medición ambiental](/phonometry/es/environment/assessment/environmental-levels/)); la audibilidad
media $\Delta L$ que produce alimenta el ajuste tonal $K_\mathrm{t}$ de ISO 1996-2.

*Los nueve tonos del espectro de motor de combustión del Anexo E de
ISO/PAS 20065, cada uno evaluado en su propia banda crítica. Una barra por
encima de la línea discontinua de $\Delta L = 0$ dB es audible sobre el ruido
que la enmascara, y la más alta de todas, el tono de 137,3 Hz con 5,0 dB, es la
mayor audibilidad *por tono* de este espectro. Todavía no es la audibilidad
decisiva del espectro: el §3 enseña por qué la respuesta de la propia norma es
9,18 dB.*

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

```python

from phonometry import psychoacoustics

# Espectro 1 del motor de combustión (Anexo E de ISO/PAS 20065): nueve tonos
# (fT, LT, LS) de un espectro de banda estrecha con separación de líneas de 2.7 Hz
fT = [118.4, 137.3, 158.8, 314.9, 433.4, 592.2, 629.8, 643.3, 1582.7]
LT = [64.56, 67.96, 68.63, 68.50, 73.17, 78.31, 75.00, 79.75, 71.07]
LS = [48.91, 49.22, 50.50, 52.85, 58.29, 59.53, 59.71, 61.98, 54.16]

res = psychoacoustics.assess_tones(fT, LT, LS, 2.7)
print(round(res.decisive_audibility, 2), res.decisive_frequency)  # 5.01 137.3
res.plot(language="es")   # barras de audibilidad por tono, con el tono decisivo resaltado
plt.show()
```

</details>

## 0. El espectro que necesita este método

Todas las secciones siguientes consumen un espectro de banda estrecha, e
ISO/PAS 20065 es concreta sobre cuál. Se puede seguir esta página de principio
a fin y producir una audibilidad que la norma rechazaría, porque el analizador
estaba configurado de otra manera: la aritmética no da ninguna señal de ello.

**Ajustes del analizador (apartado 4.2).** Una cadena de clase 1 según
IEC 61672-1 con una frecuencia límite inferior de 20 Hz o menos, un filtro
antialiasing antes de la digitalización y una resolución de amplitud de al
menos 0,1 dB. La separación constante entre líneas $\Delta f$ debe estar entre
1,9 Hz y 4,0 Hz, ambas incluidas: los 2,7 Hz del ejemplo del Anexo E caen en
mitad de esa ventana, que es lo que lleva `assess_tones(..., 2.7)` en su último
argumento. La ventana de Hanning es *obligatoria*, y de ahí sale la corrección
de ancho de banda de −1,76 dB del §2: otra ventana tiene otro ancho de banda
efectivo, así que esa constante, y con ella todos los niveles de la cadena,
quedarían mal.

**Ponderación A, antes que nada (apartado 5.3.2).** El método está definido
sobre un espectro de banda estrecha ponderado A; la biblioteca es agnóstica a
la ponderación y no aplica ninguna, así que quien llama pondera las líneas
antes. Importa porque la audibilidad es una diferencia de dos niveles tomada
sobre una banda crítica: una ponderación plana a lo ancho de la banda se
cancelaría, pero la curva A es más empinada justo donde viven las quejas
tonales. En el tono de 137,3 Hz del ejemplo vale unos −15 dB, y sube casi 9 dB
a lo ancho de la banda crítica de ese mismo tono (−19,8 dB a 95,7 Hz frente a
−11,0 dB a 197,0 Hz), así que se mueven $L_\mathrm{T}$ y $L_\mathrm{S}$, y en distinta medida.
Los números del Anexo E de esta página ya están ponderados A, que es la señal
delatora: quien los reproduzca desde un analizador sin ponderar encontrará los
tonos graves demasiado altos.

**Promediado (apartados 4.3 y 5.1).** Los espectros básicos del propio
analizador duran menos de un segundo con esta separación de líneas, así que se
combinan línea a línea (Fórmula 1) en espectros de unos 3 s. Esos 3 s son un
suelo, no una preferencia: el apartado 5.1 dice que un promediado más corto da
audibilidades injustificadas, tanto por exceso *como* por defecto. Después se
toman al menos 12 espectros de 3 s escalonados en el tiempo, porque es lo que
en general mantiene la incertidumbre expandida dentro de ±1,5 dB, y entre ellos
tiene que aparecer cada uno de los estados de funcionamiento alternantes de la
fuente.

*La estructura temporal detrás de una penalización tonal defendible. La
biblioteca arranca en la tercera franja: toma espectros combinados y devuelve
audibilidades, así que las dos primeras corren por cuenta de quien llama.*

**Cuándo no se aplica el método.** Una fuente cuyo nivel o cuya frecuencia
tonal se mueve demasiado deprisa como para representarla con un promedio de 3 s
no se puede evaluar así en absoluto: transitorios de arranque, maquinaria con
la velocidad muy variable. El apartado 5.1 pone esa exclusión en la norma en
vez de dejarla al criterio de cada cual.

**Qué tiene que llevar el informe** (apartado 7): fecha y lugar; una
descripción del entorno de medición con la fuente, las posiciones de medida y
un croquis del entorno; temperatura del aire, presión atmosférica y humedad
relativa; velocidad y dirección medias del viento; marca, modelo y número de
serie de cada instrumento; la separación entre líneas y el margen de
frecuencias investigado; para cada espectro con una audibilidad decisiva mayor
que cero, las frecuencias de los tonos y sus audibilidades; la audibilidad
media; la incertidumbre expandida siempre que se hayan promediado menos de 12
espectros; y un gráfico de los niveles de banda estrecha del espectro de 3 s
con el mayor $\Delta L$. `ToneAudibilityResult.report()` imprime la mitad
acústica de esa lista e incrusta ese gráfico; las mitades de entorno e
instrumentación llegan por `ReportMetadata`.

## 1. La banda crítica en torno al tono

Cada tono de frecuencia $f_\mathrm{T}$ se evalúa dentro de una banda crítica cuyo ancho
es (Fórmula 2)

$$
\Delta f_\mathrm{c} = 25{,}0 + 75{,}0\left(1{,}0 + 1{,}4\left(\tfrac{f_\mathrm{T}}{1000}\right)^{2}\right)^{0{,}69}\ \mathrm{Hz}.
$$

Con una posición geométrica de las frecuencias de esquina en torno al tono
(Fórmulas 3–5), $\sqrt{f_1 f_2} = f_\mathrm{T}$ y $f_2 - f_1 = \Delta f_\mathrm{c}$, de modo que
$f_1 = -\Delta f_\mathrm{c}/2 + \sqrt{\Delta f_\mathrm{c}^2 + 4 f_\mathrm{T}^2}/2$ y
$f_2 = f_1 + \Delta f_\mathrm{c}$.

```python
from phonometry import psychoacoustics

print(round(psychoacoustics.critical_bandwidth_engineering(137.3), 2))   # 101.36 Hz
f1, f2 = psychoacoustics.critical_band_corners(137.3)
print(round(f1, 2), round(f2, 2))                            # 95.67 197.04
```

## 2. Audibilidad de un tono

El nivel medio de banda estrecha $L_\mathrm{S}$ del ruido enmascarante (Fórmula 6, un
promedio energético iterativo de las líneas de la banda crítica) y el nivel del
tono $L_\mathrm{T}$ (Fórmula 8, la suma energética de las líneas tonales) se derivan del
espectro de banda estrecha; `mean_narrowband_level` y `tone_level` lo hacen
directamente (ver §4). El nivel de banda crítica del ruido enmascarante
reparte $L_\mathrm{S}$ sobre el ancho de banda crítico (Fórmula 12), el índice de
enmascaramiento tiene en cuenta el oído (Fórmula 13) y la audibilidad es su
diferencia (Fórmula 14):

$$
L_\mathrm{G} = L_\mathrm{S} + 10\log_{10}\!\frac{\Delta f_\mathrm{c}}{\Delta f}, \qquad
a_\mathrm{v} = -2 - \log_{10}\!\Big[1 + \big(\tfrac{f}{502}\big)^{2{,}5}\Big], \qquad
\Delta L = L_\mathrm{T} - L_\mathrm{G} - a_\mathrm{v} .
$$

Un tono dado es *audible* cuando $\Delta L > 0$. $\Delta f$ es el
espaciado de líneas (resolución en frecuencia); las sumas energéticas sobre
$K > 1$ líneas llevan una corrección de ventana de
$10\log_{10}(\Delta f/\Delta f_\mathrm{e})$ (−1,76 dB para la ventana de Hanning recomendada,
$\Delta f_\mathrm{e} = 1{,}5\,\Delta f$, Fórmula (8)), mientras que un tono de una sola
línea ($K = 1$) toma su nivel sin cambios (Fórmula (7), sin corrección de
ancho de banda).

```python
from phonometry import psychoacoustics

# ISO/PAS 20065 Anexo E, tono a 137,3 Hz (Δf = 2,7 Hz):
#   LS = 49,22 dB (Fórmula 6), LT = 67,96 dB (Fórmula 8).
print(round(psychoacoustics.tone_audibility(67.96, 49.22, 137.3, 2.7), 2))   # 5.01 dB
print(round(psychoacoustics.masking_index(137.3), 2))                        # -2.02 dB
```

Todo el método es una cadena del espectro al ajuste, y cada magnitud
intermedia de arriba es una parada en ella. El diagrama recorre esa cadena
con el tono del Anexo E, hasta el $K_\mathrm{t}$ que gana la audibilidad media.

## 3. Audibilidad decisiva y media

La audibilidad **decisiva** de un espectro de banda estrecha es la mayor
audibilidad de tono en él (apartado 5.3.8). Sobre $J$ espectros escalonados en
el tiempo, la **audibilidad media** es su media energética (Fórmula 20); un
espectro en el que no se encuentra ningún tono aporta
$\Delta L_j = -10\ \text{dB}$ (Fórmula 21). `assess_tones` es el punto de
entrada *por tono*: aplica las Fórmulas (2)-(5) y (12)-(14) a cada tono que se
le pasa e informa del mayor, que es la audibilidad decisiva solo cuando no hay
dos tonos audibles que compartan banda crítica.

**Cómo se selecciona la banda decisiva.** El método no barre un conjunto fijo
de bandas: cada *tono* detectado define su propia banda crítica (§1), la
audibilidad se evalúa tono a tono y, después de que el Paso 3 haya fusionado
los tonos audibles de una misma banda en grupos `FG` valorados por su miembro
más audible (§5), la audibilidad decisiva es simplemente la mayor $\Delta L$ que
queda en pie (Paso 4). La «banda decisiva» es, por tanto, la banda crítica
centrada en el tono o grupo que gana, y es libre de moverse de un espectro a
otro conforme la fuente recorre sus estados de funcionamiento; la media
energética de la Fórmula 20 deja después que dominen los espectros más
ruidosos (más audibles), lo cual es deliberado: a un tono claramente audible
parte del tiempo no lo disculpan los intervalos en los que desaparece.

```python
from phonometry import psychoacoustics

# Espectro 1 del motor de combustión (Anexo E): nueve tonos (fT, LT, LS), Δf = 2,7 Hz.
fT = [118.4, 137.3, 158.8, 314.9, 433.4, 592.2, 629.8, 643.3, 1582.7]
LT = [64.56, 67.96, 68.63, 68.50, 73.17, 78.31, 75.00, 79.75, 71.07]
LS = [48.91, 49.22, 50.50, 52.85, 58.29, 59.53, 59.71, 61.98, 54.16]
res = psychoacoustics.assess_tones(fT, LT, LS, 2.7)
print(round(res.decisive_audibility, 2), res.decisive_frequency)  # 5.01 137.3

# Los cinco espectros de la campaña del Anexo E, valorados con el Paso 3
# aplicado (valores decisivos de la Tabla E.3), promediados en energía por la
# Fórmula 20:
print(round(psychoacoustics.mean_audibility([9.18, 6.04, 7.46, 2.67, 7.17]), 2))  # 6.98 dB

res.plot(view="levels")   # niveles de tono sobre el ruido enmascarante de su banda crítica
```

Los dos números de ese bloque no son el mismo espectro valorado dos veces con
la misma regla. Los tonos a 118,4, 137,3 y 158,8 Hz caen todos en una misma
banda crítica, así que el Paso 3 del apartado 5.3.8 los fusiona en un grupo
`FG` a su nivel combinado $L_\mathrm{T} = 72{,}15$ dB, y el valor decisivo de la norma
para el espectro 1 son los 9,18 dB que abren la lista de `mean_audibility`, no
los 5,01 dB que imprime la llamada por tono, que es la mayor de las nueve
audibilidades individuales
`[0.75, 0.89, 1.02, 1.79, 1.93, 3.47, 4.39, 4.57, 5.01]`. Esos 4,2 dB
sobreviven al promediado: el valor por tono en lugar de 9,18 baja la media de
la campaña de 6,98 dB a 5,98 dB, que es $K_\mathrm{t} = 3$ dB en vez de 4 dB en la
Tabla J.1 de ISO 1996-2. Así que usa `analyze_spectrum` (§5), que ejecuta el
agrupamiento, siempre que se vaya a declarar una audibilidad decisiva, y
`assess_tones` solo cuando el agrupamiento ya está resuelto.

La misma evaluación se lee de dos maneras. Las barras de audibilidad del
principio de esta página responden a «cuánto supera cada tono el umbral de
enmascaramiento»; la vista de niveles responde a «qué vio el analizador», que
es la vista que un informe de evaluación tiene que defender:

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

```python

from phonometry import psychoacoustics

# El espectro de motor de combustión del Anexo E del fragmento anterior.
fT = [118.4, 137.3, 158.8, 314.9, 433.4, 592.2, 629.8, 643.3, 1582.7]
LT = [64.56, 67.96, 68.63, 68.50, 73.17, 78.31, 75.00, 79.75, 71.07]
LS = [48.91, 49.22, 50.50, 52.85, 58.29, 59.53, 59.71, 61.98, 54.16]
res = psychoacoustics.assess_tones(fT, LT, LS, 2.7)

# En una línea: la vista de niveles, la misma que incrusta la ficha .report().
res.plot(view="levels", language="es")
plt.show()

# La vista por defecto es la audibilidad por tono:
res.plot(language="es")      # o res.plot(view="audibility")
plt.show()
```

</details>

Leída de izquierda a derecha: cada segmento horizontal es el nivel de ruido
enmascarante de banda crítica $L_\mathrm{G}$ dibujado sobre la banda a la que se aplica,
cada marcador es el nivel del tono $L_\mathrm{T}$, y el hueco entre ambos, menos el
índice de enmascaramiento, es la audibilidad. Un tono cuyo marcador queda *por
debajo* de su segmento está enmascarado, y ningún nivel justifica una
penalización por él.

### 3.1 Incertidumbre expandida de la audibilidad

El apartado 5.4 asocia a cada audibilidad una incertidumbre expandida $U$
(bilateral al 90 %), y el apartado 6 la hace obligatoria cuando se han
promediado menos de 12 espectros. `assess_tones` la calcula por tono
(`res.extended_uncertainties`), `audibility_uncertainty` la evalúa
directamente desde las líneas del espectro y `mean_audibility_uncertainty`
la propaga a la audibilidad media energética de un conjunto de espectros
(Anexo E: $U = 2{,}80\ \text{dB}$ para el tono de 137,3 Hz frente al 2,79
impreso).

**Cómo leer $U$.** Un intervalo *bilateral* al 90 % deja un 5 % en cada cola,
así que $\Delta L - U$ es un enunciado unilateral al 95 %: cuando todo el
intervalo $\Delta L \pm U$ queda por encima de 0 dB, el tono es audible con al
menos un 95 % de confianza, y cuando el intervalo cruza el cero el veredicto
no está asegurado estadísticamente; el remedio son más espectros, porque $U$
se reduce con el número promediado (que es exactamente la razón de que el
apartado 6 obligue a declararla por debajo de 12 espectros). La misma lógica
protege la penalización aguas abajo: el **Anexo J de la ISO 1996-2:2017**
convierte la audibilidad media en el ajuste tonal $K_\mathrm{t}$ en pasos de 1 dB
(Tabla J.1: $K_\mathrm{t} = 0$ para $\Delta L \le 0$, hasta $K_\mathrm{t} = 6\ \text{dB}$ para
$\Delta L > 12\ \text{dB}$, o la escalera más gruesa de 0/3/6 dB de su nota),
de modo que una incertidumbre que cruza una frontera de la tabla se propaga
directamente como una interrogación de 1–3 dB sobre el nivel de evaluación.
Declarar $\Delta L \pm U$ junto a $K_\mathrm{t}$ muestra si el ajuste es robusto o
pende de un espectro al límite.

La campaña del Anexo E es exactamente ese caso. Sus cinco espectros de 3 s
(Tabla E.4) llevan audibilidades decisivas de 9,18, 6,04, 7,46, 2,67 y 7,17 dB
con incertidumbres individuales de 3,21, 2,95, 2,44, 2,52 y 2,14 dB; la media
energética es 6,98 dB y `mean_audibility_uncertainty` las propaga a
$U = 1{,}38$ dB.

*Cinco espectros, una penalización. La audibilidad media se gana un
$K_\mathrm{t} = 4$ dB, pero su banda de incertidumbre baja por debajo de la frontera de
6 dB de la Tabla J.1 de ISO 1996-2, así que $K_\mathrm{t} = 3$ dB no queda excluido, y
el remedio son más espectros, no un número más redondo.*

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

```python
# `psychoacoustics` lo importan los fragmentos de arriba.
# Tabla E.4 del Anexo E de ISO/PAS 20065: una audibilidad decisiva y una
# incertidumbre expandida por cada espectro medido de 3 s.
decisive = [9.18, 6.04, 7.46, 2.67, 7.17]
uncertainty = [3.21, 2.95, 2.44, 2.52, 2.14]

mean = psychoacoustics.mean_audibility(decisive)
u = psychoacoustics.mean_audibility_uncertainty(decisive, uncertainty)
print(round(mean, 2), round(u, 2))     # 6.98 1.38 — Kt = 4 dB, Kt(ΔL − U) = 3 dB
```

</details>

## 4. Desde el espectro de banda estrecha

Dadas las líneas FFT de la banda crítica en torno a un tono,
`mean_narrowband_level` ejecuta el procedimiento iterativo de la Fórmula 6
(media energética, descartando toda línea que supere en más de 6 dB el $L_\mathrm{S}$ en
curso, hasta estabilizarse en ±0,005 dB o quedar menos de cinco líneas por lado,
Anexo D) y `tone_level` suma las líneas tonales contiguas al pico (por encima
de $L_\mathrm{S} + 6\ \text{dB}$ y de $L_\text{pico} - 10\ \text{dB}$). La media lleva
siempre la corrección de ancho de banda de Hanning de −1,76 dB; el nivel del
tono solo cuando el tramo abarca más de una línea (Fórmulas (7)/(8)).

```python
from phonometry import psychoacoustics

# Anexo E Tabla E.1: las 38 líneas de la banda crítica de 137,3 Hz (Δf = 2,7 Hz).
freqs = [96.9, 99.6, 102.3, 105.0, 107.7, 110.4, 113.0, 115.7, 118.4, 121.1,
         123.8, 126.5, 129.2, 131.9, 134.6, 137.3, 140.0, 142.7, 145.3, 148.0,
         150.7, 153.4, 156.1, 158.8, 161.5, 164.2, 166.9, 169.6, 172.3, 175.0,
         177.6, 180.3, 183.0, 185.7, 188.4, 191.1, 193.8, 196.5]
levels = [49.40, 50.68, 50.09, 53.37, 44.47, 50.91, 51.41, 59.40, 64.54, 57.57,
          51.02, 50.76, 59.93, 62.94, 58.49, 65.87, 62.66, 50.25, 51.32, 52.30,
          52.58, 53.15, 67.04, 67.27, 57.40, 57.17, 52.56, 51.39, 52.49, 47.68,
          51.26, 49.03, 61.42, 59.52, 48.43, 50.84, 48.20, 55.95]

ls = psychoacoustics.mean_narrowband_level(levels, freqs, 137.3)
lt = psychoacoustics.tone_level(levels, freqs, 137.3, ls)
print(round(ls, 2), round(lt, 2))                         # 49.22 67.96
print(round(psychoacoustics.tone_audibility(lt, ls, 137.3, 2.7), 2))   # 5.01 dB
```

## 5. Detección sobre el espectro completo

`analyze_spectrum` ejecuta todo el front-end sobre un espectro (nivel medio de
banda estrecha por línea, detección de picos (apartado 5.3.8 Paso 1, un tono no
puede estar en un flanco), nivel del tono, el criterio de distinción (apartado
5.3.4: ancho de banda $\le 26\,(1 + 0{,}001 f_\mathrm{T})$ Hz y pendiente de flanco
$\ge 24\ \text{dB}$), y la audibilidad) y devuelve los tonos distintos y
audibles. Después aplica
el **Paso 3**: los tonos audibles que comparten una banda crítica suman
energéticamente sus niveles de tono (Fórmula 17, líneas compartidas contadas
una sola vez, vía `combined_tone_level`) en una entrada combinada «FG»
valorada por su miembro más audible, salvo que la excepción de exactamente
dos tonos por debajo de 1000 Hz de §5.1 los mantenga separados. El
`group_sizes` del resultado distingue tonos individuales (`1`) de entradas FG
($N \ge 2$), y la audibilidad decisiva (Paso 4) es el máximo sobre todas las
entradas.

```python
from phonometry import psychoacoustics

# Anexo E Tabla E.1: las 38 líneas de la banda crítica de 137,3 Hz (Δf = 2,7 Hz).
freqs = [96.9, 99.6, 102.3, 105.0, 107.7, 110.4, 113.0, 115.7, 118.4, 121.1,
         123.8, 126.5, 129.2, 131.9, 134.6, 137.3, 140.0, 142.7, 145.3, 148.0,
         150.7, 153.4, 156.1, 158.8, 161.5, 164.2, 166.9, 169.6, 172.3, 175.0,
         177.6, 180.3, 183.0, 185.7, 188.4, 191.1, 193.8, 196.5]
levels = [49.40, 50.68, 50.09, 53.37, 44.47, 50.91, 51.41, 59.40, 64.54, 57.57,
          51.02, 50.76, 59.93, 62.94, 58.49, 65.87, 62.66, 50.25, 51.32, 52.30,
          52.58, 53.15, 67.04, 67.27, 57.40, 57.17, 52.56, 51.39, 52.49, 47.68,
          51.26, 49.03, 61.42, 59.52, 48.43, 50.84, 48.20, 55.95]

# El mismo espectro de la Tabla E.1 de arriba.
res = psychoacoustics.analyze_spectrum(levels, freqs, 2.7)
singles = res.group_sizes == 1
print([round(f, 1) for f in res.tone_frequencies[singles]])  # [118.4, 137.3, 158.8]

# El Paso 3 ya combinó los tres tonos de la misma banda en una entrada FG:
fg = res.group_sizes > 1
print(int(res.group_sizes[fg][0]), round(float(res.tone_levels[fg][0]), 2))  # 3 72.15

# La misma combinación de la Fórmula 17, llamada directamente (LS de la Tabla E.2):
lt_fg = psychoacoustics.combined_tone_level(levels, freqs, [118.4, 137.3, 158.8],
                               [48.91, 49.22, 50.50])
print(round(lt_fg, 2))                                # 72.15

res.plot()   # las entradas detectadas, grupos FG incluidos, como barras de audibilidad
```

Reproducir una audibilidad *decisiva* exacta requiere el espectro de banda
estrecha **completo**: la Tabla E.1 está truncada a la banda crítica de 137,3 Hz,
así que el nivel medio de banda estrecha del tono de 158,8 Hz se subestima a
partir de ella (el algoritmo en sí coincide con el programa de referencia de la
norma madre DIN 45681:2005-03). La detección de picos y la combinación FG se
verifican contra el ejemplo resuelto del Anexo E (las tres frecuencias de tono y
$L_\mathrm{T} = 72{,}15\ \text{dB}$).

### 5.1 Dos tonos por debajo de 1000 Hz

Cuando **exactamente dos** tonos comparten una banda crítica y ambos están por
debajo de 1000 Hz, el oído todavía puede distinguirlos (y entonces se evalúan
*por separado* en lugar de combinarse en FG) si su diferencia de frecuencia
$|f_{\mathrm{T}1} - f_{\mathrm{T}2}|$ (Fórmula 18) supera

$$
f_\mathrm{D} = 21 \cdot 10^{\,1{,}2\,\left|\log_{10}(f_\mathrm{T}/212)\right|^{1{,}8}}\ \text{Hz}
\qquad (\text{Fórmula 19},\ 88\ \text{Hz} < f_\mathrm{T} < 1000\ \text{Hz})
$$

evaluada en el tono más prominente $f_\mathrm{T}$ (el de mayor audibilidad
$\Delta L$). El umbral alcanza su mínimo de 21 Hz en
$f_\mathrm{T} = 212\ \text{Hz}$ y crece a ambos lados.
`two_tone_separation_frequency` da $f_\mathrm{D}$; `resolve_tones_separately` aplica la
decisión.

*Dónde deja el oído de resolver dos tonos dentro de una banda crítica. El
umbral es más estrecho en torno a 212 Hz y se ensancha con fuerza por encima de
500 Hz: a 1 kHz dos tonos tienen que estar separados 82 Hz para evaluarse por
separado, que es casi toda la banda crítica. La pareja del Anexo E queda justo
por debajo de la curva y por eso se combina.*

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

```python

# `psychoacoustics` lo importan los fragmentos de arriba.
ft_grid = np.logspace(np.log10(88.0), np.log10(1000.0), 400)
fd = [psychoacoustics.two_tone_separation_frequency(f) for f in ft_grid]

plt.semilogx(ft_grid, fd, label="Umbral fD (Fórmula 19)")
plt.plot([212.0], [21.0], "o")          # el mínimo de 21 Hz
plt.plot([137.3], [18.9], "s")          # la pareja del Anexo E, 118,4 y 137,3 Hz
plt.xlabel("Frecuencia del tono más audible fT [Hz]")
plt.ylabel("Separación de frecuencias |fT1 - fT2| [Hz]")
plt.legend()
plt.show()
```

</details>

```python
from phonometry import psychoacoustics

psychoacoustics.two_tone_separation_frequency(212.0)             # 21,0 Hz (mínimo)
psychoacoustics.resolve_tones_separately(200.0, 260.0, 3.0, 2.0) # True  → evaluar por separado
psychoacoustics.resolve_tones_separately(118.4, 137.3, 4.0, 5.0) # False → combinar (Δf < fD)
```

:::note
Ningún ejemplo resuelto de ISO/PAS 20065 ejercita esta rama; la banda del Anexo
E agrupa *tres* tonos, así que la regla de «exactamente dos tonos» nunca se
dispara ahí. La fórmula y la decisión se implementan en sala limpia a partir del
texto y se verifican contra el programa de referencia del Anexo J de
**DIN 45681:2005-03** (`fD = 21 * 10 ^ (1.2 * Abs(Log(fT / 212) / Log(10)) ^
1.8)`). Como comprobación adicional, evaluado en los tonos del Anexo E el umbral
($\approx 24\ \text{Hz}$ en 137,3 Hz) los mantiene combinados, coherente con la
agrupación FG de ese ejemplo.
:::

## 6. Informe de evaluación tonal (`.report()`)

La ficha usa los símbolos de informe de ISO 1996-2: la audibilidad decisiva se
escribe $\Delta L_\mathrm{ta}$ y el ajuste tonal $K$, que son el $\Delta L$ y el $K_\mathrm{t}$
de las secciones de arriba.

`ToneAudibilityResult.report(path)` genera una ficha PDF de una página con el
formato de un informe de evaluación tonal de un laboratorio de ruido ambiental,
siguiendo el método de ingeniería del **Anexo J de la ISO 1996-2:2017**: la
línea de base normativa, un bloque de metadatos opcional (fuente/situación,
cliente, posición de medición, instrumentación y fecha, con la resolución del
análisis $\Delta f$ tomada del resultado), una tabla a todo ancho con las
magnitudes clave de cada tono detectado (frecuencia $f_\mathrm{T}$, tipo de entrada,
nivel del tono $L_{p\mathrm{t}}$, nivel del ruido enmascarante en la banda crítica
$L_{p\mathrm{n}}$, ancho de banda crítica $\Delta f_\mathrm{c}$ y la audibilidad
$\Delta L_\mathrm{ta}$) sobre el gráfico de nivel frente a frecuencia con los tonos y
su ruido enmascarante marcados, la audibilidad decisiva $\Delta L_\mathrm{ta}$
enmarcada junto con el ajuste tonal derivado $K$ (Tabla J.1), una fila de
veredicto CUMPLE/NO CUMPLE opcional y una nota de prominencia, y un pie con el
descargo fijo.

Usa el mismo contenedor `ReportMetadata` y el mismo motor de renderizado que la
[ficha de sonoridad ISO
532-1](/phonometry/es/perception/psychoacoustics/loudness/#informe-de-iso-532-1-report);
un `requirement` indicado se interpreta como la audibilidad decisiva
$\Delta L_\mathrm{ta}$ máxima admisible en dB (un tono más silencioso 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 separador
decimal de coma), p. ej. `res.report("tone_fiche_es.pdf", language="es")`.

```python
from phonometry import psychoacoustics, ReportMetadata

# El espectro del motor de combustión del §4/§5 (analyze_spectrum).
res = psychoacoustics.analyze_spectrum(levels, freqs, 2.7)
res.report(
    "tone_fiche.pdf",
    metadata=ReportMetadata(
        specimen="Motor de combustión, funcionamiento estable",
        measurement_standard="ISO 1996-2",
        laboratory="Laboratorio de referencia Phonometry",
        requirement=6.0,            # ΔL_ta máxima admisible (dB)
    ),
)                                   # ΔL_ta decisiva (dB) y K (dB, Tabla J.1)
```

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

## Qué cubre esta guía

El método de ingeniería de ISO/PAS 20065:2016 completo: los requisitos de
analizador del apartado 4.2 y la fusión de espectros básicos del apartado 4.3
sobre los que se apoya la entrada, con las condiciones de aceptación del
apartado 5.1 y la lista de contenidos del informe del apartado 7; el ancho de
banda crítico $\Delta f_\mathrm{c}$ y las frecuencias de esquina (Fórmulas 2 a 5), el
nivel medio de banda estrecha $L_\mathrm{S}$ y el nivel del tono $L_\mathrm{T}$ (Fórmulas 6 y 8,
Anexo D), el nivel de banda crítica del enmascaramiento $L_\mathrm{G}$, el índice de
enmascaramiento $a_\mathrm{v}$ y la audibilidad $\Delta L$ (Fórmulas 12 a 14), la
detección de picos y el criterio de distinción (apartados 5.3.8 y 5.3.4), la
combinación multitono FG (Fórmula 17) y la excepción de dos tonos por debajo
de 1000 Hz (Fórmulas 18/19), la audibilidad decisiva y media energética
(Fórmula 20) y la incertidumbre expandida $U$ de los apartados 5.4/6, todo a
través de `psychoacoustics.analyze_spectrum` y `assess_tones`. El Anexo J de
la ISO 1996-2:2017 está cubierto en lo que convierte la audibilidad media en
el ajuste tonal $K_\mathrm{t}$ (Tabla J.1).

El criterio de distinción de pendiente de flanco sigue la lectura de DIN
45681:2005-03 (su programa de referencia ejecutable), no las fórmulas
asimétricas impresas en el texto de ISO/PAS 20065, que la contradicen,
recogido en el [registro de erratas](/phonometry/es/reference/errata/).
Construir el propio espectro FFT de banda estrecha a partir de una grabación
en el dominio temporal no forma parte de este módulo: todas las funciones aquí
parten de un espectro ya calculado (niveles y frecuencias), y el §0 dice cómo
tiene que ser ese espectro, incluida la ponderación A del apartado 5.3.2, que
aplica quien llama porque el módulo es agnóstico a la ponderación.

## Véase también

- [Medición de ruido ambiental](/phonometry/es/environment/assessment/environmental-levels/):
  el nivel de evaluación de ISO 1996-1 al que alimenta esta audibilidad, y la
  vía más sencilla del Anexo C de ISO 1996-2 para un solo espectro.
- [Prominencia tonal: TNR y PR](/phonometry/es/perception/psychoacoustics/tone-prominence/):
  la pregunta de prominencia de ECMA-418-1 que se le hace al ruido de un
  producto, con la tabla que elige entre las cuatro métricas tonales de la
  biblioteca.
- [Ruido de aerogeneradores](/phonometry/es/environment/sources/wind-turbine-noise/):
  la audibilidad por bin de la IEC 61400-11, la misma fórmula aplicada a una
  campaña de velocidad de viento bin a bin.
- [Teoría](/phonometry/es/reference/theory/perception/#prominencia-tonal-tnr-y-pr-ecma-418-1):
  la familia vecina de métricas tonales, el TNR y el PR, deducida del mismo
  modelo de bandas críticas.
- Referencia de la API: [`psychoacoustics.quality.tone_audibility`](/phonometry/es/reference/api/psychoacoustics/tone-audibility/).
