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

El ruido con impulsos prominentes (martilleo, remachado, hinca de pilotes) es
más molesto que un sonido estacionario del mismo nivel equivalente. **NT ACOU
112:2002** (un método Nordtest) cuantifica cuán *prominente* es un impulso y lo
convierte en un ajuste graduado `KI` que se suma al `LAeq` medido. La
prominencia se lee de dos propiedades del arranque de cada impulso en el
historial de nivel ponderado A con ponderación temporal F: la rapidez con que
crece (la **tasa de crecimiento**) y cuánto crece (la **diferencia de nivel**).

## 1. Prominencia prevista (cláusula 7)

Para cada impulso candidato, la **prominencia prevista** `P` combina la tasa de
crecimiento (en dB/s) y la diferencia de nivel (en dB) en escala logarítmica
(Fórmula 1):

$$
P = 3\,\lg(\text{tasa de crecimiento}) + 2\,\lg(\text{diferencia de nivel}).
$$

Los coeficientes se ajustaron a partir de ensayos de escucha y `P` está diseñada
para alcanzar unos 15 en impulsos muy súbitos e intensos. El impulso con la `P`
**más alta** en un periodo de 30 minutos es el determinante. Una subida de
nivel solo *cualifica* como impulso cuando su tasa de subida supera 10 dB/s
(apartado 4.5; el apartado 8 aplica el ajuste únicamente «para sonidos con
tasas de subida mayores de 10 dB/s»): `impulse_prominence` marca los eventos
no cualificados en su máscara `qualifies`, avisa de ellos y nunca les permite
fijar la prominencia determinante ni un `KI` (el ajuste es 0 dB cuando ningún
evento cualifica).

```python
from phonometry import environmental

# Tres impulsos candidatos: (tasa de crecimiento dB/s, diferencia de nivel dB).
result = environmental.impulse_prominence([1200.0, 300.0, 60.0], [32.0, 18.0, 11.0])
print(result.per_impulse.round(2))  # [12.25  9.94  7.42]
print(round(result.prominence, 2))  # 12.25  (el impulso determinante)
print(round(result.adjustment, 2))  # 13.05  dB

result.plot()   # la curva KI(P) de la sección 2 con estos impulsos marcados
```

Un solo impulso se evalúa directamente con `predicted_prominence`:

```python
from phonometry import environmental

# P = 3*lg(1000) + 2*lg(30) = 9 + 2.95 = 11.95.
print(round(environmental.predicted_prominence(1000.0, 30.0), 4))  # 11.9542
```

## 2. Ajuste al LAeq (cláusula 8)

Por debajo de una prominencia de 5 el impulso no es lo bastante audible como para
importar; por encima, el ajuste crece linealmente (Fórmula 2):

$$
K_I = 1{,}8\,(P - 5)\ \text{dB} \quad (P > 5), \qquad K_I = 0 \quad (P \le 5).
$$

```python
from phonometry import environmental

print(float(environmental.impulse_adjustment(10.0)))  # 9.0 dB
print(float(environmental.impulse_adjustment(5.0)))   # 0.0 dB (en el umbral)
```

El ajuste se aplica al `LAeq,30min` del evento con la prominencia más alta. El
**nivel de evaluación** sobre un tiempo de referencia mayor combina los niveles
equivalentes ajustados por impulso de los subintervalos (cláusula 8, Nota 1):

$$
L_{Ar,T} = 10\,\lg\!\left(\frac{1}{T}\sum_N \Delta t_N\,
10^{(L_{Aeq,N} + K_{I,N})/10}\right).
$$

```python
from phonometry import environmental

# Dos periodos de 30 min: uno impulsivo (KI = 7.6 dB), otro tranquilo.
print(round(environmental.rating_level([72.0, 66.0], [7.6, 0.0], [30.0, 30.0], 60.0), 2))
# 76.78 dB
```

El `ImpulseProminenceResult` lleva las prominencias `per_impulse`, la `prominence`
determinante y su `adjustment`, y su `.plot()` dibuja la curva `KI(P)` con los
impulsos marcados. El método es un complemento a la medida de ruido ambiental de
[ISO 1996-2](/phonometry/es/guides/levels/).

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

```python

from phonometry import environmental

# Una línea para la curva de ajuste con los impulsos marcados:
environmental.impulse_prominence([1200.0, 300.0, 60.0], [32.0, 18.0, 11.0]).plot(language="es")
plt.show()

# A mano, el panel izquierdo — P frente a la tasa de crecimiento para tres LD:
orate = np.logspace(1, 4, 200)
for ld in (5.0, 15.0, 30.0):
    plt.plot(orate, environmental.predicted_prominence(orate, np.full_like(orate, ld)),
             label=f"LD = {ld:g} dB")
plt.xscale("log"); plt.legend(); plt.show()
```

</details>

## 3. Medida objetiva a partir de una señal (ISO/PAS 1996-3)

La NT ACOU 112 toma la tasa de crecimiento y la diferencia de nivel como
entradas. La **ISO/PAS 1996-3:2022** conserva las mismas fórmulas de
prominencia y ajuste, pero añade la *cadena de medida objetiva* que lee esas
magnitudes directamente de una grabación calibrada. `impulsive_sound_adjustment`
pondera la señal en A, aplica la ponderación temporal F ($\tau$ = 125 ms),
muestrea el historial de nivel `LpAF` cada 10-25 ms, detecta cada arranque (el
tramo contiguo cuyo gradiente supera 10 dB/s, fusionando eventos separados menos
de 50 ms), mide su diferencia de nivel `LD = Le − Ls` y su tasa de crecimiento
`OR` por mínimos cuadrados, y devuelve el ajuste determinante `KI` con la
categoría de fuente de la cláusula 7: *no impulsiva* (`KI = 0`), *impulsiva
regular* (`0 < KI ≤ 5`) o *altamente impulsiva* (`KI > 5`).

La detección de arranques puede ejecutarse directamente sobre un historial de
nivel con `detect_onsets`, cómodo para sonómetros que ya registran `LpAF`:

```python

from phonometry import environmental

# Historial LpAF muestreado cada 20 ms: silencio, subida de 30 dB en 0,30 s, estable.
dt = 0.02
levels = np.concatenate([
    np.full(10, 40.0),
    40.0 + 30.0 * np.arange(1, 16) / 15,   # arranque recto de 100 dB/s hasta 70 dB
    np.full(15, 70.0),
])
onset = environmental.detect_onsets(levels, dt)[0]
print(round(onset.onset_rate), round(onset.level_difference))  # 100 30
print(round(onset.prominence, 2))                              # 8.95
```

Desde una señal temporal calibrada (en pascales) la cadena completa se ejecuta
de principio a fin:

```python
result = environmental.impulsive_sound_adjustment(signal, fs)
print(result.category)                  # p. ej. 'highly impulsive'
print(round(result.adjustment, 1))      # KI en dB (de 0,0 a unos 9 dB en casos típicos)
print(round(result.adjusted_laeq, 1))   # LAeq + KI

result.plot()   # la historia de LpAF con los inicios detectados (necesita matplotlib)
```

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

```python

from phonometry import environmental

# Tres golpes de martillo sobre un fondo de 55 dB(A), 6 s a 48 kHz.
fs = 48000
rng = np.random.default_rng(7)
t = np.arange(int(6.0 * fs)) / fs
background = rng.standard_normal(t.size)
background *= 2e-5 * 10 ** (55 / 20) / np.sqrt(np.mean(background ** 2))
signal = background.copy()
for onset_time in (1.0, 2.6, 4.2):
    decay = np.exp(-(t - onset_time) / 0.08) * (t >= onset_time)
    strike = decay * rng.standard_normal(t.size)
    window = (t >= onset_time) & (t < onset_time + 0.1)
    strike *= 2e-5 * 10 ** (95 / 20) / np.sqrt(np.mean(strike[window] ** 2))
    signal += strike

res = environmental.impulsive_sound_adjustment(signal, fs)
print(res.category, round(res.prominence, 2), round(res.adjustment, 2))
# highly impulsive 11.34 11.42

# En una línea: la historia de nivel con los inicios, las rectas ajustadas y
# la diferencia de nivel determinante.
res.plot(language="es")
plt.show()
```

</details>

De la figura conviene leer dos cosas. Las rectas de inicio son ajustes por
mínimos cuadrados sobre el crecimiento detectado, así que un ajuste tendido
sobre un flanco visiblemente abrupto indica que la historia de nivel se
registró con demasiada poca resolución. Y la diferencia de nivel se mide desde
el nivel *justo antes* del inicio, no desde el fondo a largo plazo, por lo que
un segundo golpe que llega sobre la cola del anterior puntúa un `LD` menor del
que aparenta merecer.

Como la tasa de crecimiento y la diferencia de nivel son *diferencias* de
nivel, el ajuste es insensible a la calibración absoluta del sonómetro
(cláusula 8); solo el `LAeq` reportado y el `LAeq` ajustado dependen de ella. El
alcance del documento indica que el ajuste suele quedar entre 0,0 dB y 9,0 dB;
la propia fórmula no está acotada, así que un impulso muy súbito e intenso puede
superar ese rango. `ImpulsiveSoundResult.plot()` dibuja el historial `LpAF` con
los arranques detectados, las rectas de arranque por mínimos cuadrados y la
diferencia de nivel determinante marcadas.

## 4. Dónde encaja el método entre las normas

Las normas de evaluación tratan tradicionalmente la impulsividad por
categorías, no por medición. La ISO 1996-1:2016 (Tabla A.1) suma 5 dB fijos
cuando la fuente es *impulsiva regular* y 12 dB cuando es *altamente
impulsiva*, y deja la elección de categoría al juicio del evaluador. La
NT ACOU 112 sustituye ese juicio por una medida: la tasa de crecimiento y la
diferencia de nivel de los impulsos reales producen un $K_I$ graduado que va
de 0 dB para arranques apenas perceptibles a unos 18 dB para los más
repentinos y ruidosos, cruzando por el camino las dos cifras convencionales.
El enfoque resultó duradero: la misma prominencia basada en el arranque pasó
después a la ISO/PAS 1996-3:2022, que la usa para decidir *objetivamente* si
una fuente cuenta como impulsiva regular o altamente impulsiva en la
evaluación de la ISO 1996-1.

Dos advertencias prácticas al aplicarlo. El arranque se lee de la historia de
nivel ponderada A con ponderación temporal F, y la propia constante de tiempo
de 125 ms de la ponderación F limita la velocidad a la que puede subir un
nivel registrado: los impulsos muy cortos llegan ya suavizados, así que la
historia de nivel debe registrarse a la cadencia máxima del sonómetro (no en
intervalos gruesos); de lo contrario, la tasa de crecimiento, y con ella $P$,
se subestima. Y
el método evalúa la *prominencia* de los impulsos, no su energía: $K_I$ se
añade sobre el `LAeq` medido en el nivel de evaluación, nunca lo sustituye.

## 5. Informe de evaluación (`.report()`)

`ImpulseProminenceResult.report(path)` genera una ficha PDF de una página con el
formato de un informe de evaluación de sonidos impulsivos de un laboratorio de
ruido ambiental, siguiendo la **NT ACOU 112:2002** (recogida en la
ISO/PAS 1996-3:2022): 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 el periodo de evaluación de 30 minutos siempre visible), una tabla a
todo ancho por impulso (tasa de inicio, diferencia de nivel, prominencia
prevista `P` y si el inicio se califica como impulso) sobre el gráfico de la
curva de ajuste `K`<sub>I</sub>`(P)` con los impulsos candidatos marcados, la
prominencia rectora `P` enmarcada junto con el ajuste de `L`<sub>Aeq</sub>
derivado `K`<sub>I</sub> (Fórmula 2), una fila de veredicto APTO/NO APTO opcional
y una nota de categoría 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/guides/loudness/#informe-de-iso-532-1-report);
un `requirement` indicado se interpreta como la prominencia rectora `P` máxima
admisible (un impulso menos destacado es apto). El renderizado necesita reportlab
(`pip install phonometry[report]`); solo se admite `engine="reportlab"`. La ficha
se genera en inglés por defecto; pase `language="es"` para una ficha en español
(cadenas fijas traducidas y separador decimal de coma), p. ej.
`res.report("impulse_fiche_es.pdf", language="es")`.

```python
from phonometry import environmental, ReportMetadata

# El conjunto de tres impulsos de hincado del §1 (tasa de inicio dB/s, LD dB).
res = environmental.impulse_prominence([1200.0, 300.0, 60.0], [32.0, 18.0, 11.0])
res.report(
    "impulse_fiche.pdf",
    metadata=ReportMetadata(
        specimen="Obra de hincado de pilotes, martilleo intermitente",
        measurement_standard="ISO 1996-2",
        laboratory="Laboratorio de referencia Phonometry",
        requirement=10.0,           # prominencia rectora P máxima admisible
    ),
    language="es",                  # ficha en español (separador decimal de coma)
)                                   # P rectora y el ajuste de LAeq KI (dB)
```

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

## Qué cubre esta guía

**Cubierto.** NT ACOU 112:2002: la definición de arranque (apartados 4.5 a
4.7), la prominencia prevista `P` (apartado 7, Fórmula 1), el ajuste
graduado `KI` (apartado 8, Fórmula 2) y el nivel de evaluación sobre un
tiempo de referencia (apartado 8, Nota 1), a través de `impulse_prominence`,
`predicted_prominence`, `impulse_adjustment` y `rating_level`. La ISO/PAS
1996-3:2022 está cubierta en la cadena de medida objetiva construida sobre
la misma fórmula de prominencia: el muestreo de `LpAF`, la detección y
fusión de arranques, y la tasa de crecimiento y diferencia de nivel por
mínimos cuadrados, a través de `impulsive_sound_adjustment` y
`detect_onsets`.

**No cubierto.** La Nota 4 (apartado 7) de la NT ACOU 112 recoge una
directriz nórdica anterior: un ajuste plano de 5 dB basado en el juicio
subjetivo, recomendado cuando `KI > 3` para ruido característico de
operaciones de trabajo, ofrecido como alternativa cuando el método graduado
no se puede aplicar. Solo está implementado el `KI` graduado de la
Fórmula 2; la alternativa plana de 5 dB no lo está. Los ajustes por
categoría de la Tabla A.1 de la ISO 1996-1 (5 dB regular, 12 dB altamente
impulsiva) están cubiertos solo como la base de juicio del evaluador que
sustituye esta medición, no como una función propia.

## Véase también

- Referencia de la API: [`environmental.impulse_prominence`](/phonometry/es/reference/api/environment/impulse-prominence/).
- Referencia de la API: [`environmental.impulsive_sound`](/phonometry/es/reference/api/environment/impulsive-sound/).
