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 incidencia #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 ().
| phonometry | python-acoustics | |
|---|---|---|
| Salida | Envolvente continua con ponderación temporal (un valor por muestra) | Salida escalonada (un valor cada segundos) |
| Unidades de entrada | Presión acústica en bruto (Pa); se eleva al cuadrado internamente | Se espera la magnitud energética (Pa²) como entrada |
| Filtro | Promediado exponencial estable (polo en ) | Diseño teóricamente inestable (polo en el semiplano derecho) estabilizado reiniciando el estado cada segundos |
| Comportamiento | Verdadera ponderación temporal IEC | Más cercano a un integrador por bloques () |
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. Un polo en el eje real positivo crece sin límite; el reinicio por bloques lo oculta, pero 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 no contiene ningún , 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 3 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 |
Resultados de python-acoustics (ponderación Fast, pasando la señal al cuadrado como requiere esa biblioteca):
| Duración de la ráfaga | Objetivo IEC (dB) | Límite clase 1 (dB) | python-acoustics (dB) | Error (dB) | Estado |
|---|---|---|---|---|---|
| 200 ms | −1,0 | ±0,5 | −0,97 | +0,03 | ✅ CUMPLE |
| 50 ms | −4,8 | ±1,0 | −3,93 | +0,87 | ✅ CUMPLE |
| 10 ms | −11,1 | ±1,0 | −10,90 | +0,20 | ✅ CUMPLE |
| 1 ms | −21,0 | +1,0 / −2,0 | −20,90 | +0,10 | ✅ CUMPLE |
Las dos bibliotecas pasan todas las filas mostradas, y decir lo contrario sería exagerar: lo que importa aquí es la forma del error, no un incumplimiento. phonometry se mantiene a menos de 0,05 dB de la referencia de la Tabla 4 en todas las duraciones, menos del 5 % del margen de clase 1, porque a un detector exponencial continuo no le queda ningún parámetro libre que equivocar. El integrador por bloques también se queda dentro de clase 1, pero gasta 0,87 de los 1,0 dB disponibles a 50 ms, y los gasta por un motivo que es suerte y no diseño: cómo se reparte la ráfaga a caballo de un bloque de 125 ms. Lee las dos tablas junto a la primera columna de la Tabla 4, que se estrecha a ±0,5 dB para ráfagas de 200 ms y más largas: en ese extremo a un integrador por bloques no le queda 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 primera tabla, de modo
que las filas de phonometry 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 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 incidencia #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 un 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() | 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 536 comprobaciones numéricas de conformidad en 57 dominios y 365 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 se mantiene dentro de las tolerancias de clase 1 hasta 16 kHz a las frecuencias de muestreo habituales gracias al sobremuestreo interno (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 88, 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»- python-acoustics se archivó en febrero de 2024 y ya no se mantiene; la comparación de arriba se ejecutó contra su última versión publicada.
- acoustic-toolbox, el sucesor comunitario de python-acoustics, construye
sus ponderaciones temporal y frecuencial de IEC 61672-1 sobre
pyoctaveband, el nombre anterior de esta biblioteca, que desde la 2.1.0 es un envoltorio sobre phonometry. Solo toma de aquí los filtros: su propioweighting.pysigue llevando tablas de ponderación A y C por tercios de octava escritas directamente en el código. - MoSQITo se centra en métricas psicoacústicas de calidad sonora y ya cubre buena parte de ese terreno: sonoridad de Zwicker, sonoridad y aspereza de ECMA-418-2, agudeza de DIN 45692, relaciones tono-ruido y de prominencia de ECMA-74 y el índice de inteligibilidad del habla de ANSI S3.5. phonometry implementa esa misma familia y 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, que MoSQITo no expone. Lo que más cambia es el entorno. Aquí esas métricas viven en la misma batería de conformidad que el núcleo de metrología y se componen directamente con los filtros de ponderación, la balística, el filtrado por bandas y la calibración que las alimentan.
- pyroomacoustics simula respuestas al impulso de salas para cadenas de
audio y aprendizaje automático (fuentes imagen, trazado de rayos,
conformación de haz, estimación de la dirección de llegada), y también llega
al lado de la medición, con adquisición de la respuesta al impulso por barrido
y un estimador de RT60. Lo que no lleva es el juego de parámetros de
ISO 3382. Los modelos de fuentes imagen y FDTD de phonometry están fijados a
formas cerradas publicadas, y la respuesta al impulso de fuentes imagen 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.