Ir al contenido

Ponderación frecuencial (A, B, C, D, G, AU, Z)

Normas aplicables: ISO 226IEC 61672ISO 7196ANSI S1.4IEC 61012IEC 537Referencias: Fletcher y Munson 1933

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. Tres curvas más completan la familia: la histórica B (ANSI S1.4-1983), la D de ruido de aeronaves de la retirada IEC 537 y la AU (IEC 61012) para sonido audible en presencia de ultrasonidos (sección 4).

Curvas de ponderación A, B, C, D, AU 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, B, C, D, AU y Z con zoom de la región positiva de la curva A (+1,27 dB en 2,5 kHz)
Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import metrology
# Medimos la respuesta de cada curva: ponderamos un impulso unitario
# centrado y tomamos su espectro (búfer de 1 s -> resolución de 1 Hz).
fs = 48000
impulse = np.zeros(fs)
impulse[fs // 2] = 1.0
freqs = np.fft.rfftfreq(fs, 1 / fs)
fig, ax = plt.subplots(figsize=(9, 5))
for curve in ("A", "B", "C", "D", "AU", "Z"):
spectrum = np.fft.rfft(metrology.weighting_filter(impulse, fs, curve=curve))
ax.semilogx(freqs[1:], 20 * np.log10(np.abs(spectrum[1:]) + np.finfo(float).eps),
label=curve)
ax.set(xlim=(10, 20000), ylim=(-80, 15),
xlabel="Frecuencia [Hz]", ylabel="Respuesta [dB]")
ax.grid(True, which="both", alpha=0.3)
ax.legend()
plt.show()
  • Ponderación A (A): estándar para ruido ambiental (IEC 61672-1).
  • Ponderación C (C): para presión acústica 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).
  • Ponderación B (B): curva intermedia histórica de ANSI S1.4-1983 (sección 4).
  • Ponderación D (D): ponderación de ruido de aeronaves de la retirada IEC 537 (sección 4).
  • Ponderación AU (AU): ponderación A con el corte de ultrasonidos de IEC 61012 (sección 4).

¿Cómo aplico la ponderación A a una señal con Python?

Sección titulada «¿Cómo aplico la ponderación A a una señal con Python?»

Llama a metrology.weighting_filter(recording, fs, curve='A') sobre una señal calibrada. Devuelve la señal temporal ponderada A, filtrada con el diseño de polos y ceros de IEC 61672-1:2013 dentro de las tolerancias de clase 1, así que metrology.leq() sobre la salida es el . La misma función aplica las ponderaciones C, Z, B, D, AU y la G de infrasonido mediante curve.

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:

C es un paso-banda con polos dobles en y (2 ceros en el origen); A añade los polos y (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.

Líneas isofónicas según ISO 226 a la izquierda, con la isófona de 40 fonios resaltada; a la derecha la curva de ponderación A superpuesta a la isófona de 40 fonios invertida, mostrando que A es la isófona volteada congelada en un filtro realizableLíneas isofónicas según ISO 226 a la izquierda, con la isófona de 40 fonios resaltada; a la derecha la curva de ponderación A superpuesta a la isófona de 40 fonios invertida, mostrando que A es la isófona volteada congelada en un filtro realizable

La cadena va de las mediciones de igual sonoridad de Fletcher y Munson en 1933 a la primera norma estadounidense de sonómetros (1936), que dio a los medidores respuestas conmutables para que la lectura aproximara la sonoridad a distintos niveles: A de la isófona de 40 fonios para sonidos débiles, B de la de ~70 fonios para los moderados y una respuesta plana para los fuertes (la curva C propiamente dicha, reflejo de la isófona más plana de ~100 fonios, llegó con la revisión de 1944). Conmutar curvas según el nivel murió en la práctica (las lecturas saltaban en los puntos de cambio y las mediciones de campo dejaban de ser comparables), pero A sobrevivió sola: décadas de datos de daño auditivo y de molestia comunitaria se habían recogido con ella, y correlaciona con ambos casi tan bien como métricas mucho más elaboradas. IEC 61672-1 (primera edición, 2002) remató la limpieza: B se eliminó, A y C se conservaron con tolerancias más estrictas y Z se introdujo para sustituir el “lineal” mal especificado de los sonómetros antiguos, que variaba según el fabricante. La curva B (y la curva D de ruido de aeronaves, que corrió la misma suerte) sigue disponible para datos históricos; véase la sección 4.

Como A descarta los graves y C los conserva, la diferencia es un indicador de un solo número del contenido en baja frecuencia:

  • Por debajo de unos 10 dB: espectro de banda ancha ordinario; el nivel ponderado A lo califica con justicia.
  • En torno a 15 a 20 dB o más: la energía se concentra en las bajas frecuencias (retumbo de climatización, compresores, graves de música a través de una pared). El nivel ponderado A entonces subestima el problema; mira el espectro de octavas y, por debajo de 20 Hz, pasa a la curva G.
  • La selección de protectores auditivos: el método HML de ISO 4869-2 se apoya exactamente en esta diferencia C menos A para decidir cuánta atenuación en baja frecuencia debe aportar el protector (el método SNR, más simple, la esquiva trabajando directamente con el nivel ponderado C).
import numpy as np
from phonometry import metrology
# Un retumbo de 50 Hz bajo un siseo ligero: débil en A, fuerte en C.
fs = 48000
t = np.arange(10 * fs) / fs
rng = np.random.default_rng(1)
x = 0.2 * np.sin(2 * np.pi * 50 * t) + 0.01 * rng.standard_normal(t.size)
la = metrology.leq(metrology.weighting_filter(x, fs, curve="A"))
lc = metrology.leq(metrology.weighting_filter(x, fs, curve="C"))
print(f"LAeq = {la:.1f} dB LCeq = {lc:.1f} dB C - A = {lc - la:.1f} dB")
# LAeq = 52.4 dB LCeq = 75.7 dB C - A = 23.2 dB
# C - A por encima de 20 dB: el número ponderado A ocultaría el retumbo.
import numpy as np
from phonometry import metrology
# 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)
# Aplicar ponderación A a la señal cruda
weighted_signal = metrology.weighting_filter(recording, fs, curve='A')
# Aplicar ponderación C para análisis de picos
c_weighted_signal = metrology.weighting_filter(recording, 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):

import numpy as np
from phonometry import metrology
# 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)
g_weighted = metrology.weighting_filter(recording, 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
Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import metrology
# Medimos la respuesta G: ponderamos un impulso unitario centrado y
# tomamos su espectro. Un búfer largo da la resolución que necesita el
# rango de infrasonido (20 s -> 0,05 Hz).
fs = 4000
impulse = np.zeros(20 * fs)
impulse[impulse.size // 2] = 1.0
freqs = np.fft.rfftfreq(impulse.size, 1 / fs)
spectrum = np.fft.rfft(metrology.weighting_filter(impulse, fs, curve="G"))
fig, ax = plt.subplots(figsize=(9, 5))
ax.semilogx(freqs[1:],
20 * np.log10(np.abs(spectrum[1:]) + np.finfo(float).eps))
ax.plot(10, 0, "o", color="tab:red", label="0 dB en 10 Hz")
ax.set(xlim=(0.1, 1000), ylim=(-90, 15),
xlabel="Frecuencia [Hz]", ylabel="Respuesta de la ponderación G [dB]")
ax.grid(True, which="both", alpha=0.3)
ax.legend()
plt.show()

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

4. Curvas históricas y de propósito especial: B, D y AU

Sección titulada «4. Curvas históricas y de propósito especial: B, D y AU»

Tres curvas más completan la familia. Las tres comparten la maquinaria de las curvas de IEC 61672-1 (0 dB en 1 kHz, sobremuestreo high_accuracy, procesado multicanal y por bloques con estado).

La curva intermedia del esquema original de conmutación por niveles A/B/C, trazada a partir de la isófona de ~70 fonios. Analíticamente es la ponderación C con un cero más en el origen y un polo real adicional en (Apéndice C de ANSI S1.4-1983), así que descarta menos graves que A y más que C. Se eliminó cuando IEC 61672-1 sustituyó a las normas de sonómetros anteriores; úsala solo para reproducir datos históricos y mediciones tomadas bajo códigos nacionales antiguos (algunos procedimientos de ensayo de automoción heredados publicaban dB(B)). La implementación sigue las constantes del Apéndice C de ANSI S1.4-1983 y está anclada en CI a los valores de respuesta de la Tabla IV, dentro de la máscara más estricta de la Tabla V (Tipo 0).

La ponderación D aproximaba las curvas de ruidosidad percibida del índice de nivel de ruido percibido (PNL), para que un sonómetro corriente pudiera estimar el ruido de aeronaves: la joroba de +11,5 dB en torno a 3,15 kHz es donde más molesta el silbido de la turbomaquinaria (deliberadamente no es un rasgo de igual sonoridad). El manual de métricas de ruido de aeronaves de la NASA da la clásica regla aproximada . IEC 537 fue retirada y la práctica de certificación actual calcula el EPNL a partir de análisis en tercios de octava o usa niveles ponderados A, así que D se ofrece para datos históricos y comparaciones. Con la norma no disponible, la implementación usa la función de transferencia racional de IEC 537, ampliamente publicada, contrastada con dos implementaciones independientes (los polos y ceros de SQAT y la forma cerrada de librosa, que coinciden dentro de 0,002 dB) y anclada en CI a la tabla de IEC 537 reeditada en NASA CR-3406.

import numpy as np
from phonometry import metrology
# Un silbido de 3,15 kHz cae justo en la joroba de la ponderación D:
# D lo valora 10 dB *más fuerte* que A.
fs = 96000
t = np.arange(fs) / fs
whine = 0.1 * np.sin(2 * np.pi * 3150 * t)
ld = metrology.leq(metrology.weighting_filter(whine, fs, curve="D"))
la = metrology.leq(metrology.weighting_filter(whine, fs, curve="A"))
print(f"LD = {ld:.1f} dB LA = {la:.1f} dB")
# LD = 82.5 dB LA = 72.2 dB

AU (IEC 61012, vigente: sonido audible en presencia de ultrasonidos)

Sección titulada «AU (IEC 61012, vigente: sonido audible en presencia de ultrasonidos)»

La única de las tres aún en vigor. AU es la ponderación A en cascada con el filtro paso-bajo U de IEC 61012:1990 (seis polos, Tabla 2): plana respecto a A hasta 10 kHz y con un corte abrupto después (-13 dB a 16 kHz, -61,8 dB a 40 kHz para U sola). Úsala cuando componentes ultrasónicos intensos (limpiadores y soldadores ultrasónicos, ahuyentadores de roedores, algunos disuasorios de espacios públicos) se colarían en una lectura ponderada A a través del rechazo imperfecto del sonómetro en alta frecuencia y sobreestimarían la exposición audible:

import numpy as np
from phonometry import metrology
# Tono de 1 kHz (audible) enterrado bajo una componente ultrasónica fuerte de 25 kHz.
fs = 96000
t = np.arange(fs) / fs
audible = 0.1 * np.sin(2 * np.pi * 1000 * t)
x = audible + 1.0 * np.sin(2 * np.pi * 25000 * t)
la = metrology.leq(metrology.weighting_filter(x, fs, curve="A"))
lau = metrology.leq(metrology.weighting_filter(x, fs, curve="AU"))
la_ref = metrology.leq(metrology.weighting_filter(audible, fs, curve="A"))
print(f"LA = {la:.1f} dB LAU = {lau:.1f} dB solo audible = {la_ref:.1f} dB")
# LA = 78.6 dB LAU = 71.0 dB solo audible = 71.0 dB
# El ultrasonido infla LA en 7,6 dB; AU recupera el nivel audible.

El ultrasonido solo llega a un filtro digital si la frecuencia de muestreo lo captura, así que mide a 96 kHz o más (a 48 kHz no hay nada por encima de 24 kHz que rechazar); el diseño AU sobremuestrea internamente hacia 288 kHz para mantener preciso el corte abrupto de U. Los niveles se expresan como LAU. La implementación sigue exactamente las posiciones de polos de la Tabla 2 (reproducen todos los valores nominales de la Tabla 1 dentro de 0,05 dB) y se verifica en CI contra las tolerancias de la Tabla 1 hasta 40 kHz.

5. Parámetros de weighting_filter() / WeightingFilter

Sección titulada «5. 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), 'B', 'C', 'D', 'G', 'AU', 'Z''G' según ISO 7196 (infrasonido); 'B'/'D' históricas (§4); 'AU' según IEC 61012 (§4); 'Z' es un bypass
high_accuracyboolpor defecto True (función); en la clase, None se resuelve a not statefulSobremuestreo interno que mantiene A/C en clase 1 hasta 16 kHz; detalles en el §7
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:

import numpy as np
from phonometry import metrology
# 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)
wf = metrology.WeightingFilter(fs, "A")
signals = [recording] # tu lote de grabaciones
for recording in signals:
weighted = wf.filter(recording)

7. Precisión en alta frecuencia (high_accuracy)

Sección titulada «7. 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 (hasta 8×, alcanzando ≥ 144 kHz a frecuencias de audio habituales; una entrada de 96 kHz funciona a ×2) 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.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import metrology
# Respuesta medida de ambos diseños a fs = 48 kHz: ponderamos un impulso
# unitario centrado y tomamos su espectro...
fs = 48000
impulse = np.zeros(fs)
impulse[fs // 2] = 1.0
freqs = np.fft.rfftfreq(fs, 1 / fs)[1:]
# ...frente a la curva A analítica de IEC 61672-1 construida con las
# cuatro frecuencias de esquina de la sección 1, normalizada a 0 dB en 1 kHz.
f1, f2, f3, f4 = 20.599, 107.653, 737.862, 12194.217
gain = (f4**2 * freqs**4) / ((freqs**2 + f1**2)
* np.sqrt((freqs**2 + f2**2) * (freqs**2 + f3**2))
* (freqs**2 + f4**2))
analytic = 20 * np.log10(gain / gain[np.argmin(np.abs(freqs - 1000))])
fig, ax = plt.subplots(figsize=(9, 5))
ax.semilogx(freqs, analytic, "k--", label="Analítica (IEC 61672-1)")
for high_accuracy, label in ((False, "Bilineal simple"),
(True, "Sobremuestreado (por defecto)")):
weighted = metrology.weighting_filter(impulse, fs, curve="A",
high_accuracy=high_accuracy)
response = 20 * np.log10(np.abs(np.fft.rfft(weighted))
+ np.finfo(float).eps)[1:]
ax.semilogx(freqs, response, label=label)
ax.set(xlim=(1000, 20000), ylim=(-12, 3),
xlabel="Frecuencia [Hz]", ylabel="Respuesta de la ponderación A [dB]")
ax.grid(True, which="both", alpha=0.3)
ax.legend()
plt.show()
  • high_accuracy=False restaura el comportamiento bilineal clásico.
  • Con 'G' el indicador se ignora en silencio: su rango de 0,25–315 Hz ya es exacto con el diseño simple.
  • 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.
import numpy as np
from phonometry import metrology
# 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)
# Comportamiento clásico explícito
y = metrology.weighting_filter(recording, fs, curve="A", high_accuracy=False)
# Procesado por bloques con estado (diseño clásico, estado entre bloques)
wf = metrology.WeightingFilter(fs, "A", stateful=True)
blocks = [recording] # tu secuencia de bloques de señal
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.

8. Verificación frente a las tablas de tolerancias (IEC 61672-1, ANSI S1.4, IEC 61012)

Sección titulada «8. Verificación frente a las tablas de tolerancias (IEC 61672-1, ANSI S1.4, IEC 61012)»

verify_weighting_class comprueba un filtro de ponderación frente a los límites de aceptación de IEC 61672-1:2013 (Tabla 3). Evalúa la respuesta relativa del filtro en la frecuencia exacta en base 10 que hay detrás de cada etiqueta nominal por debajo de Nyquist (los objetivos de diseño de la Tabla 3 se calculan en , p. ej. 15 848,9 Hz para «16 kHz»; la IEC 61672-3 ensaya en esas mismas frecuencias), resta la ponderación objetivo de diseño e informa de la clase de prestaciones por frecuencia con su margen en dB. Un barrido logarítmico denso impone además el apartado 5.5.7 entre las frecuencias nominales (la desviación respecto al objetivo analítico del anexo E debe mantenerse dentro del mayor de los dos límites adyacentes, de modo que una resonancia o un notch entre nominales no puede pasar) y, cuando filas de la Tabla 3 con límite inferior finito quedan por encima de Nyquist, el veredicto se marca range_limited (atestigua solo las frecuencias comprobadas, no la conformidad completa de 10 Hz a 20 kHz):

from phonometry import metrology
result = metrology.verify_weighting_class(metrology.WeightingFilter(48000, "A"))
print(result["overall_class"]) # 1
print(result["range_limited"]) # False
print(result["between_nominals"]) # {'worst_freq': ..., 'margin_class1_db': ...}
print(result["bands"][20])
# {'freq': 1000.0, 'class': 1, 'deviation_db': 0.0, 'margin_class1_db': 0.7, 'margin_class2_db': 1.0}

La máscara de aceptación de la Tabla 3 también es pública: weighting_class_limits(1) devuelve las 34 frecuencias nominales con los límites de desviación inferior/superior (un límite inferior de -inf significa que solo se aplica el superior). Los límites cualifican la desviación respecto al objetivo de diseño, por lo que son idénticos para A, C y Z.

El mismo verificador cubre las curvas de la sección 4 que tienen tablas de tolerancias publicadas. Para B usa ANSI S1.4-1983 (objetivos de diseño de la Tabla IV, límites de la Tabla V) y los veredictos de «clase» se leen como los Tipos de instrumento 1 y 2 de la norma. Para AU usa la Tabla 1 de IEC 61012:1990 (A nominal + U nominal con las tolerancias de filtro como unidad separada, cero en la referencia de 1 kHz); IEC 61012 publica un único juego de tolerancias, así que ambos márgenes coinciden y el veredicto es simplemente conforme (1) o no (None) — ten en cuenta que comprobar las filas por encima de 20 kHz requiere fs ≥ 96 kHz (por debajo se descartan y el veredicto queda range_limited). G y D se rechazan: ISO 7196 define una única tolerancia de ±1 dB sin estructura de clases y la retirada IEC 537 no dejó tabla de tolerancias (ambas curvas se anclan numéricamente en el informe de conformidad de CI).

Desviaciones de las ponderaciones A y C a 48 kHz dentro del corredor de aceptación de clase 1 de la Tabla 3 de IEC 61672-1, con los límites más amplios de clase 2 punteadosDesviaciones de las ponderaciones A y C a 48 kHz dentro del corredor de aceptación de clase 1 de la Tabla 3 de IEC 61672-1, con los límites más amplios de clase 2 punteados

Los diseños sobremuestreados A y C (azul, morado) se mantienen cerca de desviación cero, holgadamente dentro del corredor de clase 1 (sombreado); los límites más amplios de clase 2 se muestran punteados. El corredor se ensancha en los extremos de banda donde solo se aplica un límite unilateral.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import metrology
freqs, lower1, upper1 = metrology.weighting_class_limits(1)
_, lower2, upper2 = metrology.weighting_class_limits(2)
lo1, lo2 = np.clip(lower1, -7, 7), np.clip(lower2, -7, 7)
fig, ax = plt.subplots(figsize=(10, 6.5))
ax.fill_between(freqs, lo1, upper1, step="mid", alpha=0.10,
label="Región de aceptación de clase 1")
ax.plot(freqs, upper1, drawstyle="steps-mid", label="Límite superior/inferior de clase 1")
ax.plot(freqs, lo1, drawstyle="steps-mid", color="C1")
ax.plot(freqs, upper2, ":", drawstyle="steps-mid", label="Límite superior/inferior de clase 2")
ax.plot(freqs, lo2, ":", drawstyle="steps-mid", color="C2")
for curve, marker in (("A", "o"), ("C", "s")):
bands = metrology.verify_weighting_class(metrology.WeightingFilter(48000, curve))["bands"]
f = [b["freq"] for b in bands]
dev = [b["deviation_db"] for b in bands]
ax.plot(f, dev, marker=marker, label=f"Desviación de la ponderación {curve} (48 kHz)")
ax.set(xscale="log", xlim=(10, 20000), ylim=(-7, 7),
xlabel="Frecuencia [Hz]", ylabel="Desviación respecto al objetivo de diseño [dB]")
ax.legend(fontsize=8, ncol=2)
plt.show()

Cubierto. IEC 61672-1:2013 para las curvas A, C y Z: la definición analítica del Anexo E a partir de cuatro frecuencias de esquina, el diseño high_accuracy que mantiene las tolerancias de clase 1 hasta 16 kHz, y los límites de aceptación de clase 1/clase 2 de la Tabla 3 que comprueba verify_weighting_class. ISO 7196:1995 para la curva G (valores de polo/cero de la Tabla 1, verificados frente a todos los valores nominales de la Tabla 2). ANSI S1.4-1983 para la curva histórica B (definición del Anexo C, objetivos de diseño de la Tabla IV, límites de tolerancia de la Tabla V). IEC 61012:1990 para AU (el paso bajo U de la Tabla 2 en cascada con A, verificado frente a la Tabla 1). IEC 537:1976 para la curva D de ruido de aeronaves, retirada, implementada desde su función de transferencia publicada y contrastada con dos implementaciones independientes.

No cubierto. verify_weighting_class no produce un veredicto de clase para G ni para D: ISO 7196 define una única tolerancia de ±1 dB sin estructura de clases, y la retirada IEC 537 no dejó tabla de tolerancias. Ambas curvas se fijan numéricamente frente a sus tablas publicadas en el informe de conformidad de CI en su lugar, no a través de este verificador público. B y D se ofrecen solo para datos históricos y códigos nacionales antiguos; ninguna es práctica actual (IEC 61672-1 sustituyó a B, y la certificación de ruido de aeronaves informa hoy el EPNL o niveles con ponderación A simples en lugar de D).

¿Cuándo debo usar la ponderación C en lugar de la ponderación A?

Sección titulada «¿Cuándo debo usar la ponderación C en lugar de la ponderación A?»

Usa la ponderación C para presión acústica de pico y ruido de alto nivel, y usa la diferencia como indicador del contenido en baja frecuencia: por debajo de unos 10 dB el nivel ponderado A califica el espectro con justicia, mientras que en torno a 15 a 20 dB o más la energía se concentra en las bajas frecuencias y el nivel ponderado A subestima el problema. El método HML de ISO 4869-2 se apoya exactamente en esta diferencia C menos A para la selección de protectores auditivos.

¿Qué ponderación debo usar para infrasonido por debajo de 20 Hz?

Sección titulada «¿Qué ponderación debo usar para infrasonido por debajo de 20 Hz?»

Usa la ponderación frecuencial G de ISO 7196:1995, que valora el infrasonido igual que la ponderación A valora el ruido audible. Tiene ganancia de 0 dB en 10 Hz, sube a 12 dB/octava entre 1 Hz y 20 Hz y cae a 24 dB/octava fuera de esa banda. Aplícala a fuentes como aerogeneradores, climatización y voladuras, y expresa los niveles como (o para el nivel equivalente).

¿Es precisa la ponderación A cerca de 16 kHz con una frecuencia de muestreo de 48 kHz?

Sección titulada «¿Es precisa la ponderación A cerca de 16 kHz con una frecuencia de muestreo de 48 kHz?»

No con un diseño bilineal simple: a fs = 48 kHz el error de la curva A alcanza −2,7 dB a 12,5 kHz, fuera de la tolerancia de clase 1 de IEC 61672-1 (+2,0/−2,5 dB). El high_accuracy=True por defecto sobremuestrea internamente (hasta 8×, alcanzando 144 kHz o más a frecuencias de audio habituales) y mantiene la respuesta dentro de las tolerancias de clase 1 hasta 16 kHz, con un error de aproximadamente −0,5 dB a 12,5 kHz.

  • American National Standards Institute. (1983). Specification for Sound Level Meters (ANSI S1.4-1983). La ponderación B histórica: definición analítica del Apéndice C (fórmula C2), objetivos de diseño de la Tabla IV y límites de tolerancia de la Tabla V que comprueba verify_weighting_class en la sección 8.
  • Bennett, R. L. y Pearsons, K. S. (1981). Handbook of Aircraft Noise Metrics (NASA CR-3406). NASA. Reedita la tabla de la ponderación D de IEC 537 (Tabla SLD-I) usada para anclar la respuesta D en CI.
  • Fletcher, H. y Munson, W. A. (1933). Loudness, its definition, measurement and calculation. The Journal of the Acoustical Society of America, 5(2), 82-108. https://doi.org/10.1121/1.1915637Las mediciones originales de igual sonoridad; la curva A invierte su isófona de 40 fonios (sección 1).
  • International Electrotechnical Commission. (1976). Frequency weighting for the measurement of aircraft noise (D-weighting) (IEC 537:1976 (retirada)). La ponderación D, implementada desde su función de transferencia racional publicada y contrastada con dos implementaciones independientes y con la curva tabulada reeditada en NASA CR-3406 (Tabla SLD-I).
  • International Electrotechnical Commission. (1990). Filters for the measurement of audible sound in the presence of ultrasound (IEC 61012:1990). La ponderación AU: posiciones de los polos de la ponderación U (Tabla 2), respuestas nominales y tolerancias (Tabla 1) y la definición combinada AU del apartado 2.2.
  • International Electrotechnical Commission. (2013). Electroacoustics — Sound level meters — Part 1: Specifications (IEC 61672-1:2013). Las curvas de ponderación frecuencial A, C y Z normativas (la definición analítica del Anexo E a partir de cuatro frecuencias de esquina, normalizadas a 0 dB en 1 kHz), las tolerancias de clase 1 que el diseño high_accuracy mantiene hasta 16 kHz y los límites de aceptación de clase 1 y clase 2 de la Tabla 3 que comprueba verify_weighting_class en la sección 8.
  • International Organization for Standardization. (1995). Acoustics — Frequency-weighting characteristic for infrasound measurements (ISO 7196:1995). La definición de polos y ceros de la ponderación G (Tabla 1), verificada frente a todos los valores nominales de respuesta de la Tabla 2 (0,25 Hz a 315 Hz).
  • International Organization for Standardization. (2023). Acoustics — Normal equal-loudness-level contours (ISO 226:2023). Las sucesoras modernas de las curvas de Fletcher y Munson, dibujadas en el diagrama de la sección 1.