Ir al contenido

Construye un sonómetro

Normas aplicables: IEC 61672IEC 61260IEC 60942

Un sonómetro no es un algoritmo, sino una breve cadena de ellos, e IEC 61672-1 especifica cada etapa. phonometry implementa cada etapa como una función independiente y componible; esta página las ensambla, en orden, en un sonómetro funcional. Todos los fragmentos se ejecutan tal cual (las señales se sintetizan para que la página sea autocontenida), y cada etapa enlaza con la guía de fondo que la explica por completo.

flowchart LR
    A["Tono de calibrador\n(IEC 60942)"] --> B["sensitivity()"]
    B --> C["Ponderación frecuencial\nweighting_filter('A')"]
    C --> D["Ponderación temporal\ntime_weighting('fast')"]
    D --> E["Pantalla + percentiles\nLAF(t), ln_levels"]
    C --> F["Niveles integrados\nlaeq / sel / lc_peak"]
    C -.-> G["Bandas de octava\noctave_filter (IEC 61260-1)"]
    E --> H["Informe"]
    F --> H
    G --> H

Los fragmentos de esta página se apoyan unos en otros: ejecútalos de arriba abajo en una misma sesión (o pega la página entera en un script).

Un sonómetro necesita dos grabaciones de la misma cadena de entrada: el tono de calibrador que ancla los números digitales a pascales, y la propia medición. Aquí ambas se sintetizan para que puedas ejecutar la página en cualquier parte; en una medición real proceden de tu micrófono.

import numpy as np
from phonometry import metrology
fs = 48000
# Tono de calibrador: 94 dB SPL = 1 Pa RMS a 1 kHz (IEC 60942).
# Sintetizado aquí; en campo, graba unos segundos de tu calibrador.
calibrator = np.sqrt(2) * np.sin(2 * np.pi * 1000 * np.arange(3 * fs) / fs)
# Medición "de calle": 10 s de ruido rosa de fondo más un evento de 1 s a
# 1 kHz, tipo bocina, para que los niveles estadísticos tengan algo que separar.
recording = metrology.noise_signal(fs, 10.0, color="pink", rms=0.02, seed=7)
recording[4 * fs : 5 * fs] += 0.2 * np.sqrt(2) * np.sin(
2 * np.pi * 1000 * np.arange(fs) / fs
)

2. Calibra: da significado físico a las muestras

Sección titulada «2. Calibra: da significado físico a las muestras»

Las muestras digitales son adimensionales; el factor de sensibilidad las convierte a pascales. sensitivity() lo calcula a partir de la grabación del calibrador y, de paso, valida la estabilidad a corto plazo de la grabación igual que IEC 60942 cualifica el propio calibrador, de modo que un micrófono mal acoplado se detecta aquí en lugar de corromper todos los niveles posteriores.

cal = metrology.sensitivity(calibrator, target_spl=94.0, fs=fs)
# cal está en Pa por unidad digital; todas las funciones de nivel lo aceptan
# como calibration_factor. Para este tono sintético vale ≈1,0.

Guía de fondo: Calibración y dBFS, que cubre también la calibración desde una sensibilidad de micrófono conocida y el modo digital dBFS que se usa cuando no existe referencia física.

3. Pondera: frecuencia y tiempo (IEC 61672-1)

Sección titulada «3. Pondera: frecuencia y tiempo (IEC 61672-1)»

El sonómetro nunca muestra la presión en bruto. La señal pasa primero por la ponderación frecuencial A (la curva de respuesta del oído de IEC 61672-1), se eleva al cuadrado y se suaviza con el detector exponencial Fast (constante de tiempo de 125 ms). El resultado es el nivel móvil que sigue la pantalla de un sonómetro, LAF(t):

pressure = cal * recording # unidades digitales -> Pa
weighted = metrology.weighting_filter(pressure, fs, curve="A")
envelope = metrology.time_weighting(weighted, fs, mode="fast") # media cuadrática en Pa^2
laf_t = 10 * np.log10(np.maximum(envelope, 1e-12) / (2e-5) ** 2)
# laf_t alcanza unos 80 dB durante el evento y se asienta cerca de 55 dB entre medias.

Rara vez escribirás esta cadena a mano: todas las funciones de nivel del paso siguiente aplican la ponderación frecuencial internamente, y los niveles percentiles reconstruyen por ti esta envolvente Fast. Las métricas de energía (Leq, SEL) integran directamente la señal ponderada al cuadrado, sin balística, exactamente como hace un sonómetro. La cadena se muestra aquí porque es la pantalla del sonómetro.

Guías de fondo: Ponderación frecuencial (A, C, G, Z) y Ponderación temporal.

4. Integra: los números que reporta un sonómetro

Sección titulada «4. Integra: los números que reporta un sonómetro»

Una sola pasada sobre la grabación calibrada produce las lecturas estándar: el LAeq equivalente en energía, los niveles percentiles que describen cómo fluctuó el nivel (L90 es el fondo, L10 los eventos), el nivel de exposición sonora que normaliza el evento a un segundo, y el pico con ponderación C para contenido impulsivo.

la_eq = metrology.laeq(recording, fs, calibration_factor=cal) # ≈70,2 dB
ln = metrology.ln_levels(
recording, fs, n=(10, 50, 90), weighting="A", calibration_factor=cal
) # L10 ≈78,0, L50 ≈55,1, L90 ≈54,9
lae = metrology.sel(recording, fs, weighting="A", calibration_factor=cal) # ≈80,2
lc_pk = metrology.lc_peak(recording, fs, calibration_factor=cal) # ≈84,4
print(f"LAeq {la_eq:.1f} dB | L10 {ln[10]:.1f} | L90 {ln[90]:.1f} "
f"| LAE {lae:.1f} | LCpeak {lc_pk:.1f}")

Fíjate en la aritmética que codifican los números: el evento de 1 s domina el LAeq (está 25 dB por encima del fondo, mucho más de los 10 dB que el fondo, nueve veces más largo, recupera por duración), el LAE es el LAeq más 10 log10 de los 10 s de duración, y el L90 apenas nota el evento.

Guía de fondo: Niveles integrados y estadísticos, que añade dosis de ruido, Lden y niveles de valoración, y espectrogramas de octava.

5. Filtra en bandas: la vista de espectro (IEC 61260-1)

Sección titulada «5. Filtra en bandas: la vista de espectro (IEC 61260-1)»

Un sonómetro de clase 1 con juego de filtros reporta niveles por banda. octave_filter descompone la señal calibrada en bandas de octava fraccional cuyo diseño está anclado a los bordes de banda de IEC 61260-1; nominal=True las etiqueta con las frecuencias preferentes que leerías en un instrumento.

spl, bands = metrology.octave_filter(
recording, fs, fraction=3, calibration_factor=cal, nominal=True
)
# 33 niveles de banda de tercio de octava en dB SPL, etiquetados '12.5' ... '20k'.
# La banda '1k' contiene el evento: ≈70 dB, con sus vecinas ≈25 dB por debajo.
print(dict(zip(bands, np.round(spl, 1))))

Guías de fondo: Bancos de filtros para las arquitecturas de filtro y el modo de fase cero, Procesado por bloques para streaming, y Multicanal y rendimiento para arrays.

6. Verifica: ¿es este sonómetro de clase 1?

Sección titulada «6. Verifica: ¿es este sonómetro de clase 1?»

Un instrumento real solo es un “sonómetro de clase 1” cuando sus ponderaciones y filtros superan los límites de aceptación de las normas. La biblioteca incluye los mismos verificadores que se aplica a sí misma en CI: verify_weighting_class barre un WeightingFilter contra los límites de la Tabla 3 de IEC 61672-1, y verify_filter_class barre un OctaveFilterBank contra los límites de la Tabla 1 de IEC 61260-1.

wf = metrology.WeightingFilter(fs, curve="A")
print(metrology.verify_weighting_class(wf)["overall_class"]) # 1
bank = metrology.OctaveFilterBank(fs, fraction=3)
print(metrology.verify_filter_class(bank)["overall_class"]) # 1

Los veredictos también llegan por banda, de modo que puedes ver exactamente dónde un diseño se saldría de su pasillo de clase. Guías de fondo: Ponderación frecuencial (sección de verificación de clase) y Bancos de filtros (conformidad de clase).

El sonómetro construido aquí es el tronco; el resto del núcleo crece de él.

Cubierto. Esta página compone etapas ya implementadas en otras guías en la cadena que describe IEC 61672-1:2013: la ponderación frecuencial A y la ponderación temporal exponencial Fast, el LAeq, los niveles percentiles, el nivel de exposición sonora y el pico con ponderación C, los filtros de banda de octava de IEC 61260-1:2014 de octave_filter, y los límites de aceptación de clase de la Tabla 3 (ponderación) y la Tabla 1 (filtro) que comprueban verify_weighting_class y verify_filter_class. Cada guía de fondo indica su propia cobertura en detalle.

No cubierto. verify_weighting_class y verify_filter_class comprueban el diseño de respuesta en frecuencia de los filtros digitales frente a las tablas de las normas; no realizan los ensayos de evaluación de patrón de IEC 61672-3 que necesita un instrumento físico para su aprobación de tipo, como el ruido autogenerado, el rango de linealidad, la indicación de sobrecarga o la respuesta direccional. Un veredicto de clase de esta página describe el algoritmo, no un aparato construido. Los ensayos de conformidad del calibrador de IEC 60942:2017 tampoco se ejecutan aquí; consulta la guía de calibración para lo que sensitivity() comprueba y lo que no.

  • International Electrotechnical Commission. (2013). Electroacoustics — Sound level meters — Part 1: Specifications (IEC 61672-1:2013). El plano del instrumento montado en esta página: la ponderación frecuencial A y la ponderación temporal exponencial Fast de la cadena de niveles, el pico con ponderación C y el nivel de exposición sonora, y los límites de aceptación de clase de la Tabla 3 que comprueba verify_weighting_class.
  • International Electrotechnical Commission. (2014). Electroacoustics — Octave-band and fractional-octave-band filters — Part 1: Specifications (IEC 61260-1:2014). Los filtros de bandas de octava fraccional de la etapa de espectro, y los límites de aceptación de clase de la Tabla 1 que comprueba verify_filter_class.
  • International Electrotechnical Commission. (2017). Electroacoustics — Sound calibrators (IEC 60942:2017). El calibrador acústico que asume la etapa de sensibilidad: el nivel principal de 94 dB y la comprobación de estabilidad a corto plazo aplicada a la grabación de referencia.