<!-- canonical: https://jmrplens.github.io/phonometry/es/signals/levels/time-weighting/ -->
Source: https://jmrplens.github.io/phonometry/es/signals/levels/time-weighting/

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](#elegir-f-s-o-i) 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 $L_N$ de
[Niveles integrados y estadísticos](/phonometry/es/signals/levels/levels/),
mientras que las métricas
integradas ($L_\mathrm{eq}$, 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](/phonometry/es/signals/sound-level-meter/).

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

$$
\tau\ \frac{dy}{dt} + y = x^2(t)
\quad\Longleftrightarrow\quad
y(t) = \frac{1}{\tau} \int_{-\infty}^{t} x^2(\xi)\ e^{-(t-\xi)/\tau}\ d\xi
$$

un paso bajo de primer orden sobre la señal al cuadrado. La constante de tiempo
$\tau$ 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 $\tau$
y ~99,97 % tras $8\tau$; por eso los análisis de nivel descartan los primeros
instantes de una grabación.

## 2. Las tres ponderaciones temporales

* **Fast (`fast`):** $\tau = 125\ \text{ms}$. Estándar para fluctuaciones de ruido.
* **Slow (`slow`):** $\tau = 1000\ \text{ms}$. 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.

*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.*

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

```python

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()
```

</details>

```python

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:

$$
y[n] = y[n-1] + \alpha \ (x^2[n] - y[n-1]), \qquad
\alpha = \begin{cases}1 - e^{-1/(f_\mathrm{s} \cdot 0{,}035)} & x^2[n] > y[n-1]\\[2pt] 1 - e^{-1/(f_\mathrm{s} \cdot 1{,}5)} & \text{en otro caso}\end{cases}
$$

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
$10/(\tau \ln 10)$ 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
$L_\mathrm{eq}$ sí.

### 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 $L_\mathrm{AF}$ 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 $L_\mathrm{Aeq}$ más un ajuste (Tabla A.1 de ISO 1996-1, o el análisis de
  inicio de
  [Prominencia de sonidos impulsivos](/phonometry/es/environment/assessment/impulsive-sound/))
  y evalúa el riesgo de daño auditivo con $L_\mathrm{Cpeak}$, 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
  $K_\mathrm{i}$ sobre $L_\mathrm{AIeq} - L_\mathrm{Aeq}$ (ver
  [Normativa española de ruido](/phonometry/es/environment/assessment/spanish-noise-regulation/)),
  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 $L_\mathrm{Cpeak}$ en su lugar: incluso Impulse, la balística
diseñada para impactos, se queda 18 dB baja en una ráfaga de 1 ms.*

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

```python

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()
```

</details>

## 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'` | $\tau$ = 125 ms / 1 s / ataque de 35 ms + caída de 1,5 s |
| `initial_state` | `None` / `'zero'` / `'first'` / float / array | cuadrado medio de $x$ | por defecto `None` (= `'zero'`) | Estado del integrador $y[-1]$; 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 $x^2$: 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)

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 $T_\mathrm{b}$:

$$
\Delta_{\mathrm{ref}} = 10\log_{10}\left(1 - e^{-T_\mathrm{b}/\tau}\right)\ \text{dB}
$$

Léela en voz alta y sale la tabla entera. En Fast ($\tau = 125$ ms) una ráfaga
de 200 ms da $-0{,}98$ dB, una de 50 ms $-4{,}82$ dB y una de 10 ms
$-11{,}14$ dB: los tres paneles de abajo. Una ráfaga de 100 ms da $-2{,}59$ dB
en Fast y $-10{,}21$ dB en Slow, y esos 7,6 dB son la cifra que cita la
[guía de elección](#elegir-f-s-o-i) de más arriba. La física cabe en una frase:
un detector con memoria $\tau$ no puede alcanzar su valor estacionario en un
evento más corto que $\tau$, así que **todo sonómetro subestima todo evento
corto**, en una cantidad que solo depende de $T_\mathrm{b}/\tau$. 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 $L_\mathrm{Cpeak}$ 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.*

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

```python

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()
```

</details>

## 5. Estado inicial

El integrador necesita un valor de partida para $y[-1]$, 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**, $x[0]^2$.
  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 $t = 0$ 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 $5\tau$
(0,6 s en Fast, 5 s en Slow), que es exactamente lo que `ln_levels` hace por
dentro antes de calcular percentiles.

```python

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

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

```python
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:

```python
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

El modo `impulse` usa un kernel asimétrico que se compila JIT cuando
[numba](https://numba.pydata.org/) 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](/phonometry/es/signals/levels/levels/)
para las métricas $L_\mathrm{eq}$/$L_N$ construidas sobre estas envolventes, y
[Por qué phonometry](/phonometry/es/start/why-phonometry/) para la
verificación con ráfagas tonales de IEC 61672-1.

## Qué cubre esta guía

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.

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](/phonometry/es/signals/sound-level-meter/). 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 ($L_\mathrm{Aeq}$ más un ajuste, o el análisis de inicio) está en la
página de [Prominencia de sonidos
impulsivos](/phonometry/es/environment/assessment/impulsive-sound/), no
construida sobre la ponderación Impulse de aquí.

## Véase también

- [Niveles](/phonometry/es/signals/levels/levels/): los niveles percentiles definidos sobre la salida del detector, y las métricas integradas que lo evitan.
- [Construye un sonómetro](/phonometry/es/signals/sound-level-meter/): la cadena completa de instrumento IEC 61672-1 alrededor de este detector.
- [Ponderación frecuencial](/phonometry/es/signals/levels/weighting/): los filtros A/C/Z aplicados antes del detector.
- [Procesado por bloques](/phonometry/es/signals/filters/block-processing/): el detector en streaming sobre tramas sin discontinuidades de estado.
- [Prominencia de sonidos impulsivos](/phonometry/es/environment/assessment/impulsive-sound/): la valoración de impulsos por análisis de inicio a la que se pasaron las normas internacionales.
- [Normativa española de ruido](/phonometry/es/environment/assessment/spanish-noise-regulation/): una valoración en vigor que sigue exigiendo la ponderación I, a través de la corrección por impulsividad $K_\mathrm{i}$ sobre $L_\mathrm{AIeq} - L_\mathrm{Aeq}$.
- [Calibración y dBFS](/phonometry/es/signals/metrology/calibration/): 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`](/phonometry/es/reference/api/filters/weighting/).
- Teoría: [Integración temporal](/phonometry/es/reference/theory/signal-analysis/#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.
