Ir al contenido

Prominencia de sonidos impulsivos (NT ACOU 112)

Normas aplicables: NT ACOU 112ISO 1996ISO/PAS 1996

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 que se suma al 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).

Flujo desde el historial de nivel ponderado A (un arranque es donde el gradiente supera 10 dB/s) hasta la tasa de crecimiento y la diferencia de nivel, la prominencia prevista P = 3 lg(OR) + 2 lg(LD), el ajuste KI = 1,8 (P - 5) para P mayor que 5, y el nivel de evaluación sobre el tiempo de referenciaFlujo desde el historial de nivel ponderado A (un arranque es donde el gradiente supera 10 dB/s) hasta la tasa de crecimiento y la diferencia de nivel, la prominencia prevista P = 3 lg(OR) + 2 lg(LD), el ajuste KI = 1,8 (P - 5) para P mayor que 5, y el nivel de evaluación sobre el tiempo de referencia

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

Los coeficientes se ajustaron a partir de ensayos de escucha y está diseñada para alcanzar unos 15 en impulsos muy súbitos e intensos. El impulso con la 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 (el ajuste es 0 dB cuando ningún evento cualifica).

Una lupa recorre el historial de nivel ponderado A con ponderación temporal F L_AF; donde el nivel sube más deprisa de 10 dB/s se resalta el tramo de arranque, y las casillas de tasa de crecimiento (200 dB/s), diferencia de nivel (30 dB), prominencia P y ajuste KI se van iluminando por turnos.

Descargar la animación (WebM)

Una lupa recorre el historial de nivel ponderado A con ponderación temporal F L_AF; donde el nivel sube más deprisa de 10 dB/s se resalta el tramo de arranque, y las casillas de tasa de crecimiento (200 dB/s), diferencia de nivel (30 dB), prominencia P y ajuste KI se van iluminando por turnos.

Descargar la animación (WebM)

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:

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

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):

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 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):

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 con los impulsos marcados. El método es un complemento a la medida de ruido ambiental de ISO 1996-2.

Izquierda: la prominencia prevista P creciendo con la tasa de crecimiento (eje logarítmico) para diferencias de nivel de 5, 15 y 30 dB, llegando a unos 15 en un impulso súbito e intenso. Derecha: el ajuste KI, plano en cero hasta el umbral P = 5 y luego lineal, con tres impulsos marcados y el determinante en KI = 13 dBIzquierda: la prominencia prevista P creciendo con la tasa de crecimiento (eje logarítmico) para diferencias de nivel de 5, 15 y 30 dB, llegando a unos 15 en un impulso súbito e intenso. Derecha: el ajuste KI, plano en cero hasta el umbral P = 5 y luego lineal, con tres impulsos marcados y el determinante en KI = 13 dB

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.

Mostrar el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
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()

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

Sección titulada «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 (), muestrea el historial de nivel 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 y su tasa de crecimiento por mínimos cuadrados, y devuelve el ajuste determinante con la categoría de fuente del apartado 7: no impulsiva (), impulsiva regular () o altamente impulsiva ().

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

import numpy as np
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 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 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:

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:

ArgumentoPor defectoQué hace
dt0.02 sEl 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 , que es la advertencia de dos párrafos más abajo hecha configurable
calibration_offset0.0 dBSe 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 y el ajustado, y deja en paz
laeqNonePasa el 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_pressure2e-05 PaSolo 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.

Historial de nivel con ponderación A y constante F de tres golpes de martillo sobre un fondo de 55 dB(A) a lo largo de seis segundos: cada golpe sube de unos 52 dB a 89 dB, se marcan los puntos de inicio y fin del crecimiento detectado con la recta de mínimos cuadrados, se anota la diferencia de nivel determinante de 36,8 dB y el título indica una prominencia de 11,34 con un ajuste de 11,42 dB, categoría altamente impulsivaHistorial de nivel con ponderación A y constante F de tres golpes de martillo sobre un fondo de 55 dB(A) a lo largo de seis segundos: cada golpe sube de unos 52 dB a 89 dB, se marcan los puntos de inicio y fin del crecimiento detectado con la recta de mínimos cuadrados, se anota la diferencia de nivel determinante de 36,8 dB y el título indica una prominencia de 11,34 con un ajuste de 11,42 dB, categoría altamente impulsiva

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.

Mostrar el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
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()

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 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 declarado y el 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 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

Sección titulada «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 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 , se subestima. Y el método evalúa la prominencia de los impulsos, no su energía: se añade sobre el medido en el nivel de evaluación, nunca lo sustituye.

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 y el ajuste ; la categoría de fuente en la que el resultado sitúa a la fuente; y el 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 determinante, 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 y si el arranque se cualifica como impulso) sobre el gráfico de la curva de ajuste con los impulsos candidatos marcados, la prominencia rectora enmarcada junto con el ajuste de derivado (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; un requirement indicado se interpreta como la prominencia rectora 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").

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.

Informe de ejemplo de prominencia de sonidos impulsivos NT ACOU 112 (PDF)

Ficha de evaluación de sonidos impulsivos de una página: un encabezado de metadatos, una tabla por impulso con la tasa de crecimiento, la diferencia de nivel y la prominencia prevista P, el gráfico de la curva de ajuste KI(P) con los impulsos candidatos marcados, la prominencia rectora P = 12,25 enmarcada con el ajuste de LAeq KI = 13,0 dB (NT ACOU 112:2002 Fórmula 2) y un veredicto NO CUMPLE frente a una prominencia rectora máxima de 10.

Descargar el informe (PDF)

Ficha de prominencia de sonidos impulsivos (ImpulseProminenceResult.report), prominencia rectora P con el ajuste de LAeq KI.
  • Cubierto

    NT ACOU 112:2002: la definición de arranque (apartados 4.5 a 4.7), la prominencia prevista (apartado 7, Fórmula 1), el ajuste graduado (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 , 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 para ruido característico de operaciones de trabajo, ofrecido como alternativa cuando el método graduado no se puede aplicar. Solo está implementado el 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.