Ir al contenido

Multicanal y rendimiento

phonometry soporta de forma nativa señales multicanal (estéreo, 5.1, arrays de micrófonos…) mediante operaciones totalmente vectorizadas. Los arrays de entrada con forma (N_channels, N_samples) se procesan en paralelo, con ganancias de rendimiento significativas frente a bucles iterativos.

Análisis estéreo: ruido rosa y barrido logarítmico resueltos por canal en tercios de octavaAnálisis estéreo: ruido rosa y barrido logarítmico resueltos por canal en tercios de octava

Análisis simultáneo de una señal estéreo: canal izquierdo (ruido rosa) vs canal derecho (barrido senoidal logarítmico).

La convención es consistente en toda la librería: el tiempo siempre es el último eje. Aplica a octavefilter, OctaveFilterBank, weighting_filter, time_weighting, leq, laeq, ln_levels y spectrogram.

import numpy as np
from phonometry import octavefilter
stereo = np.stack([left, right]) # (2, n_samples)
spl, freq = octavefilter(stereo, fs, fraction=3)
# spl tiene forma (2, n_bands): una fila por canal
EntradaSe interpreta comoSalida típica
Array 1D (n,)un canalnivel escalar / (bands,)
Array 2D (ch, n)ch canales de n muestras cada unoniveles (ch,) / (ch, bands)
lista de floatsun canal (se convierte)como 1D
(ch, n) en spectrogramSTFT multicanal(ch, bands, frames)

Todo se vectoriza a lo largo del eje inicial de canales — un único diseño de filtro se aplica a todos los canales en una sola llamada a SciPy, así que 8 canales cuestan mucho menos que 8 ejecuciones separadas. Convención: canales primero, como la mayoría del código DSP (soundfile devuelve (n, ch): transpón con x.T).

La clase OctaveFilterBank está muy optimizada para procesado en tiempo real y por lotes. Usa vectorización NumPy para manejar arrays de audio multicanal (p. ej. arrays de micrófonos de 64 canales) sin bucles Python explícitos.

from phonometry import OctaveFilterBank
bank = OctaveFilterBank(fs=48000, fraction=3, filter_type='butter')
# Propiedades calculadas
# bank.freq (centros), bank.freq_d (bordes inferiores), bank.freq_u (superiores), bank.sos
# Procesar múltiples señales de forma eficiente
for frame in stream:
# detrend=True (por defecto) elimina el offset DC y mejora la precisión en graves
spl, freq = bank.filter(frame, detrend=True)

Notas adicionales de rendimiento:

  • Caché de diseño: octavefilter() reutiliza los diseños del banco entre llamadas con parámetros idénticos (caché LRU de 32 entradas), así que llamarla en bucle no rediseña el banco cada vez. OctaveFilterBank te da control explícito sobre el ciclo de vida del diseño.
  • Diezmado multitasa: las bandas graves se filtran a una frecuencia diezmada, lo que es a la vez más rápido y numéricamente más estable (consulta Teoría).
  • numba opcional: el kernel del modo impulse de la ponderación temporal se compila JIT cuando numba está instalado (pip install phonometry[perf]).
Creado y mantenido por· GitHub· PyPI