Por qué phonometry
phonometry es un conjunto de herramientas de medición acústica basado en normas. Su elemento diferenciador no es la lista de funcionalidades, sino cómo están construidas: cada métrica se implementa a partir del texto de la norma que la rige, y los valores de referencia y límites de aceptación de la propia norma se transcriben a la batería de tests y se exigen en CI. Esta página explica ese enfoque con un caso de estudio concreto (la ponderación temporal según IEC 61672-1:2013) y resume qué está verificado por conformidad hoy. El análisis de la ponderación temporal se publicó originalmente en la issue #38.
Filosofía de diseño: un caso de estudio sobre la ponderación temporal
Sección titulada «Filosofía de diseño: un caso de estudio sobre la ponderación temporal»La ponderación temporal estándar se define como una función continua del tiempo mediante la ecuación diferencial
que corresponde a un filtro paso bajo estable de primer orden con un polo en el semiplano izquierdo (). Vale la pena poner ese detector al lado de la otra cosa con la que a veces se calcula una lectura Fast, un promedio de energía que se reinicia cada segundos, porque los dos se confunden con facilidad y responden a preguntas distintas:
| Detector exponencial (IEC 61672-1) | Integrador por bloques | |
|---|---|---|
| Salida | Envolvente continua con ponderación temporal, un valor por muestra | Escalonada, un valor por bloque |
| Mecanismo | Promediado exponencial estable, polo en | Un promedio de energía reiniciado cada segundos; está en su reloj, no en su respuesta |
| Qué mide | El nivel Fast/Slow/Impulse de la norma | , energía por intervalo |
Un polo en el eje real negativo corresponde a una respuesta al impulso exponencial decreciente (), exactamente lo que significa «ponderación temporal exponencial»: los eventos pasados se olvidan exponencialmente. Una implementación que en cambio acumule energía y se reinicie cada segundos ha construido el integrador por bloques, se llame como se llame, y una que coloque el polo en el eje real positivo antes del mismo reinicio añade además un peso creciente dentro de cada bloque: ninguna de las dos es la ponderación temporal, porque el reinicio cambia la naturaleza de la medición.
De esa ecuación salen además los valores de referencia del apartado siguiente, y vale la pena deducirlos una vez en lugar de dar por buena la Tabla 4. Intégrala partiendo del reposo sobre una ráfaga de duración y la envolvente alcanza del valor estacionario que acabaría produciendo ese mismo tono, así que el nivel máximo con ponderación temporal respecto del régimen estacionario es
que es la Ecuación (7) de IEC 61672-1:2013. Con s da
−0,98 dB a 200 ms, −4,82 dB a 50 ms, −11,14 dB a 10 ms y −20,99 dB a
1 ms: la columna «Objetivo IEC» entera de la Tabla 4, con el redondeo de la
propia norma. La CI exige la identidad en todas las filas de Fast y Slow
(test_delta_ref_equation7_consistency, con una tolerancia de 0,15 dB), de
modo que la transcripción de la tabla está comprobada y no dada por buena.
La consecuencia sostiene el resto de esta página. Como la respuesta es una función suave de , un detector que resuelva de verdad la ecuación sigue la columna entera de una vez; un detector que promedia sobre bloques fijos de 125 ms responde con la parte de la energía de la ráfaga que caiga en cada bloque, que se mueve con la duración y con la alineación por igual pero no lleva nada de la respuesta , y solo puede acertar allí donde la ráfaga llene un bloque por casualidad.
Verificación frente a IEC 61672-1 (ráfagas tonales)
Sección titulada «Verificación frente a IEC 61672-1 (ráfagas tonales)»La prueba rigurosa para la ponderación temporal es la respuesta a ráfaga tonal (IEC 61672-1, Tabla 4), usando una ráfaga sinusoidal de 4 kHz referida al nivel de régimen estacionario.
Cómo se ejecuta la comprobación
Sección titulada «Cómo se ejecuta la comprobación»La Tabla 4 fija la excitación pero no el montaje, así que aquí va el montaje. Se
genera una sinusoide de 4 kHz a 48 kHz durante 2 s. La referencia es el nivel
Fast estacionario de esa sinusoide continua, promediado sobre su último medio
segundo: una vez asentado el integrador, este es el en la notación de la
norma. Después se recorta de esa misma sinusoide la ráfaga de la duración
indicada, de modo que su fase y su amplitud son idénticas a las del tono de
referencia, y se rodea de ceros. La respuesta es el máximo de la envolvente
Fast de esa ráfaga, expresado respecto de la referencia:
, que es el de la
norma. Fíjate en qué verifica y qué no: la IEC 61672-1 enuncia estos límites
para el dispositivo de entrada eléctrica sobre un rango definido de niveles
estacionarios y sin indicación de sobrecarga (apartados 5.9.5-5.9.6), así que
los números de abajo verifican la balística, no un instrumento completo. Los
mismos valores de referencia están transcritos en
tests/filters/test_iec_compliance.py para F y S y para la columna .
Resultados de phonometry (ponderación Fast):
| Duración de la ráfaga | Objetivo IEC (dB) | Límite clase 1 (dB) | phonometry (dB) | Error (dB) | Estado |
|---|---|---|---|---|---|
| 200 ms | −1,0 | ±0,5 | −0,98 | +0,02 | Cumple |
| 50 ms | −4,8 | ±1,0 | −4,82 | −0,02 | Cumple |
| 10 ms | −11,1 | ±1,0 | −11,14 | −0,04 | Cumple |
| 1 ms | −21,0 | +1,0 / −2,0 | −20,99 | +0,01 | Cumple |
El detector exponencial se mantiene a menos de 0,05 dB de la referencia de la Tabla 4 en todas las duraciones, y ninguna fila gasta más del 4 % de su propio margen de clase 1, porque a un detector que resuelve la ecuación que define la magnitud no le queda ningún parámetro libre que equivocar. Un integrador por bloques también puede quedar dentro de clase 1 con una alineación favorable, pero lo que gasta del margen lo decide cómo se reparta la ráfaga a caballo de un bloque de 125 ms, que es suerte y no diseño; y la primera columna de la Tabla 4 se estrecha a ±0,5 dB para ráfagas de 200 ms y más largas, donde queda poco margen que perder.
Envolventes Fast medidas (azul) que coinciden con los valores de referencia de la Tabla 4 (discontinua) con un margen de 0,1 dB para ráfagas de 200/50/10 ms.
El generador que hay detrás de esta figura es
scripts/figures/signals.py::generate_tone_burst_iec, y es el procedimiento
descrito arriba con tres de las filas de la Tabla 4: imprime
env_db.max() - target, que es la columna Error de la tabla, de modo
que las filas se pueden reproducir directamente.
La figura fija la ráfaga en un instante concreto, que es justo aquello de lo que depende la respuesta del integrador por bloques y no la del detector exponencial. Desliza esa misma ráfaga a través de una frontera de bloque de 125 ms y las dos se comportan de forma bien distinta: la lectura exponencial queda clavada en −4,82 dB sea cual sea la alineación, con una dispersión de 0,001 dB, mientras que la lectura por bloques oscila 2,94 dB y se sale del corredor de clase 1 en el 12 % de las alineaciones. A 200 ms, donde la Tabla 4 se estrecha a ±0,5 dB, el integrador por bloques queda fuera del corredor en el 81 % de ellas, porque una ráfaga de 200 ms siempre llena al menos parte de un bloque y a menudo llena uno entero, y un bloque lleno lee el nivel estacionario, 1,0 dB por encima del objetivo.
Una ráfaga tonal de 4 kHz se desliza a través de la frontera entre dos bloques de integración de 125 ms. La envolvente exponencial Fast alcanza el mismo máximo en todas las alineaciones porque la duración de la ráfaga entra en su ecuación diferencial, mientras que la escalera del Leq por bloques sube y baja según dónde vaya cayendo la ráfaga, y el panel de lectura frente a alineación va construyendo las dos trazas sobre el corredor de clase 1 sombreado. El segundo acto lo repite con una ráfaga de 200 ms, donde el corredor tiene la mitad de anchura.
Una ráfaga tonal de 4 kHz se desliza a través de la frontera entre dos bloques de integración de 125 ms. La envolvente exponencial Fast alcanza el mismo máximo en todas las alineaciones porque la duración de la ráfaga entra en su ecuación diferencial, mientras que la escalera del Leq por bloques sube y baja según dónde vaya cayendo la ráfaga, y el panel de lectura frente a alineación va construyendo las dos trazas sobre el corredor de clase 1 sombreado. El segundo acto lo repite con una ráfaga de 200 ms, donde el corredor tiene la mitad de anchura.
La traza exponencial es plana porque contiene
y nada del reloj; la traza por bloques, a esta duración
fija, es un retrato de la alineación y de nada más. Las dos lecturas se calculan aquí con
time_weighting(x, fs, mode="fast") y con leq sobre segmentos consecutivos
de 125 ms, frente a la misma referencia de tono estacionario que define el
procedimiento de arriba.
Qué significa esto en la práctica
Sección titulada «Qué significa esto en la práctica»- Si necesitas envolventes Fast/Slow/Impulse conformes con la norma
(comportamiento de sonómetro, un nivel por muestra), usa
time_weightingde phonometry. - Si necesitas un promediado por bloques para cada intervalo, esa
es una métrica distinta e igualmente válida; puedes calcularla con
leqsobre segmentos consecutivos. - Ambos enfoques son útiles; simplemente responden a preguntas distintas. La discrepancia descrita en la issue #38 proviene de comparar una envolvente continua con un integrador por bloques, no de un error de implementación.
Verificación por conformidad en toda la biblioteca
Sección titulada «Verificación por conformidad en toda la biblioteca»Una nota sobre qué es una clase de prestaciones, ya que todos los veredictos de esta página lo son. En IEC 61672-1 e IEC 61260-1 una clase no es un grado de exactitud, sino un corredor de tolerancia con nombre alrededor de una respuesta nominal: la clase 1 es el corredor estrecho, pensado para trabajo de precisión, y la clase 2 el ancho, para reconocimientos generales, y los dos se ensanchan en los extremos del rango de frecuencias, que es donde más cuesta cumplirlos. La clase 0 era un corredor todavía más estrecho, de la edición retirada de 1995 de IEC 61260, y aquí se mantiene como objetivo adicional voluntario para el banco Butterworth por defecto. Así que «cumple» en esta página significa que la respuesta calculada no se sale nunca del corredor que dibuja la norma; no significa que el error sea cero, y el tamaño del margen es el número interesante.
El caso de las ráfagas tonales de arriba no es una comprobación aislada. Para cada norma que la biblioteca implementa, los valores de referencia y los límites de aceptación se transcriben del texto oficial a la batería de tests, de modo que cualquier regresión hace fallar la CI. Una muestra del núcleo de metrología:
| Norma | Qué se verifica | Archivo de test |
|---|---|---|
| IEC 61672-1:2013 Tabla 3 | Ponderación A/C/Z en las 34 frecuencias nominales, límites de clase 1, a 48 y 96 kHz | tests/filters/test_iec_weighting_table3.py |
| IEC 61672-1:2013 Tabla 4 | Respuestas F/S a ráfagas tonales (de 1 s a 1 ms) y la columna para sel() | tests/filters/test_iec_compliance.py |
| IEC 61672-1:2013 Tabla 5 | Respuestas de pico de un ciclo/medio ciclo de lc_peak(), límites de clase 1 | tests/signals/test_levels.py |
| IEC 61260-1:2014 Tabla 1 | Límites de aceptación de clase 1/2 del banco de filtros mediante verify_filter_class() | tests/filters/test_compliance.py |
| ISO 7196:1995 Tabla 2 | Ponderación G (infrasonidos) en todos los valores nominales de respuesta, 0,25–315 Hz | tests/filters/test_g_weighting.py |
| ISO 226:2023 Tabla 1 y Anexo B | Líneas isofónicas y niveles de sonoridad frente a las tablas del Anexo B, umbral de audición frente a los parámetros de la Tabla 1 | tests/psychoacoustics/loudness/test_contours.py |
| ECMA-418-1:2024 | Prominencia tonal TNR/PR: anchos de banda críticos, separación de proximidad y criterios de prominencia frente a los ejemplos resueltos de los apartados 10–12 | tests/psychoacoustics/quality/test_tonality.py |
| ISO 1996-1:2016 | lden(), ldn() y composite_rating_level() frente a valores calculados a mano con las fórmulas | tests/environment/assessment/test_rating.py |
| IEC 60942:2017 Tabla 2 | Límites de estabilidad a corto plazo del calibrador (dependientes de la frecuencia, clase 1) en sensitivity() | tests/metrology/test_calibration_validation.py |
| IEC 61252:1993 | Las magnitudes de exposición sonora personal, sound_exposure() y el nivel normalizado a 8 h lex_8h(); IEC 61252:2025 ha sustituido desde entonces esa impresión, y la transcripción sigue apuntando al texto de 1993+A2 | tests/signals/test_levels.py |
La misma disciplina se aplica mucho más allá del núcleo de metrología: hoy la batería ejecuta 778 comprobaciones numéricas de conformidad en 66 dominios y 391 normas, que abarcan la psicoacústica y la inteligibilidad del habla, la acústica de salas, edificación y materiales, la vibración humana y de máquinas, el ruido ambiental, el de aeronaves y helicópteros y el submarino, la electroacústica, la sonoridad de programa, el control de ruido industrial, el análisis espectral calibrado y la simulación FDTD de ondas. El informe numérico completo (el valor esperado y el valor que calcula la biblioteca para cada comprobación, regenerado en cada pull request) está publicado como informe de conformidad.
La misma costumbre de «primero la norma» aparece por debajo del nivel de las métricas completas, en la parte numérica. Los bancos de filtros sitúan sus puntos de −3 dB en los bordes de banda de ANSI S1.11 / IEC 61260-1 para las tres arquitecturas cuya parametrización lo permite, Butterworth, Chebyshev II y Bessel, las dos últimas mediante correcciones que la parametrización en bruto de scipy no aplicaría; Chebyshev I y el elíptico leen esos mismos bordes como su borde de banda de paso con rizado constante, algo que se declara con su coste medido en Bancos de filtros. El banco Butterworth por defecto se verifica también frente a la clase 0, más estricta, de la edición retirada IEC 61260:1995 / ANSI S1.11-2004 además de frente a la clase 1 vigente. Y la ponderación A/C obtiene la clase 1 en cada una de las ocho frecuencias de muestreo a las que la batería la califica, de 8 a 192 kHz, en todas las frecuencias de la Tabla 3 por debajo del Nyquist de cada una, porque el prototipo analógico se ajusta a la frecuencia de muestreo en lugar de transformarse a ciegas (consulta Ponderación frecuencial).
Cuando lo que está mal es la fuente
Sección titulada «Cuando lo que está mal es la fuente»Transcribir una norma en lugar de portar el código de otra persona tiene una consecuencia que solo aparece a gran escala: antes o después el valor recalculado y el impreso no coinciden, y a veces es el impreso el que no puede ser correcto. Un ejemplo resuelto que contradice su propio apartado normativo, una constante a la que la composición tipográfica le comió un dígito, una referencia cruzada que apunta a la ecuación equivocada.
Esos casos no se parchean en silencio. Cada caso confirmado queda registrado en las erratas de las fuentes publicadas con la edición impresa y el punto exacto, lo que dice el documento, por qué no puede ser correcto, la evidencia independiente y la lectura que implementa la biblioteca. Cuando esa lectura cambia algún número que la biblioteca da, la entrada nombra la comprobación o el test que lo fija; cuando no lo cambia, porque el defecto es una etiqueta, una referencia cruzada o una tabla que la biblioteca nunca lee, la entrada lo dice así. Ya son 135, entre normas, documentos de guía, libros y artículos de revista, cada uno marcado como notificado al organismo emisor o no. Un defecto listado ahí nunca es un defecto del método: en todos los casos la lectura pretendida se ha podido establecer a partir del propio documento o de la física.
Ese registro es la parte del enfoque más difícil de fingir. El código portado desde otra implementación hereda lo que la errata le hiciera hacer, y nada en él llega a notarlo nunca.
Dónde encaja phonometry en el ecosistema Python
Sección titulada «Dónde encaja phonometry en el ecosistema Python»Varios proyectos de Python comparten terreno con phonometry, y la manera honesta de situarlos es por aquello para lo que está construido cada uno, no echando carreras entre ellos:
- acoustic-toolbox es el sucesor comunitario de python-acoustics, que se
archivó en febrero de 2024. Es un conjunto de herramientas de acústica
general, y sus ponderaciones temporal y frecuencial de IEC 61672-1 se
apoyan en
pyoctaveband, el nombre anterior de esta biblioteca, que desde la 2.1.0 es un envoltorio sobre phonometry. - MoSQITo es la implementación abierta de referencia de las métricas psicoacústicas de calidad sonora: sonoridad de Zwicker, sonoridad y aspereza de ECMA-418-2, agudeza de DIN 45692, relaciones tono-ruido y de prominencia de ECMA-74, el índice de inteligibilidad del habla de ANSI S3.5. phonometry implementa esa misma familia, añade la sonoridad de ISO 532-2 e ISO 532-3, la tonalidad de ECMA-418-2, la intensidad de fluctuación y el modelo de molestia psicoacústica de Fastl y Zwicker, y las asienta en la misma batería de conformidad que el núcleo de metrología, compuestas directamente con los filtros de ponderación, la balística, el filtrado por bandas y la calibración que las alimentan.
- pyroomacoustics está construido para simular salas en cadenas de audio
y aprendizaje automático: fuentes imagen, trazado de rayos, conformación de
haz, estimación de la dirección de llegada, más la adquisición de respuestas
al impulso por barrido. El lado de salas de phonometry es el de la medición:
sus modelos de fuentes imagen y FDTD están fijados a formas cerradas
publicadas, y una respuesta al impulso simulada pasa por el mismo análisis
de
room_parameters(EDT, T20, T30, C50, C80, D50, Ts, por bandas, con los indicadores de validez del rango de decaimiento de ISO 3382) que una medida.
Si tu trabajo necesita números que puedas defender frente a la tabla de
tolerancias de una norma, ya sea para informes de medición, evaluaciones
ambientales o contrastes con instrumentos, esa capa de verificación es la razón
de ser de phonometry. Y cuando la norma fija además cómo debe presentarse el
resultado, el propio objeto de resultado renderiza esa ficha de una página con
.report(), en inglés o en español, de modo que el documento que entregas
lleva los mismos números que la comprobación. Las fuentes que sustentan todo
ello están reunidas en la
Bibliografía, cada entrada con un
DOI verificado o un enlace oficial del editor.