Ir al contenido

Referencia de la API

Toda la funcionalidad principal puede importarse directamente del paquete phonometry.

NombreTipoDescripción (entradas)Uso (salidas)
octavefilterfunciónAnálisis de alto nivel.
x: array de señal
fs: frecuencia de muestreo [Hz]
fraction: 1, 3, etc. (def.: 1)
order: orden del filtro (def.: 6)
limits: [f_min, f_max] (def.: [12, 20000])
filter_type: ‘butter’, ‘cheby1’, ‘cheby2’, ‘ellip’, ‘bessel’ (def.: ‘butter’)
sigbands: devolver señales por banda (def.: False)
detrend: eliminar offset DC (def.: True)
calibration_factor: multiplicador de sensibilidad (def.: 1.0)
dbfs: salida en dBFS en lugar de dB SPL (def.: False)
mode: ‘rms’ o ‘peak’ (def.: ‘rms’)
nominal: etiquetas nominales IEC 61260-1 (def.: False)
show / plot_file: gráfica de respuesta
ripple: rizado de banda de paso [dB] (cheby1/ellip)
attenuation: atenuación de banda atenuada [dB] (cheby2/ellip)
spl, freq = octavefilter(x, fs, ...)
spl: niveles [dB]
freq: frecuencias [Hz]

Con sigbands=True:
spl, freq, xb = octavefilter(x, fs, sigbands=True)
xb: lista de señales filtradas (una por banda)

Uso calibrado:
spl, f = octavefilter(x, fs, calibration_factor=0.05)
OctaveFilterBankclaseBanco eficiente reutilizable.
fs: frecuencia de muestreo [Hz]
fraction: 1, 3, etc.
order: orden del filtro
limits: [f_min, f_max] (def.: [12, 20000])
filter_type: arquitectura
show / plot_file: gráfica de respuesta
calibration_factor: multiplicador de sensibilidad
dbfs: usar dBFS (def.: False)
stateful: conservar estado entre llamadas (def.: False)
steady_ic: condiciones iniciales de régimen permanente (def.: False)
resample: diezmado multitasa (def.: True)
ripple / attenuation: parámetros de diseño [dB]
bank = OctaveFilterBank(fs=48000, fraction=3, order=6, filter_type='butter')
spl, f = bank.filter(x, sigbands=False, mode='rms', detrend=True, zero_phase=False)

bank.freq / bank.freq_d / bank.freq_u / bank.sos: propiedades calculadas
OctaveFilterBank.spectrogrammétodoNiveles por banda vs tiempo.
x: array de señal (1D o 2D)
window_time: longitud de ventana [s] (def.: 0.125)
overlap: fracción en [0, 1) (def.: 0.5)
mode: ‘rms’ o ‘peak’
zero_phase: ventanas sin retardo de grupo (def.: False)
levels, freq, times = bank.spectrogram(x)

levels: (bandas, ventanas) o (canales, bandas, ventanas)
times: centros de ventana [s]
weighting_filterfunciónPonderación acústica.
x: array de señal
fs: frecuencia de muestreo [Hz]
curve: ‘A’, ‘C’, ‘G’ (infrasonido ISO 7196) o ‘Z’ (def.: ‘A’)
high_accuracy: precisión clase 1 en HF por sobremuestreo interno (def.: True)
y = weighting_filter(x, fs, curve='A')

y: señal ponderada
WeightingFilterclaseFiltro de ponderación reutilizable.
fs: frecuencia de muestreo [Hz]
curve: ‘A’, ‘C’, ‘G’ o ‘Z’
stateful: procesado por bloques (def.: False)
steady_ic: condiciones iniciales de régimen permanente (def.: False)
high_accuracy: True por defecto salvo en stateful
wf = WeightingFilter(fs, 'A')
y = wf.filter(x)
time_weightingfunciónCaptura de energía.
x: señal cruda (se eleva al cuadrado internamente; el tiempo es el último eje)
fs: frecuencia de muestreo [Hz]
mode: ‘fast’, ‘slow’ o ‘impulse’
initial_state: None, ‘zero’, ‘first’, escalar o array (def.: None)
env = time_weighting(x, fs, mode='fast')

env: envolvente de energía (valor cuadrático medio), misma forma que x
TimeWeightingclasePonderación temporal con estado.
fs: frecuencia de muestreo [Hz]
mode: ‘fast’, ‘slow’, ‘impulse’ (def.: ‘fast’)
tw = TimeWeighting(fs, mode='fast')
env = tw.process(block) por bloque
tw.reset() para reiniciar
leqfunciónNivel equivalente (Leq).
x: array de señal (1D o 2D)
calibration_factor: multiplicador de sensibilidad (def.: 1.0)
dbfs: salida en dBFS (def.: False)
level = leq(x, calibration_factor=s)

level: escalar (1D) o array por canal (2D)
laeqfunciónLeq ponderado A (LAeq).
x: array de señal (1D o 2D)
fs: frecuencia de muestreo [Hz]
calibration_factor / dbfs: como leq
level = laeq(x, fs, calibration_factor=s)

level: escalar (1D) o array por canal (2D)
ln_levelsfunciónNiveles estadísticos (LN).
x: array de señal (1D o 2D)
fs: frecuencia de muestreo [Hz]
n: percentiles de excedencia (def.: (10, 50, 90))
mode: ‘fast’, ‘slow’, ‘impulse’ (def.: ‘fast’)
weighting: ‘A’, ‘C’, ‘G’, ‘Z’ o None (def.: None)
calibration_factor / dbfs: como leq
stats = ln_levels(x, fs, n=(10, 50, 90), weighting='A')

stats: dict {10: L10, 50: L50, 90: L90}
lc_peakfunciónPico ponderado C (LCpeak).
x: array de señal (1D o 2D)
fs: frecuencia de muestreo [Hz]
calibration_factor: como leq
dbfs: 0 dBFS = pico a fondo de escala (amplitud 1,0), a diferencia de la referencia RMS de leq
peak = lc_peak(x, fs)

• IEC 61672-1 §5.13; verificado contra la Tabla 5
selfunciónNivel de exposición sonora (SEL/LAE).
x: señal del evento completo (1D o 2D)
fs: frecuencia de muestreo [Hz]
weighting: ‘A’, ‘C’, ‘G’, ‘Z’ o None (def.: None)
calibration_factor / dbfs: como leq
lae = sel(x, fs, weighting='A')

• Nivel del evento normalizado a 1 s
sound_exposurefunciónExposición sonora E (IEC 61252).
x: señal (1D o 2D)
fs: frecuencia de muestreo [Hz]
duration_hours: periodo de exposición representado (def.: duración de la grabación)
calibration_factor
E = sound_exposure(x, fs, duration_hours=8)

E: Pa²·h
lex_8hfunciónExposición diaria LEX,8h / LEP,d.
• Mismos parámetros que sound_exposure
lex = lex_8h(x, fs, duration_hours=4)

• Nivel normalizado a 8 h [dB]
loudness_zwickerfunciónSonoridad de Zwicker (ISO 532-1:2017).
x: señal calibrada en Pa (1D)
fs: frecuencia de muestreo [Hz]
field: ‘free’ o ‘diffuse’ (def.: ‘free’)
stationary: método estacionario del apartado 5 (def.: False)
calibration_factor: unidades digitales a Pa (def.: 1.0)
res = loudness_zwicker(x, fs)

ZwickerLoudness; los análisis variables en el tiempo añaden N5/N10 y la traza N(t) a 500 Hz
loudness_zwicker_from_spectrumfunciónSonoridad estacionaria desde niveles de banda.
levels: 28 niveles de tercio de octava, 25 Hz–12,5 kHz [dB SPL]
field: ‘free’ o ‘diffuse’ (def.: ‘free’)
res = loudness_zwicker_from_spectrum(levels)

res.loudness [sonos], res.loudness_level [fonios]
ZwickerLoudnessdataclassResultado de sonoridad.
loudness: N [sonos]
loudness_level: LN [fonios]
specific: N′(z), 240 bins de 0,1 Bark
n5 / n10: sonoridad percentil (solo variable en el tiempo)
time / loudness_vs_time: traza a 500 Hz
res.loudness, res.n5

• Los campos temporales son None en resultados estacionarios
sharpness_dinfunciónSharpness en acum (DIN 45692).
x: señal (1D)
fs: frecuencia de muestreo [Hz]
field: ‘free’ o ‘diffuse’ (def.: ‘free’)
method: ‘din’, ‘aures’ o ‘bismarck’ (def.: ‘din’)
calibration_factor: unidades digitales a Pa (def.: 1.0)
s = sharpness_din(x, fs)

s: sharpness [acum]
sharpness_din_from_specificfunciónSharpness desde un patrón de sonoridad específica.
specific: N′(z), 240 valores a 0,1 Bark (p. ej. ZwickerLoudness.specific)
method: ‘din’, ‘aures’ o ‘bismarck’ (def.: ‘din’)
s = sharpness_din_from_specific(res.specific)

s: sharpness [acum]
equal_loudness_contourfunciónIsofónica ISO 226:2023.
phon: nivel de sonoridad, 20–90 fonos
freqs, spl = equal_loudness_contour(40.0)

• SPL en las 29 frecuencias preferentes
loudness_levelfunciónNivel de sonoridad de un tono puro (fonos).
spl: SPL del tono [dB]
frequency: una de las 29 frecuencias de la Tabla 1 [Hz]
phon = loudness_level(73.0, 63.0)
hearing_thresholdfunciónUmbral de audición (Tabla 1 de ISO 226).
• (sin parámetros)
freqs, tf = hearing_threshold()
tone_to_noise_ratiofunciónRelación tono-ruido (ECMA-418-1 §11).
x: señal (1D)
fs: frecuencia de muestreo [Hz]
tone_freq: tono a evaluar [Hz] (def.: pico más alto)
resolution_hz: resolución FFT (def.: 1.0)
r = tone_to_noise_ratio(x, fs)

ToneAssessment(frequency, ratio_db, criterion_db, prominent)
prominence_ratiofunciónRelación de prominencia (ECMA-418-1 §12).
• mismos parámetros que tone_to_noise_ratio
r = prominence_ratio(x, fs, tone_freq=1000)

ToneAssessment(...)
ToneAssessmentdataclassVeredicto de prominencia tonal.
frequency: tono evaluado [Hz]
ratio_db: TNR o PR [dB]
criterion_db: límite de prominencia a esa frecuencia [dB]
prominent: bool
r = tone_to_noise_ratio(x, fs)
if r.prominent: ...
sti_from_impulse_responsefunciónSTI completo, método indirecto (IEC 60268-16 Ed. 5).
ir: respuesta al impulso (1D)
fs: frecuencia de muestreo [Hz] (>= 22500)
snr: SNR [dB], escalar o 7 bandas (def.: None)
level: 7 niveles de banda del habla [dB SPL]; activa enmascaramiento + umbral de recepción (def.: None)
ambient: 7 niveles de banda de ruido [dB SPL]; requiere level
res = sti_from_impulse_response(ir, fs, snr=25.0)

STIResult con mtf (7×14)
stipafunciónMétodo directo STIPA (Anexo B).
x: señal STIPA grabada (1D), 15–25 s
fs: frecuencia de muestreo [Hz] (>= 22500)
reference: señal de la fuente medida en lugar del m = 0,55 nominal (def.: None)
level / ambient: como sti_from_impulse_response
res = stipa(recording, fs)

STIResult con mtf (7×2)
stipa_signalfunciónGenerador de señal de prueba STIPA (A.4/A.6.1).
fs: frecuencia de muestreo [Hz] (>= 22500)
seconds: duración [s] (def.: 18.0)
level_db: nivel RMS [dB SPL] (def.: None → RMS 0.1)
seed: semilla del ruido rosa (def.: None)
sig = stipa_signal(48000, seconds=18.0)

• Señal de prueba 1D, espectro masculino de la Ed. 5
STIResultdataclassResultado del STI.
sti: 0 a 1
mti: índices por banda (7,)
mtf: valores m corregidos (7×14 o 7×2)
band_levels: niveles usados o None
rating: letra del Anexo F, ‘A+’…’U’
res = stipa(x, fs)
print(res.sti, res.rating)
sound_intensityfunciónIntensidad sonora p-p (IEC 61043).
p1, p2: señales de los micrófonos [Pa], misma longitud
fs: frecuencia de muestreo [Hz]
spacing: separación entre micrófonos Δr [m]
rho: densidad del aire (def.: 1.204)
c: velocidad del sonido (def.: 343.0)
fraction: None, 1 o 3 (def.: None)
limits: [f_min, f_max] (def.: [12, 20000])
res = sound_intensity(p1, p2, fs, spacing=0.012, fraction=3)

IntensityResult
IntensityResultdataclassResultado de intensidad.
• por banda (con fraction): frequency, intensity [W/m²], intensity_level, pressure_level, pressure_intensity_index, direction (±1), bias_correction
• banda ancha: equivalentes total_*
max_valid_frequency: 0,1·c/Δr
res.total_intensity_level
res.total_direction
field_indicatorsfunciónIndicadores de campo del Anexo A de ISO 9614-1.
pressure_levels: Lpi por posición [dB]
normal_intensity: Ini con signo por posición [W/m²]
fi = field_indicators(lp, i_n)

FieldIndicators(f2, f3, f4)
dynamic_capability_indexfunciónCapacidad dinámica Ld (ISO 9614-1 §3.12).
pressure_residual_intensity_index: δpI0 [dB]
bias_error_factor: K [dB] (def.: 10.0)
ld = dynamic_capability_index(18.0)

• Adecuado cuando Ld > F2 (criterio 1)
CalibrationWarningclase warningGrabación de calibración poco fiable.
La emite calculate_sensitivity — con fs presente y validate=True — cuando el tono es inestable (límite IEC 60942) o demasiado corto
warnings.simplefilter("error", CalibrationWarning)
ldenfunciónNivel día-tarde-noche (ISO 1996-1 §3.6.4).
lday/levening/lnight: LAeq por periodo [dB]
hours: duración de periodos (def.: (12, 4, 8))
l = lden(63.2, 58.1, 51.4)
ldnfunciónNivel día-noche (ISO 1996-1 §3.6.5).
lday/lnight: LAeq por periodo [dB]
hours: def. (15, 9)
l = ldn(63.2, 51.4)
composite_rating_levelfunciónEvaluación compuesta de jornada (ISO 1996-1 §6.5).
periods: lista de (nivel_db, horas, ajuste_db) que suman 24 h
r = composite_rating_level([(63, 12, 0), (58, 4, 5), (51, 8, 10)])
linkwitz_rileyfunciónCrossover de audio.
x: array de señal
fs: frecuencia de muestreo [Hz]
freq: frecuencia de cruce [Hz]
order: cualquier número par (def.: 4)
lo, hi = linkwitz_riley(x, fs, freq=1000, order=4)

lo: señal paso-bajo
hi: señal paso-alto
calculate_sensitivityfunciónCalibración SPL.
ref_signal: señal de calibración
target_spl: nivel del calibrador (def.: 94.0)
ref_pressure: presión de referencia (def.: 20e-6)
s = calculate_sensitivity(ref_signal, target_spl=94.0)

s: float (multiplicador a presión)
verify_filter_classfunciónVerificación de clase IEC 61260-1:2014.
bank: un OctaveFilterBank
num_points: puntos de la malla de frecuencia por banda (def.: 32768)
result = verify_filter_class(bank)

result["overall_class"]: 1, 2 o None
result["bands"]: clase y márgenes por banda [dB]
getansifrequenciesfunciónGenerador de frecuencias ANSI.
fraction: 1, 3, etc. (obligatorio)
limits: [f_min, f_max] (def.: [12, 20000])
f_cen, f_low, f_high, labels = getansifrequencies(fraction=3)

f_cen / f_low / f_high: centros y bordes [Hz]
labels: etiquetas nominales IEC
normalizedfreqfunciónFrecuencias IEC estándar.
fraction: 1 o 3
freqs = normalizedfreq(fraction=3)

freqs: lista de frecuencias centrales estándar [Hz]
  • zero_phase=True (en OctaveFilterBank.filter y spectrogram) filtra hacia delante y hacia atrás (sosfiltfilt): sin retardo de grupo, atenuación efectiva doble, solo análisis offline. Incompatible con stateful=True.
  • mode='peak' incluye el transitorio de arranque del filtro; un tono que empieza de forma abrupta puede sobrepasar ~1 dB. Consulta Calibración y dBFS.
  • octavefilter() cachea internamente los diseños del banco (32 entradas), así que las llamadas repetidas con los mismos parámetros se saltan la fase de diseño. Para control explícito usa OctaveFilterBank.
Creado y mantenido por· GitHub· PyPI