<!-- canonical: https://jmrplens.github.io/phonometry/es/environment/assessment/impulsive-sound/ -->
Source: https://jmrplens.github.io/phonometry/es/environment/assessment/impulsive-sound/

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 $K_\mathrm{I}$ que se suma al $L_\mathrm{Aeq}$ 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 (apartado 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\,\log_{10}(\text{tasa de crecimiento}) + 2\,\log_{10}(\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 crecimiento supera 10 dB/s
(apartado 4.5; el apartado 8 aplica el ajuste únicamente «para sonidos con
tasas de crecimiento 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 $K_\mathrm{I}$ (el ajuste es 0 dB cuando ningún
evento cualifica).

```python
from phonometry import environment

# Tres impulsos candidatos: (tasa de crecimiento dB/s, diferencia de nivel dB).
result = environment.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 environment

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

## 2. Ajuste al LAeq (apartado 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_\mathrm{I} = 1{,}8\,(P - 5)\ \text{dB} \quad (P > 5), \qquad K_\mathrm{I} = 0 \quad (P \le 5).
$$

```python
from phonometry import environment

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

El ajuste se aplica al $L_{\mathrm{Aeq},30\text{min}}$ 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 (apartado 8, Nota 1):

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

```python
from phonometry import environment

# Dos periodos de 30 min: uno impulsivo (KI = 7.6 dB), otro tranquilo.
print(round(environment.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 $K_\mathrm{I}(P)$ con los
impulsos marcados. El método es un complemento a la medida de ruido ambiental de
[ISO 1996-2](/phonometry/es/environment/assessment/environmental-levels/).

*Las dos entradas importan, pero no por igual: a tasa de crecimiento fija, pasar
de una diferencia de nivel de 5 dB a una de 30 dB mueve la prominencia mucho
menos de lo que la mueve un orden de magnitud de tasa de crecimiento. Por debajo
de P = 5 el ajuste es idénticamente cero, así que un impulso que no se cualifica
no cuesta nada en absoluto, y por eso el ensayo de cualificación es la parte del
método que hay que acertar.*

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

```python

from phonometry import environment

# Una línea para la curva de ajuste con los impulsos marcados:
environment.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, environment.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\ \text{ms}$),
muestrea el historial de nivel $L_{p\mathrm{AF}}$ 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 $L_\mathrm{D} = L_\mathrm{e} - L_\mathrm{s}$ y su tasa de crecimiento
$\mathrm{OR}$ por mínimos cuadrados, y devuelve el ajuste determinante $K_\mathrm{I}$ con la
categoría de fuente del apartado 7: *no impulsiva* ($K_\mathrm{I} = 0$), *impulsiva
regular* ($0 < K_\mathrm{I} \le 5$) o *altamente impulsiva* ($K_\mathrm{I} > 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 $L_{p\mathrm{AF}}$:

```python

from phonometry import environment

# Historial LpAF muestreado cada 20 ms: silencio, subida de 30 dB a 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 = environment.detect_onsets(levels, dt)[0]
print(round(onset.onset_rate), round(onset.level_difference))  # 100 30
print(round(onset.prominence, 2))                              # 8.95
```

**Qué tiene que ser la grabación.** La cadena lee un historial de nivel, así que
las condiciones que hacen válido uno son las condiciones de todo el método: una
cadena de medida de clase 1 calibrada antes y después de la sesión, y una señal
en pascales, porque aunque el ajuste en sí es insensible a la calibración (se
construye con *diferencias* de nivel), el $L_\mathrm{Aeq}$ declarado y el ajustado no lo
son. El historial de nivel tiene que muestrearse lo bastante rápido como para
resolver la subida (el método trabaja sobre una rejilla de 10 ms a 25 ms, que es
el argumento `dt` de abajo) y el impulso determinante es el de mayor $P$ dentro
de un periodo de evaluación de **30 minutos**. Tres cosas invalidan un periodo en
vez de bajarle la puntuación: que no se cualifique ningún arranque con el
gradiente de 10 dB/s (el ajuste es entonces 0 dB y el periodo no dice nada de la
fuente), que los eventos se solapen de modo que un impulso arranque sobre la cola
de decaimiento del anterior, y un historial de nivel que se saturara o recortara
en cualquiera de los dos extremos del rango.

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

```python
result = environment.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()   # el historial de LpAF con los arranques detectados (necesita matplotlib)
```

Tres argumentos con nombre de esa llamada deciden si el número es defendible, y
ninguno es opcional en la práctica:

| Argumento | Por defecto | Qué hace |
| :--- | :--- | :--- |
| `dt` | `0.02` s | El intervalo de registro del historial de nivel. El método necesita de 10 ms a 25 ms; una rejilla más gruesa aplana la tasa de crecimiento ajustada y subestima $P$, que es la advertencia de dos párrafos más abajo hecha configurable |
| `calibration_offset` | `0.0` dB | Se suma al historial de nivel para tender un puente entre una escala digital y una calibrada: la diferencia entre el nivel conocido del calibrador y el nivel que este mismo procesado declara para la grabación de calibración. Mueve el $L_\mathrm{Aeq}$ y el $L_\mathrm{Aeq}$ ajustado, y deja $K_\mathrm{I}$ en paz |
| `laeq` | `None` | Pasa el $L_\mathrm{Aeq}$ medido sobre el periodo de evaluación en vez de dejar que se calcule a partir del extracto, que es lo que hace un informe real |
| `reference_pressure` | `2e-05` Pa | Solo se cambia para un medio distinto del aire |
| `onset_rate_method` | `'least_squares'` | El ajuste sobre la subida detectada |

`environment.sound_pressure_level_history(signal, fs, *, dt=..., calibration_offset=...)`
es ese mismo paso del apartado 4 por separado (ponderación A, ponderación
temporal F y remuestreo a la rejilla de 10-25 ms) para quien quiera el historial
sin el ajuste. Arranca en caliente el integrador de F con el valor cuadrático
medio de la primera ventana, para que el comienzo de un registro no se detecte
como un arranque del propio procesado.

*Los tres golpes están deliberadamente bien separados, 1,6 s entre ellos frente a
un decaimiento de 0,08 s, para que cada arranque parta del mismo fondo y cada
ajuste tenga toda la subida para sí. Ese es el caso fácil: los dos errores de
campo que se describen más abajo se manifiestan los dos como una recta ajustada
más tendida sobre un flanco visiblemente empinado.*

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

```python

from phonometry import environment

# 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 = environment.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: el historial de nivel con los arranques, 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 arranque son ajustes por
mínimos cuadrados sobre el crecimiento detectado, así que un ajuste tendido
sobre un flanco visiblemente abrupto indica que el historial de nivel se
registró con demasiada poca resolución. Y la diferencia de nivel se mide desde
el nivel *justo antes* del arranque, no desde el fondo a largo plazo, por lo que
un segundo golpe que llega sobre la cola del anterior puntúa un $L_\mathrm{D}$ 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
(apartado 8); solo el $L_\mathrm{Aeq}$ declarado y el $L_\mathrm{Aeq}$ 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 $L_{p\mathrm{AF}}$ 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_\mathrm{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 del historial de
nivel ponderado 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
historial 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_\mathrm{I}$ se
añade sobre el $L_\mathrm{Aeq}$ medido en el nivel de evaluación, nunca lo sustituye.

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

Un informe de evaluación tiene que llevar más de lo que la ficha calcula. Hay que
declarar la norma aplicada y su edición; la fuente y la situación; la posición de
medida y el periodo de evaluación; el impulso determinante con su tasa de
crecimiento y su diferencia de nivel; la prominencia $P$ y el ajuste $K_\mathrm{I}$; la
categoría de fuente en la que el resultado sitúa a la fuente; y el $L_\mathrm{Aeq}$
sobre el que cabalga el ajuste, con la instrumentación y la calibración que hay
detrás. La ficha de abajo rellena sola la mitad calculada (la tabla por impulso,
la $P$ determinante, $K_\mathrm{I}$ y la categoría) y toma el resto de `ReportMetadata`,
y por eso el bloque de metadatos no es decoración: sin él la hoja documenta un
resultado aritmético y no una medición.

`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 crecimiento, diferencia de nivel, prominencia
prevista $P$ y si el arranque se cualifica como impulso) sobre el gráfico de la
curva de ajuste $K_\mathrm{I}(P)$ con los impulsos candidatos marcados, la
prominencia rectora $P$ enmarcada junto con el ajuste de $L_\mathrm{Aeq}$
derivado $K_\mathrm{I}$ (Fórmula 2), una fila de veredicto CUMPLE/NO CUMPLE 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/perception/psychoacoustics/loudness/#informe-de-iso-532-1-report);
un `requirement` indicado se interpreta como la prominencia rectora $P$ máxima
admisible (un impulso menos destacado 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("impulse_fiche_es.pdf", language="es")`.

```python
from phonometry import environment, ReportMetadata

# El conjunto de tres impulsos de hinca del §1 (tasa de crecimiento dB/s, LD dB).
res = environment.impulse_prominence([1200.0, 300.0, 60.0], [32.0, 18.0, 11.0])
res.report(
    "impulse_fiche.pdf",
    metadata=ReportMetadata(
        specimen="Obra de hinca 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; pulsa la vista previa para abrir el PDF.

## Qué cubre esta guía

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 $K_\mathrm{I}$
(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 $L_{p\mathrm{AF}}$, 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`.

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 $K_\mathrm{I} > 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 $K_\mathrm{I}$ 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: [`environment.assessment.impulsive_sound`](/phonometry/es/reference/api/environment/impulsive-sound/).
- Teoría: [Prominencia de sonidos impulsivos (NT ACOU 112)](/phonometry/es/reference/theory/environment-transport/#prominencia-de-sonidos-impulsivos-nt-acou-112): la derivación de la prominencia de NT ACOU 112 y el criterio de arranque en que se apoya.
