Ir al contenido

Primeros pasos

phonometry es una biblioteca de Python para la medida acústica, desde los bancos de filtros de octava fraccional y la ponderación frecuencial hasta los niveles sonoros y las métricas normalizadas. Cada métrica se verifica frente a la norma que la rige, 427 comprobaciones numéricas en total. Instálala con pip install phonometry; el primer ejemplo de abajo filtra una señal en tercios de octava y devuelve el nivel de presión acústica de cada banda.

Opción 1: Desde PyPI (recomendada)

Ventana de terminal
pip install phonometry

Extras opcionales:

Ventana de terminal
pip install phonometry[plot] # matplotlib, para gráficas de respuesta y métodos .plot() de resultados
pip install phonometry[perf] # numba, ponderación temporal 'impulse' más rápida
pip install phonometry[report] # reportlab + svglib, para que los métodos .report() generen fichas PDF normativas
pip install phonometry[full] # todos los anteriores

Opción 2: Clonar e instalar

Ventana de terminal
git clone https://github.com/jmrplens/phonometry.git
cd phonometry
pip install .

Opción 3: Submódulo de git

Ventana de terminal
git submodule add https://github.com/jmrplens/phonometry.git
# Después, instálalo en modo editable para usarlo desde tu proyecto
pip install -e ./phonometry

Todo análisis con phonometry es un subconjunto de una misma cadena: tomar la señal cruda, convertirla a unidades físicas, ponderarla en frecuencia, dividirla en bandas normalizadas, suavizarla en el tiempo y reducirla a métricas:

Cadena de procesado de phonometry: señal, calibración, ponderación frecuencial, banco de filtros de octava, ponderación temporal y métricas, con la norma verificada en cada etapaCadena de procesado de phonometry: señal, calibración, ponderación frecuencial, banco de filtros de octava, ponderación temporal y métricas, con la norma verificada en cada etapa

Cada etapa es una función o clase independiente que puedes usar por separado; las guías las recorren de izquierda a derecha (CalibraciónPonderación frecuencialBancos de filtrosPonderación temporalNiveles).

Analiza una señal y obtén el nivel de presión acústica (SPL) por banda de frecuencia.

import numpy as np
from phonometry import metrology
fs = 48000
t = np.linspace(0, 1, fs, endpoint=False)
# Señal compuesta: 100 Hz + 1000 Hz
signal = np.sin(2 * np.pi * 100 * t) + np.sin(2 * np.pi * 1000 * t)
# Aplicar el banco de filtros de 1/3 de octava
spl, freq = metrology.octave_filter(signal, fs=fs, fraction=3)
print(f"Bandas: {freq}")
# Bandas: [12.589254117941678, 15.848931924611138, ..., 19952.623149688785] (33 bandas)
print(f"SPL [dB]: {spl}")
# SPL [dB]: [46.88395351 47.96774897 49.04991279 ...] — ~90.7 dB en 100 Hz y ~90.9 dB en 1 kHz
Análisis en tercios de octava de una señal multitono con la PSD cruda de fondoAnálisis en tercios de octava de una señal multitono con la PSD cruda de fondo

Ejemplo de análisis espectral en tercios de octava de una señal compleja.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import scipy.signal
import numpy as np
from phonometry import metrology
fs = 48000
t = np.linspace(0, 1, fs, endpoint=False)
# Señal compuesta: 100 Hz + 1000 Hz
signal = np.sin(2 * np.pi * 100 * t) + np.sin(2 * np.pi * 1000 * t)
# Aplicar el banco de filtros de 1/3 de octava
spl, freq = metrology.octave_filter(signal, fs=fs, fraction=3)
# Fondo gris: la PSD de la señal cruda (Welch), desplazada justo por debajo
# de los SPL de banda para comparar ambas formas espectrales en un mismo eje.
f_psd, psd = scipy.signal.welch(signal, fs, nperseg=8192)
psd_db = 10 * np.log10(psd + 1e-12)
psd_db += np.max(spl) - np.max(psd_db) - 5
fig, ax = plt.subplots()
ax.semilogx(f_psd, psd_db, color="gray", alpha=0.6, label="PSD de la señal cruda")
ax.semilogx(freq, spl, marker="o", markerfacecolor="white",
label="Bandas de 1/3 de octava")
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel("SPL [dB]")
ax.legend()
plt.show()
from scipy.io import wavfile
from phonometry import metrology
# Cargar un archivo WAV estándar
fs, signal = wavfile.read("measurement.wav")
# Analizar
# Nota: para obtener valores SPL reales debes calibrar la entrada.
# Consulta la guía de calibración.
spl, freq = metrology.octave_filter(signal, fs=fs, fraction=3)

El audio entero (por ejemplo, datos int16 de un WAV) se convierte internamente a float64, así que es seguro pasar directamente la salida de wavfile.read.

El análisis en octavas de arriba usa el núcleo metrology, uno de los quince espacios de nombres de dominio; las secciones de la barra lateral recorren el resto, desde la psicoacústica y la acústica de salas, edificación y vibraciones hasta el ruido ambiental, aeronáutico y submarino, la electroacústica y la simulación de ondas FDTD. Cada objeto de resultado expone una figura .plot(language="en"|"es") de una línea y, cuando una norma define un formato de informe, un método .report() que genera la ficha PDF normativa.