Ir al contenido

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

phonometrypython-acoustics
SalidaEnvolvente continua con ponderación temporal (un valor por muestra)Salida escalonada (un valor cada segundos)
Unidades de entradaPresión acústica en bruto (Pa); se eleva al cuadrado internamenteSe espera la magnitud energética (Pa²) como entrada
FiltroPromediado exponencial estable (polo en )Diseño teóricamente inestable (polo en el semiplano derecho) estabilizado reiniciando el estado cada segundos
ComportamientoVerdadera ponderación temporal IECMá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.

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áfagaObjetivo 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áfagaObjetivo 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.

Respuestas de la envolvente Fast a ráfagas de 200, 50 y 10 ms alcanzando exactamente los valores de referencia de la Tabla 4 de IEC 61672-1Respuestas de la envolvente Fast a ráfagas de 200, 50 y 10 ms alcanzando exactamente los valores de referencia de la Tabla 4 de IEC 61672-1

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.

Descargar la animación (WebM)

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.

Descargar la animación (WebM)

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.

  • Si necesitas envolventes Fast/Slow/Impulse conformes con la norma (comportamiento de sonómetro, un nivel por muestra), usa time_weighting de phonometry.
  • Si necesitas un promediado por bloques para cada intervalo, esa es una métrica distinta e igualmente válida; puedes calcularla con leq sobre 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:

NormaQué se verificaArchivo de test
IEC 61672-1:2013 Tabla 3Ponderación A/C/Z en las 34 frecuencias nominales, límites de clase 1, a 48 y 96 kHztests/filters/test_iec_weighting_table3.py
IEC 61672-1:2013 Tabla 4Respuestas 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 5Respuestas de pico de un ciclo/medio ciclo de lc_peak(), límites de clase 1tests/signals/test_levels.py
IEC 61260-1:2014 Tabla 1Lí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 2Ponderación G (infrasonidos) en todos los valores nominales de respuesta, 0,25–315 Hztests/filters/test_g_weighting.py
ISO 226:2023 Tabla 1 y Anexo BLí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 1tests/psychoacoustics/loudness/test_contours.py
ECMA-418-1:2024Prominencia 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–12tests/psychoacoustics/quality/test_tonality.py
ISO 1996-1:2016lden(), ldn() y composite_rating_level() frente a valores calculados a mano con las fórmulastests/environment/assessment/test_rating.py
IEC 60942:2017 Tabla 2Límites de estabilidad a corto plazo del calibrador (dependientes de la frecuencia, clase 1) en sensitivity()tests/metrology/test_calibration_validation.py
IEC 61252:1993Las 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).

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 propio weighting.py sigue 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.