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.
1. El detector exponencial
Sección titulada «1. El detector exponencial»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.
2. Las tres ponderaciones temporales
Sección titulada «2. Las tres ponderaciones temporales»- 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.
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.
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 npimport matplotlib.pyplot as pltfrom phonometry import filters
fs = 48000t = np.arange(int(fs * 4)) / fsburst = np.zeros_like(t) # ráfaga de ruido de 0.5 s (Pa) que empieza en t = 1 srng = np.random.default_rng(42)burst[fs:int(1.5 * fs)] = 0.2 * rng.standard_normal(int(0.5 * fs))
p0 = 2e-5plt.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 npfrom 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 = 48000recording = 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 μPaspl_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 SPLLa 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í.
Elegir F, S o I
Sección titulada «Elegir F, S o I»- 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.
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 npimport matplotlib.pyplot as plt
fs = 48000t = np.arange(int(3.0 * fs)) / fstone = 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ámetro | Tipo | Unidades | Rango / por defecto | Notas |
|---|---|---|---|---|
x | array 1D o 2D | presión (cualquier escala) | no vacío | Se eleva al cuadrado internamente; la salida es una envolvente cuadrática media |
fs | int | Hz | > 0 | |
mode | str | — | 'fast' (por defecto), 'slow', 'impulse' | = 125 ms / 1 s / ataque de 35 ms + caída de 1,5 s |
initial_state | None / 'zero' / 'first' / float / array | cuadrado 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:
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 npimport matplotlib.pyplot as pltfrom phonometry import filters
fs = 48000t = np.arange(int(fs * 2)) / fstone = np.sin(2 * np.pi * 4000 * t)
# Referencia Fast en régimen permanente del tono continuoreference = 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 objetivoscases = [(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()5. Estado inicial
Sección titulada «5. Estado inicial»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 npfrom 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 = 48000recording = 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)))6. Procesado por bloques
Sección titulada «6. Procesado por bloques»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.
7. Nota de rendimiento
Sección titulada «7. Nota de rendimiento»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.
Qué cubre esta guía
Sección titulada «Qué cubre esta guía»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_weightingy la claseTimeWeightingpara 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í.
Véase también
Sección titulada «Véase también»- 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.
Referencias
Sección titulada «Referencias»- 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.