Ir al contenido

Ponderación temporal

Normas aplicables: IEC 61672ANSI S1.4Referencias: Bies et al. 2017

Un nivel sonoro mostrado en pantalla es siempre un nivel con ponderación temporal: antes de llegar a la lectura, la presión cuadrática ponderada en frecuencia pasa por un detector exponencial cuya constante de tiempo fija la rapidez con la que el nivel sigue a la señal. Esta página es ese detector, implementado como un filtro recursivo exacto por muestra: las características Fast y Slow de IEC 61672-1:2013 (apartado 5.8), la balística asimétrica heredada Impulse, estado en streaming para el procesado por bloques y la verificación con ráfagas tonales contra la Tabla 4 de la norma.

Los nombres son más antiguos que las matemáticas. FAST y SLOW eran descripciones literales del movimiento de una aguja, normalizadas para los sonómetros analógicos en ANSI S1.4-1983 e IEC 60651 y trasladadas a IEC 61672-1 como las constantes exponenciales F y S; IMPULSE se añadió en esa misma época para el ruido de impactos y desde entonces ha desaparecido de los requisitos, sobreviviendo en los instrumentos solo por procedimientos heredados (la guía de elección de más abajo dice cuándo es defendible cada una; Bies, Hansen y Howard 2017, §3.6 cubre la práctica instrumental).

Dos páginas hermanas completan la cadena. La salida del detector es la traza de nivel sobre la que se definen los niveles percentiles de Niveles integrados y estadísticos, mientras que las métricas integradas (, SEL) se saltan el detector por completo; y la cadena completa de instrumento IEC 61672-1 que envuelve este detector (ponderación, rangos, verificaciones periódicas) es el asunto de Construye un sonómetro.

La aguja de un sonómetro no puede seguir la forma de onda de presión: muestra un valor cuadrático medio móvil con memoria exponencial. Formalmente (IEC 61672-1, 3.8):

un paso bajo de primer orden sobre la señal al cuadrado. La constante de tiempo fija el compromiso: Fast (125 ms) sigue fluctuaciones del tipo del habla y Slow (1 s) estabiliza la lectura para ruido cuasi estacionario. Tras un escalón, la envolvente alcanza el 63 % de su valor final en un y ~99,97 % tras ; por eso los análisis de nivel descartan los primeros instantes de una grabación.

La cadena del detector exponencial: la presión de banda se eleva al cuadrado, se suaviza con un paso bajo RC de un polo con constante de tiempo tau y se convierte a decibelios, con las constantes de tiempo Fast, Slow e Impulse indicadasLa cadena del detector exponencial: la presión de banda se eleva al cuadrado, se suaviza con un paso bajo RC de un polo con constante de tiempo tau y se convierte a decibelios, con las constantes de tiempo Fast, Slow e Impulse indicadas
  • Fast (fast): . Estándar para fluctuaciones de ruido.
  • Slow (slow): . Estándar para ruido estacionario.
  • Impulse (impulse): balística asimétrica, 35 ms de ataque y 1,5 s de caída. Los dos números están especificados, no ajustados a ojo: el apartado 2.7 de ANSI S1.4-1983 define el nivel sonoro de impulso como un promediado temporal exponencial de 35 ms para las partes crecientes de la señal y una constante de tiempo de 1500 ms para las decrecientes.

Una ráfaga tonal excita el detector exponencial RC: el condensador se carga y se descarga mientras las agujas de los sonómetros Fast, Slow e Impulse siguen cada una su propia balística, y las tres trazas de nivel se construyen debajo mostrando el ataque rápido, el promedio lento y la retención asimétrica del modo Impulse.

Descargar la animación (WebM)

Una ráfaga tonal excita el detector exponencial RC: el condensador se carga y se descarga mientras las agujas de los sonómetros Fast, Slow e Impulse siguen cada una su propia balística, y las tres trazas de nivel se construyen debajo mostrando el ataque rápido, el promedio lento y la retención asimétrica del modo Impulse.

Descargar la animación (WebM)

Respuestas de las ponderaciones temporales Fast, Slow e Impulse a una ráfaga de ruidoRespuestas de las ponderaciones temporales Fast, Slow e Impulse a una ráfaga de ruido

Los tres detectores sobre una misma ráfaga de ruido de 0,5 s: Fast sube y baja con ella, Slow no llega nunca a su nivel, e Impulse sube con Fast y luego mantiene.

Mostrar el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
from phonometry import filters
fs = 48000
t = np.arange(int(fs * 4)) / fs
burst = np.zeros_like(t) # ráfaga de ruido de 0.5 s (Pa) que empieza en t = 1 s
rng = np.random.default_rng(42)
burst[fs:int(1.5 * fs)] = 0.2 * rng.standard_normal(int(0.5 * fs))
p0 = 2e-5
plt.figure()
for mode in ('fast', 'slow', 'impulse'):
envelope = filters.time_weighting(burst, fs, mode=mode)
plt.plot(t, 10 * np.log10(np.maximum(envelope, 1e-12) / p0**2), label=mode)
plt.xlabel('Tiempo [s]')
plt.ylabel('Nivel [dB SPL]')
plt.legend()
plt.show()
import numpy as np
from phonometry import filters
# recording: una captura de micrófono calibrada (Pa) — grabada con tu cadena de medición. Sintetizada aquí para que la guía funcione por sí sola.
fs = 48000
recording = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)
# Calcular la envolvente de energía (valor cuadrático medio)
energy_envelope = filters.time_weighting(recording, fs, mode='fast')
# dB SPL respecto a 20 μPa
spl_t = 10 * np.log10(energy_envelope / (2e-5)**2)
print(f"Nivel Fast en régimen permanente: {spl_t[-1]:.1f} dB SPL")
# Nivel Fast en régimen permanente: 77.0 dB SPL

La ponderación temporal Impulse asimétrica usa dos constantes, ataque rápido y caída lenta, conmutando por muestra según el signo del cambio:

Una constante de tiempo y una velocidad de caída son la misma afirmación. Un valor cuadrático medio que decae exponencialmente cae a un ritmo constante de decibelios por segundo, y por eso el apartado 5.8.1 de IEC 61672-1 puede especificar F y S por duplicado: como constantes objetivo de diseño de 0,125 s y 1 s, y como velocidades de caída objetivo de diseño de 34,7 dB/s y 4,3 dB/s. La misma aritmética convierte la constante de 1,5 s de las partes decrecientes de la característica analógica IMPULSE en 2,9 dB/s, la caída que un operador tenía que poder leer sobre una aguja en movimiento.

La asimetría tiene una consecuencia que merece decirse: a diferencia de F y S, Impulse no es un filtro. Su coeficiente depende de la señal, así que un nivel ponderado I no es aditivo; el nivel ponderado I de dos fuentes funcionando a la vez no se puede deducir de las dos medidas por separado, mientras que sus sí.

  • Fast es el valor por defecto de casi todos los métodos modernos: niveles percentiles, detección de eventos impulsivos, ruido comunitario, la gráfica general de «nivel frente a tiempo». Su constante de 125 ms es del mismo orden que el tiempo de integración de sonoridad del propio oído, así que una traza sigue a grandes rasgos lo que un oyente percibe.
  • Slow conviene a fuentes cuasi estacionarias y a cualquier procedimiento que necesite una lectura estable: promedia el parpadeo de una fuente fluctuante al precio de perder los eventos cortos (una ráfaga de 100 ms alcanza un pico 7,6 dB más bajo en S que en F). Algunos métodos heredados la prescriben directamente; el caso más famoso son los niveles de certificación de aeronaves, construidos sobre muestras con ponderación Slow.
  • Impulse es herencia histórica, y está desaconsejada para valorar. Fue un intento de los años 60 de que la aguja del sonómetro siguiera la sonoridad percibida de los impactos; no lo consigue (el ataque de 35 ms sigue perdiendo los impulsos muy cortos y la caída de 1,5 s exagera la duración). Entró en las normas internacionales con IEC 60651 y quedó fuera de los requisitos de su sucesora IEC 61672-1, cuya primera edición (2002) explica el porqué: los niveles ponderados I no son adecuados para valorar sonidos impulsivos. La práctica internacional moderna valora la impulsividad con más un ajuste (Tabla A.1 de ISO 1996-1, o el análisis de inicio de Prominencia de sonidos impulsivos) y evalúa el riesgo de daño auditivo con , nunca con niveles ponderados I. Algunas normas nacionales siguen exigiendo explícitamente la ponderación I: el RD 1367/2007 español gradúa su corrección por impulsividad sobre (ver Normativa española de ruido), y por eso mode='impulse' es aquí una opción de pleno derecho y no un parche de compatibilidad.
Nivel de pico de la envolvente respecto a la lectura estacionaria, en decibelios, frente a la duración de la ráfaga tonal de un milisegundo a dos segundos en eje logarítmico, con una curva medida por detector: Impulse la más alta, después Fast y después Slow. Las tres se acercan a cero decibelios para ráfagas de un segundo o más y caen con fuerza para las cortas, hasta menos 18, menos 21 y menos 30 decibelios a un milisegundo. Los círculos huecos de la ecuación 7 de la Tabla 4 de IEC 61672-1 caen exactamente sobre las curvas de Fast y Slow, un marcador vertical en 100 milisegundos anota la diferencia de 7,6 decibelios entre Fast y Slow en ese punto, y una anotación señala que incluso Impulse pierde 18 decibelios en una ráfaga de un milisegundoNivel de pico de la envolvente respecto a la lectura estacionaria, en decibelios, frente a la duración de la ráfaga tonal de un milisegundo a dos segundos en eje logarítmico, con una curva medida por detector: Impulse la más alta, después Fast y después Slow. Las tres se acercan a cero decibelios para ráfagas de un segundo o más y caen con fuerza para las cortas, hasta menos 18, menos 21 y menos 30 decibelios a un milisegundo. Los círculos huecos de la ecuación 7 de la Tabla 4 de IEC 61672-1 caen exactamente sobre las curvas de Fast y Slow, un marcador vertical en 100 milisegundos anota la diferencia de 7,6 decibelios entre Fast y Slow en ese punto, y una anotación señala que incluso Impulse pierde 18 decibelios en una ráfaga de un milisegundo

Cuánto conserva cada detector de un evento, en función de lo que dure el evento. Las curvas medidas caen sobre los puntos de referencia de la Tabla 4, así que toda la tabla es una línea de álgebra. La diferencia entre dos curvas a una duración dada es la razón por la que un nivel máximo tiene que nombrar su ponderación temporal; y la pérdida absoluta es la razón por la que los impulsos muy cortos se valoran con en su lugar: incluso Impulse, la balística diseñada para impactos, se queda 18 dB baja en una ráfaga de 1 ms.

Mostrar el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
fs = 48000
t = np.arange(int(3.0 * fs)) / fs
tone = np.sin(2 * np.pi * 4000 * t)
durations = np.geomspace(0.001, 2.0, 30)
plt.figure()
for mode in ('fast', 'slow', 'impulse'):
reference = filters.time_weighting(tone, fs, mode=mode)[int(2.5 * fs):].mean()
peaks = []
for t_b in durations:
burst = np.zeros_like(t)
stop = int(0.5 * fs) + int(t_b * fs)
burst[int(0.5 * fs):stop] = tone[int(0.5 * fs):stop]
peaks.append(10 * np.log10(
filters.time_weighting(burst, fs, mode=mode).max() / reference))
plt.semilogx(durations * 1e3, peaks, label=mode)
plt.axvline(100.0, linewidth=0.8)
plt.xlabel('Duración de la ráfaga tonal [ms]')
plt.ylabel('Nivel de pico re la lectura estacionaria [dB]')
plt.legend()
plt.show()

3. Parámetros de time_weighting() / TimeWeighting

Sección titulada «3. Parámetros de time_weighting() / TimeWeighting»
ParámetroTipoUnidadesRango / por defectoNotas
xarray 1D o 2Dpresión (cualquier escala)no vacíoSe eleva al cuadrado internamente; la salida es una envolvente cuadrática media
fsintHz> 0
modestr'fast' (por defecto), 'slow', 'impulse' = 125 ms / 1 s / ataque de 35 ms + caída de 1,5 s
initial_stateNone / 'zero' / 'first' / float / arraycuadrado medio de por defecto None (= 'zero')Estado del integrador ; ver los apartados 5 y 6
TimeWeighting(fs, mode) (clase)Variante con estado para streaming: process(x) conserva el estado del integrador entre bloques
TimeWeighting.reset()Descarta el estado arrastrado para que el siguiente process() arranque del reposo

La salida tiene las unidades de : toma 10*log10(y / p0**2) para SPL o usa las funciones de nivel, que lo hacen por ti.

4. Respuesta temporal verificada (IEC 61672-1, Tabla 4)

Sección titulada «4. Respuesta temporal verificada (IEC 61672-1, Tabla 4)»

Esos valores de referencia no son una tabla de consulta sin fórmula detrás. La IEC 61672-1 los da en la nota 1 a la Tabla 4 como ecuación (7), la respuesta exacta del detector del apartado 1 a una ráfaga tonal aislada de 4 kHz de duración :

Léela en voz alta y sale la tabla entera. En Fast ( ms) una ráfaga de 200 ms da dB, una de 50 ms dB y una de 10 ms dB: los tres paneles de abajo. Una ráfaga de 100 ms da dB en Fast y dB en Slow, y esos 7,6 dB son la cifra que cita la guía de elección de más arriba. La física cabe en una frase: un detector con memoria no puede alcanzar su valor estacionario en un evento más corto que , así que todo sonómetro subestima todo evento corto, en una cantidad que solo depende de . Por eso un nivel máximo no significa nada sin su balística, y por eso los impulsos cortos frente a los 125 ms se valoran con en su lugar.

La respuesta de la envolvente Fast a ráfagas tonales de 4 kHz cae exactamente sobre los valores de referencia de la norma: el ejemplo de abajo verifica las tres filas de la Tabla 4 dibujadas en la figura; la batería de CI cubre la tabla completa, de 1 s a 1 ms en F y de 1 s a 2 ms en S, con límites de aceptación de clase 1:

Respuestas de la envolvente Fast a ráfagas de 200, 50 y 10 ms alcanzando exactamente los valores de la Tabla 4 de IEC 61672-1Respuestas de la envolvente Fast a ráfagas de 200, 50 y 10 ms alcanzando exactamente los valores de la Tabla 4 de IEC 61672-1

Los picos de la envolvente Fast quedan en −1,0, −4,8 y −11,1 dB respecto al tono estacionario para las ráfagas de 200, 50 y 10 ms de la Tabla 4; la batería de CI comprueba la tabla completa, de 1 s a 1 ms.

Mostrar el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
from phonometry import filters
fs = 48000
t = np.arange(int(fs * 2)) / fs
tone = np.sin(2 * np.pi * 4000 * t)
# Referencia Fast en régimen permanente del tono continuo
reference = filters.time_weighting(tone, fs, mode='fast')[int(1.5 * fs):].mean()
# Las tres filas de la Tabla 4 que dibuja la figura publicada, con sus objetivos
cases = [(0.200, -1.0), (0.050, -4.8), (0.010, -11.1)]
fig, axes = plt.subplots(len(cases), 1, sharey=True, figsize=(8, 8))
for ax, (t_b, target) in zip(axes, cases):
burst = np.zeros_like(t)
stop = int(0.5 * fs) + int(t_b * fs)
burst[int(0.5 * fs):stop] = tone[int(0.5 * fs):stop]
envelope = filters.time_weighting(burst, fs, mode='fast')
env_db = 10 * np.log10(np.maximum(envelope / reference, 1e-6))
ax.plot(t, env_db, label=f'Envolvente Fast, ráfaga de {t_b * 1e3:.0f} ms')
ax.axhline(target, linestyle='--', label=f'Objetivo IEC {target} dB')
ax.set_ylabel('Nivel respecto al régimen permanente [dB]')
ax.legend(loc='upper right')
axes[-1].set_xlabel('Tiempo [s]')
plt.show()

El integrador necesita un valor de partida para , y hay cuatro maneras de dárselo.

  • None (el valor por defecto) y 'zero' son lo mismo, un arranque desde el reposo, así que el nivel sube por la rampa de establecimiento del apartado 1.
  • 'first' lo siembra con el cuadrado de la primerísima muestra, . Es una estimación insesgada pero extremadamente ruidosa del cuadrado medio (un grado de libertad) y, para un tono, depende por completo de la fase en el corte. En el fragmento de abajo vale exactamente cero, porque un seno que empieza en empieza en un paso por cero, así que ahí 'first' es idéntico bit a bit a 'zero'.
  • Un float reanuda un estado que hayas guardado tú, que es lo que hace el procesado por bloques del apartado 6.
  • Un array compatible por broadcasting con la forma de la entrada sin el eje temporal hace lo mismo por canal.

Si el registro es la continuación de una señal que ya venía sonando, siembra el integrador con algo robusto: el cuadrado medio del primer medio segundo, initial_state=float(np.mean(recording[:fs // 2] ** 2)), es una estimación mucho mejor que una muestra suelta. Si el registro es el comienzo del suceso, no siembres nada: deja que arranque del reposo y descarta los primeros (0,6 s en Fast, 5 s en Slow), que es exactamente lo que ln_levels hace por dentro antes de calcular percentiles.

import numpy as np
from phonometry import filters
# recording: una captura de micrófono calibrada (Pa) — grabada con tu cadena de medición. Sintetizada aquí para que la guía funcione por sí sola.
fs = 48000
recording = 0.2 * np.sin(2 * np.pi * 1000 * np.arange(fs) / fs)
# Semilla robusta: el cuadrado medio del primer medio segundo, no una muestra.
energy_envelope = filters.time_weighting(
recording, fs, mode='fast',
initial_state=float(np.mean(recording[:fs // 2] ** 2)))

Para procesar por bloques, pasa el último valor de salida del bloque anterior como initial_state del siguiente en lugar de reiniciar en cada bloque:

from phonometry import filters
state = None
# audio_blocks: tramas consecutivas de tu grabación calibrada (Pa),
# transmitidas desde tu tarjeta de sonido o leídas de un WAV por bloques.
for block in audio_blocks:
energy_envelope = filters.time_weighting(block, fs, mode='fast', initial_state=state)
state = energy_envelope[-1]

Para bloques multicanal con el tiempo en el último eje, lleva un estado por canal: usa state = energy_envelope[..., -1]. Un initial_state escalar se aplica a todos los canales, mientras que un array debe coincidir con la forma sin el eje temporal o ser compatible con ella por broadcasting, p. ej. (n_channels,) para una entrada de forma (n_channels, n_samples).

O deja que la clase TimeWeighting lleve el estado por ti:

from phonometry import filters
tw = filters.TimeWeighting(fs, mode='fast')
# audio_blocks: tramas consecutivas de tu grabación calibrada (Pa),
# transmitidas desde tu tarjeta de sonido o leídas de un WAV por bloques.
for block in audio_blocks:
energy_envelope = tw.process(block)

Las salidas concatenadas por bloques son exactamente iguales a una única llamada continua (verificado para los tres modos, mono y multicanal). Llama a tw.reset() para volver al reposo.

El modo impulse usa un kernel asimétrico que se compila JIT cuando numba está instalado (pip install phonometry[perf]). Sin numba, un fallback en Python puro produce resultados idénticos, solo que más lento.

Consulta Niveles integrados y estadísticos para las métricas / construidas sobre estas envolventes, y Por qué phonometry para la verificación con ráfagas tonales de IEC 61672-1.

  • Cubierto

    El detector exponencial de ponderación temporal de la IEC 61672-1:2013 (apartado 3.8) con las constantes de tiempo Fast y Slow (apartado 5.8.1), implementado como el filtro recursivo de time_weighting y la clase TimeWeighting para streaming, verificado en CI contra las referencias de ráfaga tonal de clase 1 de la Tabla 4. La balística asimétrica heredada Impulse (35 ms de ataque, 1,5 s de caída), trasladada a las normas internacionales desde las características FAST/SLOW/IMPULSE de ANSI S1.4-1983.

  • No cubierto

    La cadena de instrumento más amplia de la IEC 61672-1 (ponderación frecuencial, rangos de nivel, verificaciones periódicas) no está en esta página; es el asunto de Construye un sonómetro. La ANSI S1.4-1983 se cita solo por el origen histórico de las constantes F y S, no se implementa como especificación de instrumento propia. La valoración moderna de impulsividad ( más un ajuste, o el análisis de inicio) está en la página de Prominencia de sonidos impulsivos, no construida sobre la ponderación Impulse de aquí.

  • Niveles: los niveles percentiles definidos sobre la salida del detector, y las métricas integradas que lo evitan.
  • Construye un sonómetro: la cadena completa de instrumento IEC 61672-1 alrededor de este detector.
  • Ponderación frecuencial: los filtros A/C/Z aplicados antes del detector.
  • Procesado por bloques: el detector en streaming sobre tramas sin discontinuidades de estado.
  • Prominencia de sonidos impulsivos: la valoración de impulsos por análisis de inicio a la que se pasaron las normas internacionales.
  • Normativa española de ruido: una valoración en vigor que sigue exigiendo la ponderación I, a través de la corrección por impulsividad sobre .
  • Calibración y dBFS: los ensayos periódicos de IEC 61672-3, en los que esta balística se comprueba por muestreo contra los límites de clase sobre un instrumento real.
  • Referencia de la API: filters.weighting.
  • Teoría: Integración temporal: la ecuación de primer orden que resuelven los detectores exponenciales, y qué cambiaría integrarla en su lugar sobre un bloque fijo.
  • American National Standards Institute. (1983). Specification for sound level meters (ANSI S1.4-1983). La especificación clásica del sonómetro analógico: las características dinámicas FAST/SLOW de las que descienden las constantes F y S, y la característica IMPULSE que IEC 61672-1 ya no especifica, definida en el apartado 2.7 como una constante de promediado temporal exponencial de 35 ms para las partes crecientes de la señal y de 1500 ms para las decrecientes.
  • Bies, D. A., Hansen, C. H. y Howard, C. Q. (2017). Engineering noise control (5.ª ed.). CRC Press. https://doi.org/10.1201/9781351228152Las secciones 3.2 y 3.6 (sonómetros y medición de sonido variable en el tiempo: qué significan las lecturas F/S/I en la práctica instrumental). ISBN 978-1-4987-2405-0.
  • International Electrotechnical Commission. (2013). Electroacoustics — Sound level meters — Part 1: Specifications (IEC 61672-1:2013). El detector exponencial de ponderación temporal (apartado 3.8) con las constantes de tiempo y las velocidades de caída objetivo de diseño F y S (apartado 5.8.1), el nivel sonoro máximo con ponderación temporal (apartado 3.7) y su función de retención (apartado 5.1.14), y las respuestas de referencia a ráfagas tonales de 4 kHz de la Tabla 4 y su ecuación (7) (límites de aceptación de clase 1) contra las que se verifica la balística en CI.