Ir al contenido

Ponderación frecuencial (A, C, G, Z)

Las curvas de ponderación frecuencial simulan la sensibilidad del oído humano. A, C y Z están especificadas en IEC 61672-1:2013; la curva G de infrasonido, en ISO 7196:1995.

Curvas de ponderación A, C y Z con zoom de la región positiva de la curva A (+1,27 dB en 2,5 kHz)Curvas de ponderación A, C y Z con zoom de la región positiva de la curva A (+1,27 dB en 2,5 kHz)

  • Ponderación A (A): estándar para ruido ambiental (IEC 61672-1).
  • Ponderación C (C): para presión sonora de pico y ruido de alto nivel.
  • Ponderación Z (Z): ponderación cero, respuesta completamente plana.
  • Ponderación G (G): ponderación de infrasonido según ISO 7196 (ver más abajo).
from phonometry import weighting_filter
# Aplicar ponderación A a la señal cruda
weighted_signal = weighting_filter(signal, fs, curve='A')
# Aplicar ponderación C para análisis de picos
c_weighted_signal = weighting_filter(signal, fs, curve='C')

La ponderación frecuencial G (ISO 7196:1995) valora el infrasonido igual que la ponderación A valora el ruido audible. Se define por una configuración de polos y ceros con ganancia de 0 dB en 10 Hz, sube a 12 dB/octava entre 1 Hz y 20 Hz (siguiendo el crecimiento abrupto de la percepción en esa banda) y cae a 24 dB/octava fuera de ella. Úsala con fuentes con energía significativa por debajo de 20 Hz (aerogeneradores, climatización, voladuras):

from phonometry import weighting_filter
g_weighted = weighting_filter(signal, fs, curve='G')

Respuesta en frecuencia de la ponderación G de 0,1 Hz a 1 kHz con los valores nominales de la Tabla 2 de ISO 7196 superpuestosRespuesta en frecuencia de la ponderación G de 0,1 Hz a 1 kHz con los valores nominales de la Tabla 2 de ISO 7196 superpuestos

La implementación sigue exactamente los polos/ceros de la Tabla 1 de ISO 7196 y se verifica en CI contra todos los valores nominales de respuesta de la Tabla 2 (0,25 Hz a 315 Hz). WeightingFilter(fs, "G") admite el mismo procesado multicanal y por bloques que A/C. Los niveles medidos con la curva G se expresan como LpG (o LGeq para el nivel equivalente).

Las curvas A y C son líneas isofónicas invertidas, congeladas en filtros: A aproxima la inversa de la histórica línea isofónica de 40 fonios (niveles bajos, donde el oído descarta los graves con más agresividad) y C la más plana de ~100 fonios (niveles altos). IEC 61672-1:2013 (Anexo E) define ambas analíticamente a partir de cuatro frecuencias de esquina:

f1=20.599 Hz,f2=107.653 Hz,f3=737.862 Hz,f4=12194.217 Hzf_1 = 20.599\ \text{Hz}, \quad f_2 = 107.653\ \text{Hz}, \quad f_3 = 737.862\ \text{Hz}, \quad f_4 = 12194.217\ \text{Hz}

C es un paso-banda con polos dobles en f1f_1 y f4f_4 (2 ceros en el origen); A añade los polos f2f_2 y f3f_3 (4 ceros), y por eso sigue cayendo en los medios-graves. Ambas se normalizan a exactamente 0 dB en 1 kHz. Z es la ausencia de ponderación. La derivación completa de polos y ceros está en la página de Teoría.

Parámetros de weighting_filter() / WeightingFilter

Sección titulada «Parámetros de weighting_filter() / WeightingFilter»
ParámetroTipoUnidadesRango / por defectoNotas
xarray 1D o 2Dcualquierano vacío2D es [channels, samples]
fsintHz> 0
curvestr'A' (por defecto), 'C', 'G', 'Z''G' según ISO 7196 (infrasonido); 'Z' es un bypass
high_accuracyboolpor defecto True (función); en la clase, None se resuelve a not statefulSobremuestreo interno (8×, ≥ 96 kHz a frecuencias de audio habituales) que mantiene A/C en clase 1 hasta 16 kHz; con G se ignora en silencio (su rango de 0,25–315 Hz ya es exacto con el diseño simple)
statefulbool (solo clase)por defecto FalseConserva el estado del filtro entre bloques (streaming)
steady_icbool (solo clase)por defecto FalseCondiciones iniciales estacionarias (sin transitorio de arranque)

Si ponderas muchas señales con los mismos parámetros, diseña el filtro una sola vez:

from phonometry import WeightingFilter
wf = WeightingFilter(fs, "A")
for signal in signals:
weighted = wf.filter(signal)

Precisión en alta frecuencia (high_accuracy)

Sección titulada «Precisión en alta frecuencia (high_accuracy)»

Un diseño con transformación bilineal simple comprime la respuesta cerca de Nyquist: a fs = 48 kHz el error de la curva A a 12,5 kHz alcanza −2,7 dB, fuera de la tolerancia clase 1 de IEC 61672-1 (+2,0/−2,5 dB).

Por defecto (high_accuracy=True), phonometry diseña y ejecuta el filtro de ponderación a una frecuencia interna sobremuestreada (≥ 96 kHz) y diezma de vuelta, manteniendo la respuesta dentro de las tolerancias de clase 1 hasta 16 kHz (error ≈ −0,5 dB a 12,5 kHz para fs = 48 kHz).

Precisión en alta frecuencia de la ponderación A a 48 kHz: curva analítica frente a bilineal simple y diseño sobremuestreado, con errorPrecisión en alta frecuencia de la ponderación A a 48 kHz: curva analítica frente a bilineal simple y diseño sobremuestreado, con error

El diseño bilineal simple (rojo) cruza la tolerancia de clase 1 cerca de 12,5 kHz; el diseño sobremuestreado (azul) se mantiene junto a la curva analítica.

  • high_accuracy=False restaura el comportamiento bilineal clásico.
  • El procesado por bloques (stateful) usa siempre el diseño clásico: el remuestreo FIR interno es incompatible con la continuidad entre bloques. Pasar high_accuracy=True junto con stateful=True lanza un ValueError.
# Comportamiento clásico explícito
y = weighting_filter(signal, fs, curve="A", high_accuracy=False)
# Procesado por bloques con estado (diseño clásico, estado entre bloques)
wf = WeightingFilter(fs, "A", stateful=True)
for block in blocks:
weighted = wf.filter(block)

Consulta Procesado por bloques para el flujo en streaming y Teoría para las definiciones analíticas de las curvas.

Creado y mantenido por· GitHub· PyPI