Ir al contenido

Medición de la respuesta al impulso

Normas aplicables: ISO 18233ISO 3382

Toda magnitud de acústica de salas de este sitio parte de la misma medición: la respuesta al impulso (RI) entre una fuente y un receptor. Hazla bien y todo lo que viene después (tiempo de reverberación, claridad, aislamiento, métricas del habla) es cuestión de aritmética; hazla mal y ningún procesamiento posterior recupera lo que la excitación o la posición del micrófono tiraron. Esta guía cubre la propia adquisición, según ISO 18233: el barrido sinusoidal exponencial y su deconvolución, el método de correlación con MLS, y dónde colocar fuentes y micrófonos para que el resultado promediado signifique algo. Convertir la RI medida en parámetros de sala vive en Acústica de salas; la misma RI medida a ambos lados de un cerramiento se convierte en aislamiento acústico en Medición del aislamiento en campo (ISO 16283).

Una sala se comporta, con buena aproximación, como un sistema lineal e invariante en el tiempo, así que todo sobre ella está contenido en su RI. Podrías disparar una pistola y grabar la cola, pero una excitación determinista reproducida por un altavoz y deconvolucionada recupera la misma RI con 20–30 dB más de relación señal-ruido efectiva (ISO 18233, apartado 6.2.3). Se proporcionan dos excitaciones.

Tres recuperaciones de la misma respuesta al impulso sintética de sala frente al mismo ruido de fondo, representadas como envolventes logarítmicas suavizadas frente al tiempo: un disparo de pistola grabado directamente alcanza 46 dB entre su pico y el suelo de ruido, un barrido deconvolucionado de 1 segundo alcanza 75 dB y uno de 4 segundos alcanza 83 dB, con el suelo leído en una ventana acotada de 1,0 a 1,6 segundos, cuando el decaimiento de la sala ya se ha extinguidoTres recuperaciones de la misma respuesta al impulso sintética de sala frente al mismo ruido de fondo, representadas como envolventes logarítmicas suavizadas frente al tiempo: un disparo de pistola grabado directamente alcanza 46 dB entre su pico y el suelo de ruido, un barrido deconvolucionado de 1 segundo alcanza 75 dB y uno de 4 segundos alcanza 83 dB, con el suelo leído en una ventana acotada de 1,0 a 1,6 segundos, cuando el decaimiento de la sala ya se ha extinguido

La misma sala, el mismo ruido de fondo, tres excitaciones. La pistola recupera 46 dB de rango; un barrido deconvolucionado de 1 s recupera 75 dB, los 29 dB que predice el apartado 6.2.3. Dos duplicaciones más del barrido añaden 8 dB: el B.6 da unos 3 dB por duplicación como cifra normal, y el exceso de aquí es la propia cola de ruido de la deconvolución (B.5) desvaneciéndose con el barrido más largo. El número indicado es la distancia de pico a suelo, con el suelo leído como el valor eficaz de la ventana acotada, mucho después de que la sala se haya detenido.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import fftconvolve
from phonometry import room
fs, n = 48000, 96000
rng = np.random.default_rng(2026)
t = np.arange(n) / fs
system = rng.standard_normal(n) * np.exp(-6.9077 * t / 0.7) * 0.02
system[80] += 1.0; system[1500] += 0.45; system[3200] += 0.28
noise = 10.0 ** (-46.0 / 20.0) # el fondo propio de la sala
win = slice(int(1.0 * fs), int(1.6 * fs))
def peak_to_floor(h):
mag = np.abs(np.asarray(h, dtype=float))
return 20 * np.log10(mag.max() / np.sqrt(np.mean(mag[win] ** 2)))
shot = system + rng.standard_normal(n) * noise
print(round(peak_to_floor(shot))) # 46
for seconds in (1.0, 4.0):
sweep = room.sweep_signal(fs, 20.0, 20000.0, seconds)
played = fftconvolve(sweep, system)
played = played + rng.standard_normal(played.size) * noise
ir = room.impulse_response(played, sweep, fs, length=n)
print(seconds, round(peak_to_floor(ir))) # 1.0 75 / 4.0 83
plt.plot(t, 20 * np.log10(np.abs(np.asarray(ir)) / np.max(np.abs(np.asarray(ir)))))
plt.show()

Barrido sinusoidal exponencial (ESS, Anexo B). La frecuencia instantánea crece exponencialmente,

de modo que el tiempo invertido por octava es constante y la excitación imita al ruido rosa (energía constante por banda de fracción de octava). La RI se recupera mediante división espectral lineal (con relleno de ceros, no circular),

con un pequeño término de Tikhonov que protege los extremos de banda donde el barrido tiene poca energía.

La deconvolución divide por el espectro de referencia, así que allí donde el barrido no puso energía no hay nada por lo que dividir, y el término de Tikhonov es lo único que impide que el cociente explote. Por eso el barrido empieza por debajo de la banda más baja que se vaya a analizar y termina por encima de la más alta: típicamente de 20 Hz a 20 kHz para una sala analizada de 125 Hz a 4 kHz, ya que los filtros de análisis necesitan energía tanto en sus faldas como en sus centros. El síntoma de hacerlo mal es reconocible: un retumbo lento antes del sonido directo, o una cola de alta frecuencia que resuena, y cualquiera de los dos levanta el suelo de ruido aparente de las bandas extremas y acorta sus tiempos de decaimiento ajustados. La regla es ensanchar antes el barrido y subir regularization solo cuando el altavoz de verdad no pueda reproducir la banda, y registrar el valor empleado, porque cambia el resultado.

Como un barrido de grave a agudo sitúa la distorsión armónica en tiempos de llegada negativos, la distorsión se separa limpiamente de la RI lineal y se descarta conservando solo la parte causal. El mecanismo cabe en una frase: la frecuencia instantánea de un barrido exponencial avanza un número fijo de octavas por segundo, así que el armónico -ésimo recorre el mismo camino en frecuencia un tiempo fijo antes, y tras la deconvolución la distorsión se concentra en paquetes discretos a retardos negativos separados por

De ahí se siguen tres consecuencias prácticas. La separación es proporcional a la longitud del barrido, así que un barrido largo empuja los paquetes lejos de mientras que uno muy corto deja que el paquete de segundo orden se apelotone contra la respuesta lineal. Los paquetes son la materia prima del análisis de distorsión por barrido sinusoidal, que es la razón de que exista return_full=True. Y esta separación es la razón de que un barrido tolere un altavoz llevado cerca de su límite, mientras que la MLS reparte esa misma distorsión por toda la RI en forma de ruido.

La secuencia deconvolucionada completa de un barrido de 3 segundos a través de una cadena ligeramente no lineal, representada en un eje de tiempo envuelto con el cero en el centro: la respuesta al impulso lineal en t = 0 con la ventana causal sombreada a su derecha, y los paquetes de armónicos segundo, tercero y cuarto como grupos separados en menos 0,30, menos 0,48 y menos 0,60 segundos, cada uno marcado con su adelanto previstoLa secuencia deconvolucionada completa de un barrido de 3 segundos a través de una cadena ligeramente no lineal, representada en un eje de tiempo envuelto con el cero en el centro: la respuesta al impulso lineal en t = 0 con la ventana causal sombreada a su derecha, y los paquetes de armónicos segundo, tercero y cuarto como grupos separados en menos 0,30, menos 0,48 y menos 0,60 segundos, cada uno marcado con su adelanto previsto

return_full=True sobre ese mismo barrido de 3 s de 20 Hz a 20 kHz, con una no linealidad sin memoria suave en la cadena. Los grupos H2, H3 y H4 caen en , y el retorno por defecto sencillamente se queda con la mitad sombreada.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import fftconvolve
# `room` es el import del fragmento principal de abajo.
fs, f1, f2, seconds = 48000, 20.0, 20000.0, 3.0
sweep = room.sweep_signal(fs, f1, f2, seconds)
system = np.zeros(int(0.4 * fs))
system[80], system[1400], system[3100] = 1.0, 0.5, 0.32
played = fftconvolve(sweep, system)
played = played + 0.08 * played ** 2 + 0.04 * played ** 3 + 0.02 * played ** 4
full = np.asarray(room.impulse_response(played, sweep, fs, return_full=True))
for order in (2, 3, 4):
print(order, round(seconds * np.log(order) / np.log(f2 / f1), 2))
# 2 0.3 / 3 0.48 / 4 0.6 -- los adelantos previstos, en segundos
half = full.size // 2
plt.plot((np.arange(full.size) - half) / fs,
20 * np.log10(np.abs(np.roll(full, half)) / np.max(np.abs(full))))
plt.xlim(-0.78, 0.42); plt.ylim(-95, 18)
plt.show()

El método "farina" llega al mismo resultado convolucionando la grabación con el filtro inverso analítico; supone que el barrido de referencia se generó con la amplitud y el fundido por defecto, así que usa el método espectral con un barrido de amplitud distinta de la unidad o con fundido personalizado.

Secuencia de longitud máxima (MLS, Anexo A). Una secuencia binaria de orden y longitud cuya autocorrelación circular es una delta casi perfecta; la RI se obtiene de la correlación cruzada circular del periodo grabado con la secuencia. La MLS excita con amplitud constante y es rápida de promediar, pero es más sensible a la varianza temporal (corrientes de aire, deriva de temperatura) y no admite tanta potencia como un barrido. Prefiere el barrido para salas y cerramientos; recurre a la MLS cuando la excitación deba ser periódica o el hardware favorezca una señal de dos niveles.

Las dos excitaciones se dimensionan frente a un único número que el lector ya tiene: el tiempo de reverberación de la sala. Dimensiona mal y nada parece ir mal: el resultado sencillamente se queda corto.

El barrido y su silencio. Empieza el barrido por debajo de la banda de análisis más baja y termínalo por encima de la más alta. El apartado B.3.1 llama práctica segura con ruido de fondo moderado a una longitud de dos a cuatro veces el más largo esperado, seguida de un hueco de silencio de aproximadamente un ; el apartado 6.2.2.3 hace normativo el hueco — la excitación «debe ir seguida de un periodo de silencio» — y el decaimiento debe registrarse a lo largo de al menos la mitad de . Mantén la grabación en marcha hasta que todas las bandas de interés estén al menos 30 dB por debajo. Después, según el B.6, cada duplicación del barrido compra unos 3 dB de relación señal-ruido efectiva, y es preferible un barrido más largo a más promedios: promediar respuestas aumenta la sensibilidad a los cambios del entorno, y un único barrido largo no.

El periodo de la MLS. Una excitación periódica es distinta, y el apartado 6.2.2.2 es normativo al respecto (ec. (10)): el periodo de repetición no debe ser más corto que , de modo que caigan al menos dos líneas espectrales dentro del ancho de banda de cualquier modo de la sala. Como el periodo de una secuencia de orden es , eso fija el orden:

A 48 kHz, el orden 16 da 1,37 s y el orden 18 da 5,46 s, y una sala con s necesita el orden 17. Baja de ahí y la cola de un periodo se pliega sobre la cabeza del siguiente: el decaimiento queda solapado en el tiempo, el suelo de nivel sube y sale corto, sin ningún síntoma visible. Descarta el primer periodo como calentamiento, que es lo que hace el patrón de abajo de reproducir cuatro periodos y conservar tres.

Tres carriles temporales para una sala con T = 1,2 s. El primero muestra el barrido reproducido de 4,0 segundos, tres veces y un tercio T, seguido de un hueco de silencio de aproximadamente un T y una ventana de grabación acotada de 5,2 segundos. El segundo muestra una MLS periódica de orden 17, de periodo 2,73 segundos, con el primer periodo marcado como calentamiento y descartado y el segundo conservado, y debajo un periodo corto de orden 15 de 0,68 segundos marcado como más corto que T, de modo que la cola se pliega sobre la cabeza. El tercero muestra lo que devuelve la deconvolución: la respuesta al impulso lineal y su cola en el tiempo cero con la parte causal conservada, los paquetes de armónicos segundo, tercero y cuarto en tiempos de llegada negativos, y la propia cola de ruido decreciente de la deconvoluciónTres carriles temporales para una sala con T = 1,2 s. El primero muestra el barrido reproducido de 4,0 segundos, tres veces y un tercio T, seguido de un hueco de silencio de aproximadamente un T y una ventana de grabación acotada de 5,2 segundos. El segundo muestra una MLS periódica de orden 17, de periodo 2,73 segundos, con el primer periodo marcado como calentamiento y descartado y el segundo conservado, y debajo un periodo corto de orden 15 de 0,68 segundos marcado como más corto que T, de modo que la cola se pliega sobre la cabeza. El tercero muestra lo que devuelve la deconvolución: la respuesta al impulso lineal y su cola en el tiempo cero con la parte causal conservada, los paquetes de armónicos segundo, tercero y cuarto en tiempos de llegada negativos, y la propia cola de ruido decreciente de la deconvolución
import numpy as np
# `room` es el import del bloque de la figura de arriba.
def excitation_budget(reverberation, fs=48000, factor=3.0):
"""Longitud de barrido, silencio y orden de MLS que necesita una sala con esta T."""
sweep_seconds = factor * reverberation # B.3.1: 2-4 x T
silence = reverberation # B.3.1: aprox. T
order = int(np.ceil(np.log2(reverberation * fs + 1.0))) # 6.2.2.2 ec. (10)
period = (2 ** order - 1) / fs
return round(sweep_seconds, 2), round(silence, 2), order, round(period, 2)
print(excitation_budget(1.2)) # (3.6, 1.2, 16, 1.37)
print(excitation_budget(1.5)) # (4.5, 1.5, 17, 2.73)
Cuatro envolventes de respuesta al impulso recuperadas de la misma sala sintética: el barrido recuperado en condiciones estacionarias y con un calentamiento lento de 0,3 kelvin se superponen y llegan a 90 dB por debajo del pico, la MLS estacionaria los sigue hasta unos 75 dB, y la MLS con deriva se derrumba en un suelo plano 15 dB por debajo del pico sin decaimiento algunoCuatro envolventes de respuesta al impulso recuperadas de la misma sala sintética: el barrido recuperado en condiciones estacionarias y con un calentamiento lento de 0,3 kelvin se superponen y llegan a 90 dB por debajo del pico, la MLS estacionaria los sigue hasta unos 75 dB, y la MLS con deriva se derrumba en un suelo plano 15 dB por debajo del pico sin decaimiento alguno

Lo que cuesta ser «más sensible a la varianza temporal». Un calentamiento lento de unos 0,3 K a lo largo de la toma — un remuestreo de 500 partes por millón, que es lo que una velocidad del sonido decreciente hace con los tiempos de llegada — deja intacta la recuperación por barrido y destruye la de MLS, porque la correlación promedia periodos que ya no encajan. El B.7.3.1 de la ISO 18233 enuncia el mismo resultado de forma cualitativa; la ec. (A.8) del A.4.3.1 da el límite orientativo °C para una medición de tiempo de reverberación.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import fftconvolve
# `room` es el import del fragmento principal de abajo.
fs, n = 48000, 24000
rng = np.random.default_rng(2026)
t = np.arange(n) / fs
system = rng.standard_normal(n) * np.exp(-6.9077 * t / 0.4) * 0.02
system[80] += 1.0; system[1500] += 0.45; system[3200] += 0.28
def drift(x, ppm): # la sala calentándose durante la toma
i = np.arange(x.size, dtype=float)
return np.interp(i, i * (1.0 + ppm * 1e-6 * i / x.size), x, left=0.0, right=0.0)
sweep = room.sweep_signal(fs, 20.0, 20000.0, 1.4)
mls = room.mls_signal(16)
for ppm in (0.0, 500.0):
played = drift(fftconvolve(sweep, system), ppm)
plt.plot(20 * np.log10(np.abs(np.asarray(
room.impulse_response(played, sweep, fs, length=n)))))
# Cuatro periodos reproducidos, el primero descartado como calentamiento. El
# caso con deriva dispara el aviso de solapamiento circular de la biblioteca:
# ese aviso ES el resultado.
rec = drift(fftconvolve(np.tile(mls, 4), system)[mls.size: 4 * mls.size], ppm)
plt.plot(20 * np.log10(np.abs(np.asarray(
room.mls_impulse_response(rec, mls, length=n)))))
plt.show()
Cadena de medición indirecta ISO 18233: una excitación (barrido ESS o MLS) alimenta un altavoz en la sala, un micrófono capta la respuesta y la deconvolución (correlación o filtro inverso) recupera la respuesta al impulsoCadena de medición indirecta ISO 18233: una excitación (barrido ESS o MLS) alimenta un altavoz en la sala, un micrófono capta la respuesta y la deconvolución (correlación o filtro inverso) recupera la respuesta al impulso
import numpy as np
from scipy.signal import fftconvolve
from phonometry import room
fs = 48000
# Un barrido de 3 s, 20 Hz - 20 kHz es una buena excitación de sala de banda ancha
# sweep: excitación que reproduces por el altavoz
sweep = room.sweep_signal(fs, 20.0, 20000.0, 3.0)
# Deconvoluciona la respuesta grabada para recuperar la respuesta al impulso
system = np.zeros(fs); system[100] = 1.0; system[2000] = 0.4 # directo + reflexión
# recorded: captura de micrófono del barrido reproducido (aquí simulada por convolución con una sala sintética)
recorded = fftconvolve(sweep, system)
ir = room.impulse_response(recorded, sweep, fs, method="spectral")
print(int(np.argmax(np.abs(ir)))) # 100: sonido directo recuperado
ir.plot() # forma de onda + envolvente de Schroeder (figura de abajo)
# Variante de filtro inverso de Farina (necesita la banda del barrido)
ir_f = room.impulse_response(recorded, sweep, fs, method="farina", f_range=(20.0, 20000.0))
# MLS periódica: excita con >= 2 periodos, promedia, correlaciona
mls = room.mls_signal(16) # longitud 2**16 - 1 = 65535
rec = fftconvolve(np.tile(mls, 2), system)[: 2 * mls.size]
ir_m = room.mls_impulse_response(rec, mls)
print(int(np.argmax(np.abs(ir_m)))) # 100

sweep_signal/mls_signal devuelven arrays simples, listos para escribir en un WAV y reproducir. impulse_response/mls_impulse_response devuelven ahora un ImpulseResponseResult, un sustituto directo del array de la RI (np.asarray(ir), la indexación y ir.size siguen funcionando, de modo que room_parameters(ir, fs) no cambia) que además guarda la frecuencia de muestreo y el método y añade un .plot(). Dos excitaciones más de la literatura de medición de funciones de transferencia — los pares complementarios de Golay, cuya deconvolución es exacta y libre de ruido, y los barridos conformados a un espectro objetivo arbitrario — viven en la guía de medición de sistemas y devuelven los mismos tipos de resultado.

Las dos excitaciones. El barrido exponencial desplaza su energía hacia frecuencias altas a lo largo de toda la señal, mientras que la MLS es una secuencia de dos niveles con espectro plano, visible como la magnitud casi constante de la derecha.

Señales de excitación ISO 18233: la forma de onda del barrido sinusoidal exponencial y su espectrograma con el ascenso exponencial de frecuencia, y una secuencia de longitud máxima con su espectro de magnitud planoSeñales de excitación ISO 18233: la forma de onda del barrido sinusoidal exponencial y su espectrograma con el ascenso exponencial de frecuencia, y una secuencia de longitud máxima con su espectro de magnitud plano
Mostrar el código de esta figura
from phonometry import room
from phonometry import plot_excitation
fs = 48000
sweep = room.sweep_signal(fs, 50.0, 20000.0, 1.0) # excitación ESS
mls = room.mls_signal(12).astype(float) # longitud 2**12 - 1
# Una línea: forma de onda + espectrograma (barrido), secuencia + espectro (MLS)
plot_excitation(sweep, fs, kind="sweep")
plot_excitation(mls, fs, kind="mls")
# A mano: el espectrograma del barrido y el espectro de magnitud de la MLS
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
ax1.specgram(sweep, NFFT=1024, Fs=fs, noverlap=512)
ax1.set(xlabel="Tiempo [s]", ylabel="Frecuencia [Hz]", title="Espectrograma del barrido")
spec = np.abs(np.fft.rfft(mls))
freqs = np.fft.rfftfreq(mls.size, d=1.0 / fs)
ax2.semilogx(freqs[1:], 20 * np.log10(spec[1:] / np.median(spec[1:])))
ax2.set(xlabel="Frecuencia [Hz]", ylabel="Magnitud [dB]", title="Espectro de la MLS (plano)")

Deconvolucionar la grabación da la RI de banda ancha: el sonido directo, las reflexiones tempranas discretas y la cola difusa que decae. Su .plot() muestra la forma de onda arriba y la envolvente log-magnitud con la curva de decaimiento de energía de Schroeder abajo: el decaimiento recto cuya pendiente se convierte en el tiempo de reverberación en la guía de acústica de salas.

Un barrido exponencial cruza una sala dibujada mientras se construye el espectrograma de la grabación, con las reflexiones discretas apareciendo como copias retardadas de la cresta principal; después el filtro inverso colapsa toda la grabación en la respuesta al impulso.

Descargar la animación (WebM)

Un barrido exponencial cruza una sala dibujada mientras se construye el espectrograma de la grabación, con las reflexiones discretas apareciendo como copias retardadas de la cresta principal; después el filtro inverso colapsa toda la grabación en la respuesta al impulso.

Descargar la animación (WebM)

Respuesta al impulso de la sala recuperada: la forma de onda normalizada con el sonido directo y las reflexiones etiquetadas, y debajo la envolvente log-magnitud en dB con la curva de decaimiento de energía de SchroederRespuesta al impulso de la sala recuperada: la forma de onda normalizada con el sonido directo y las reflexiones etiquetadas, y debajo la envolvente log-magnitud en dB con la curva de decaimiento de energía de Schroeder
Mostrar el código de esta figura
import numpy as np
from scipy.signal import fftconvolve
# `room` es el import del fragmento principal de arriba.
fs = 48000
sweep = room.sweep_signal(fs, 20.0, 20000.0, 1.5)
# Una sala sintética: sonido directo + dos reflexiones + cola difusa que decae
system = np.zeros(int(0.7 * fs))
system[80], system[1400], system[3100] = 1.0, 0.5, 0.32
ir = room.impulse_response(fftconvolve(sweep, system), sweep, fs, length=system.size)
# Una línea: forma de onda + log-magnitud / decaimiento de Schroeder
ir.plot(language="es")
# A mano: la envolvente log-magnitud normalizada en dB
import matplotlib.pyplot as plt
h = np.asarray(ir)
t = np.arange(h.size) / fs
plt.plot(t, 20 * np.log10(np.abs(h) / np.max(np.abs(h))))
plt.ylim(-80, 5)
plt.xlabel("Tiempo [s]"); plt.ylabel("Nivel re pico [dB]")

Una cosa que esta respuesta no es: la respuesta al impulso de la sala. Lo que devuelve la deconvolución es la respuesta de altavoz, sala y micrófono en serie — el apartado A.1 de la ISO 18233 lo dice para la cadena de MLS, y el barrido no es distinto. Para el tiempo de reverberación eso es inofensivo, porque un filtro lineal fijo cambia la forma de la parte temprana pero no la pendiente del decaimiento de la banda, que es la razón de que los tiempos de reverberación sean transferibles entre sistemas de medición. Para los parámetros de energía no lo es: la caída de la fuente en baja frecuencia y su directividad en alta redistribuyen la energía temprana y desplazan C50, C80 y , así que esos no son transferibles. De ahí se siguen dos consecuencias. Declara la fuente empleada siempre que indiques claridad o tiempo central; y elimina la respuesta en campo libre de la cadena antes de auralizar la respuesta o de compararla entre sistemas. Es también la razón de que la norma especifique la directividad de la fuente y no su respuesta en frecuencia: la directividad varía entre posiciones y no puede ecualizarse.

Parámetros de sweep_signal() / inverse_filter()

Sección titulada «Parámetros de sweep_signal() / inverse_filter()»
ParámetroTipoUnidadesRango / valor por defectoNotas
fsintHz> 0Frecuencia de muestreo
f1floatHz> 0, en/por debajo de la banda más bajaFrecuencia inicial del barrido
f2floatHzf1 < f2 <= fs/2Frecuencia final del barrido
secondsfloats2–4 × la T más larga esperadaDuración del barrido; ver «Dimensionar la excitación» más arriba
amplitudefloatpor defecto 1.0Amplitud de pico
fadefloat[0, 0.5), por defecto 0.01Fracción de fundido (medio Hann; elimina transitorios de inicio/fin)

inverse_filter(fs, f1, f2, seconds, amplitude=..., fade=...) toma exactamente los mismos argumentos que sweep_signal, porque el filtro se deriva del barrido que tiene que invertir: es el barrido invertido en el tiempo con una envolvente de +6 dB/octava, que blanquea el espectro de −3 dB/octava del ESS de modo que convolucionar barrido con filtro dé un impulso (ISO 18233, B.5). Solo lo invocas tú mismo para inspeccionar el filtro o para convolucionar una grabación a mano: impulse_response(..., method="farina") lo construye internamente a partir de f_range.

ParámetroTipoUnidadesRango / valor por defectoNotas
recordedarray 1Dcualquierano vacíoRespuesta del sistema grabada
referencearray 1Dcualquierano vacíoEl barrido emitido
fsintHz> 0Frecuencia de muestreo
methodstr'spectral' (por defecto) / 'farina''farina' requiere f_range
f_range(float, float)Hzpor defecto None(f1, f2) del barrido (solo Farina)
regularizationfloatpor defecto 1e-6Término de Tikhonov como fracción de la energía espectral de pico
lengthint, opcionalmuestraspor defecto len(recorded)Muestras de RI causal a devolver
return_fullboolpor defecto FalseDevuelve la secuencia completa (distorsión en la cola)

mls_signal(order) toma un entero order en 2–20 (longitud de secuencia ); mls_impulse_response(recorded, mls, length=None) necesita que recorded abarque un número entero de periodos de MLS.

Un barrido deconvolucionado nunca vale más que lo que lo radió, y el apartado 4.2 de la ISO 3382-1 es concreto sobre las tres partes de la cadena.

La fuente (4.2.1). «Debe ser lo más omnidireccional posible», y la Tabla 1 fija cuánto, como la desviación máxima de la omnidireccionalidad promediada sobre arcos deslizantes de 30° en campo libre, medida con al menos 1,5 m entre fuente y micrófono:

Frecuencia [Hz]125250500100020004000
Desviación máxima [dB]± 1± 1± 1± 3± 5± 6

Por eso el trabajo en salas usa un dodecaedro y por eso la salida de sweep_signal no puede reproducirse sin más por un monitor de estudio: un monitor de una vía es directivo bastante antes de 1 kHz, y la desviación que mostraría a 2 y 4 kHz es de decenas de decibelios, no de 5 o 6.

El nivel (4.2.1). Sin promediado síncrono, la fuente debe dar un nivel al menos 45 dB por encima del fondo en la banda de frecuencia correspondiente si se va a medir T30, y al menos 35 dB si solo hace falta T20. Los 20–30 dB de ganancia de proceso medidos al principio de esta página son lo que permite a una fuente modesta cumplirlo, pero no pueden crear rango en una banda en la que la sala suene más que la fuente. Nada de la cadena puede saturar (4.2.2.5).

La cadena de recepción (4.2.2.2). El equipo debe cumplir los requisitos de un sonómetro de tipo 1 (clase 1) según la IEC 61672-1, con filtros de octava o de tercio de octava conformes a la IEC 61260. El micrófono debe ser omnidireccional y conviene que sea lo más pequeño posible, preferiblemente con un diafragma no mayor de 13 mm; se admiten hasta 26 mm para una cápsula de respuesta de presión, o para una cápsula de campo libre provista de un corrector de incidencia aleatoria.

Las alturas (4.3). El centro acústico de la fuente debería estar a 1,5 m sobre el suelo, en posiciones donde estarían las fuentes naturales de la sala, y con al menos dos posiciones de fuente. Los micrófonos se sitúan a 1,2 m, la altura de oído sentado, al menos a un cuarto de longitud de onda — «normalmente en torno a 1 m» — de la superficie reflectante más cercana, incluido el suelo.

Sección de una sala de 10 por 6 por 3,5 metros: un dodecaedro sobre un soporte con su centro acústico acotado a 1,5 metros sobre el suelo y su círculo de exclusión d_min de 2,0 metros recortado por la sala, dos micrófonos sobre soportes a 1,2 metros con la separación mínima de 2 metros y las holguras de 1 metro al techo, al suelo y a la pared del fondo, y bajo la sección las tolerancias de omnidireccionalidad de la Tabla 1 de ISO 3382-1 de más menos 1, 1, 1, 3, 5 y 6 decibelios de 125 Hz a 4 kHz junto con los requisitos de nivel y de cadena de recepciónSección de una sala de 10 por 6 por 3,5 metros: un dodecaedro sobre un soporte con su centro acústico acotado a 1,5 metros sobre el suelo y su círculo de exclusión d_min de 2,0 metros recortado por la sala, dos micrófonos sobre soportes a 1,2 metros con la separación mínima de 2 metros y las holguras de 1 metro al techo, al suelo y a la pared del fondo, y bajo la sección las tolerancias de omnidireccionalidad de la Tabla 1 de ISO 3382-1 de más menos 1, 1, 1, 3, 5 y 6 decibelios de 125 Hz a 4 kHz junto con los requisitos de nivel y de cadena de recepción

Esos mismos 45 dB son lo que comprueba aguas abajo la marca de validez de T30: la guía de acústica de salas rechaza una banda cuyo rango de decaimiento no supere la ventana de evaluación en 15 dB, y ese rechazo suele ser un problema de nivel de fuente, no de procesado.

Una RI caracteriza un único par fuente–receptor; un parámetro de sala se obtiene promediando sobre varios. ISO 3382-1 (salas de espectáculos) pide al menos dos posiciones de fuente y micrófonos separados m entre sí, m de cualquier superficie, a m (altura de oído sentado); ISO 3382-2 fija el número mínimo de posiciones de fuente, de micrófono y de combinaciones fuente–micrófono según el grado de exactitud (control / ingeniería / precisión) y pide posiciones de micrófono que eviten las colocaciones simétricas.

Configuración de medición de acústica de salas: una planta de la sala en vista superior con dos posiciones de fuente (altavoz) y seis posiciones de micrófono con las reglas de separación de ISO 3382-1, y la tabla de ISO 3382-2 con el número mínimo de posiciones para los grados de control, ingeniería y precisiónConfiguración de medición de acústica de salas: una planta de la sala en vista superior con dos posiciones de fuente (altavoz) y seis posiciones de micrófono con las reglas de separación de ISO 3382-1, y la tabla de ISO 3382-2 con el número mínimo de posiciones para los grados de control, ingeniería y precisión

Promediar entre posiciones. El parámetro por banda que se informa es la media aritmética sobre todas las combinaciones fuente-micrófono, y la dispersión entre posiciones es parte de la respuesta, no ruido: indícala junto a la media siempre que supere la diferencia apenas perceptible (DAP) del parámetro (Tabla A.1 de ISO 3382-1), porque una sala puede cumplir un objetivo en promedio mientras butacas concretas quedan muy fuera de él.

Antes de los cuatro errores de abajo, algo que no es un error: una única reflexión del suelo que llega al micrófono junto al sonido directo filtra en peine la respuesta, y mover el micrófono mueve el peine con él. Ese es el mecanismo que hay detrás de los dos primeros errores.

El sonido directo y una reflexión del suelo llegan al micrófono; al cambiar la altura del micrófono varía el retardo entre los dos caminos y el filtro en peine de la respuesta en frecuencia se mueve con él, y por eso importa la posición de medición cerca de superficies reflectantes.

Descargar la animación (WebM)

El sonido directo y una reflexión del suelo llegan al micrófono; al cambiar la altura del micrófono varía el retardo entre los dos caminos y el filtro en peine de la respuesta en frecuencia se mueve con él, y por eso importa la posición de medición cerca de superficies reflectantes.

Descargar la animación (WebM)

Cuatro errores de colocación sesgan la propia media:

  • Posiciones correlacionadas. Micrófonos a menos de 2 m entre sí muestrean casi el mismo campo sonoro dos veces, así que el promedio parece más estable de lo que es. El mínimo de 1 m a cualquier superficie evita, a su vez, el refuerzo de presión junto a un contorno (el filtro en peine del clip de arriba) que colorea todo lo que graba un micrófono demasiado cercano.
  • Colocaciones simétricas. En una sala geométricamente simétrica, las posiciones especulares reciben patrones de reflexión especulares; promediarlas no añade información nueva. Por eso la ISO 3382-2 pide posiciones que no caigan sobre líneas de simetría.
  • Demasiado cerca de la fuente. Dentro del campo directo el EDT se desploma y el C80 se satura hacia arriba haga lo que haga la sala. La ISO 3382-2 mantiene por ello cada micrófono al menos a de la fuente, con una estimación del tiempo de reverberación esperado (2,0 m para la sala de 10 × 6 × 3,5 m de los dibujos de arriba, V = 210 m³, con 0,6 s esperados).
  • La lotería de baja frecuencia. Por debajo de la frecuencia de Schroeder (véase la guía de acústica de salas) cada banda contiene solo un puñado de modos propios, y un micrófono sobre un nodo de uno de ellos ve un decaimiento distinto que otro sobre un antinodo. La dispersión de las bandas de 63-125 Hz entre posiciones es estructuralmente mayor; el remedio son más posiciones, no una excitación más larga.

El tercer error es el que merece dibujarse, porque no parece un error en el resultado:

Dos paneles apilados que comparten un eje de distancia fuente-receptor de 0,6 a 7 metros, en la misma sala de 10 por 6 por 3,5 metros de los dibujos de configuración. Arriba, el T30 medio de 500 a 1000 Hz se mantiene entre 0,54 y 0,66 segundos a lo largo de todo el barrido mientras el EDT sube de 0,18 a unos 0,45 segundos; abajo, la claridad C80 baja de 17,5 a unos 10,5 decibelios. La región interior a d_min = 2,0 metros aparece sombreada como excluida y la distancia crítica de 1,5 metros está marcada con una línea de puntosDos paneles apilados que comparten un eje de distancia fuente-receptor de 0,6 a 7 metros, en la misma sala de 10 por 6 por 3,5 metros de los dibujos de configuración. Arriba, el T30 medio de 500 a 1000 Hz se mantiene entre 0,54 y 0,66 segundos a lo largo de todo el barrido mientras el EDT sube de 0,18 a unos 0,45 segundos; abajo, la claridad C80 baja de 17,5 a unos 10,5 decibelios. La región interior a d_min = 2,0 metros aparece sombreada como excluida y la distancia crítica de 1,5 metros está marcada con una línea de puntos

EDT, T30 y C80 de la sala de arriba frente a la distancia a la fuente, a partir de respuestas al impulso sintéticas. Dentro de , el EDT es corto por un factor de aproximadamente 2,5 y el C80 sale 7 dB alto — muchas veces la diferencia apenas perceptible del 5 % relativo y de 1 dB de la Tabla A.1 de la ISO 3382-1 — mientras que el T30 fluctúa 0,12 s a lo largo de todo el barrido sin tendencia en el extremo cercano. Esa asimetría es la trampa: un control que declare solo el T30 no notará que el micrófono estaba demasiado cerca, y todos los parámetros de energía que lo acompañan están mal.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
# `room` es el import del fragmento principal de arriba.
dims, alpha, source = (10.0, 6.0, 3.5), 0.32, (2.0, 3.0, 1.5)
volume = float(np.prod(dims))
print(round(2.0 * np.sqrt(volume / (343.0 * 0.6)), 1)) # 2.0 m: d_min
for dist in (0.6, 1.0, 2.0, 4.0, 7.0):
band = []
for offset in (-0.7, -0.25, 0.25, 0.7): # un receptor especular dispersa
res = room.image_source_rir(
dims, source, (2.0 + dist, 3.0 + offset, 1.2), alpha, fs=48000,
max_order=40, # c x 0.58 T / L_min, no el 20 por defecto
)
par = room.room_parameters(res.ir, res.fs, limits=(125.0, 4000.0))
mid = (par.frequency > 400.0) & (par.frequency < 1200.0)
band.append([np.mean(par.edt[mid]), np.mean(par.t30[mid]),
np.mean(par.c80[mid])])
print(dist, np.round(np.mean(band, axis=0), 2))
# 0.6 [ 0.18 0.54 17.48] ... 7.0 [ 0.44 0.66 10.65]
plt.show()

Y el cuarto merece contarse. La frecuencia de Schroeder es donde una sala deja de ser un puñado de resonancias y empieza a ser un campo estadístico, y el recuento es rotundo:

Diagrama de barras en ejes logarítmicos del número de modos de sala dentro de cada banda de octava de 63 Hz a 4 kHz para una sala de 7 por 5 por 3 metros y 105 metros cúbicos: 13 modos a 63 Hz y 77 a 125 Hz, ambas por debajo de la frecuencia de Schroeder marcada de 185 Hz, subiendo a 514 a 250 Hz, 28412 a 1 kHz y 1749162 a 4 kHzDiagrama de barras en ejes logarítmicos del número de modos de sala dentro de cada banda de octava de 63 Hz a 4 kHz para una sala de 7 por 5 por 3 metros y 105 metros cúbicos: 13 modos a 63 Hz y 77 a 125 Hz, ambas por debajo de la frecuencia de Schroeder marcada de 185 Hz, subiendo a 514 a 250 Hz, 28412 a 1 kHz y 1749162 a 4 kHz

Por qué «más posiciones, no una excitación más larga». La octava de 4 kHz de esta sala contiene aproximadamente 1,75 millones de modos, así que el promedio en banda hace por ti el promediado espacial y todos los micrófonos declaran casi el mismo decaimiento. La octava de 63 Hz contiene 13: cuál de ellos toca un micrófono dado decide lo que mide, y solo más micrófonos pueden promediar eso. Un barrido más largo compra relación señal-ruido, que es otro problema.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
# `room` es el import del fragmento principal de arriba.
dims, reverberation = (7.0, 5.0, 3.0), 0.9
bands = np.array([63.0, 125.0, 250.0, 500.0, 1000.0, 2000.0, 4000.0])
edge = np.sqrt(2.0)
counts = [room.room_mode_count(f * edge, dims) - room.room_mode_count(f / edge, dims)
for f in bands]
print([round(c) for c in counts])
# [13, 77, 514, 3735, 28412, 221512, 1749162]
print(round(room.schroeder_frequency(reverberation, float(np.prod(dims))))) # 185
plt.bar(bands, counts, width=bands * 0.62)
plt.xscale("log"); plt.yscale("log")
plt.show()

La sala mientras la mides. apartado 4.1 de la ISO 3382-2: las mediciones de tiempo de reverberación «deberían hacerse en una sala sin personas», aunque pueden estar presentes hasta dos personas y seguir representando el estado desocupado salvo que la especificación diga otra cosa. Si el resultado se va a usar para corregir una medición de nivel, congela la ocupación: tiene que haber el mismo número de personas en las dos. Para las mediciones de precisión debe medirse normalmente la temperatura y la humedad relativa de la sala, tanto porque lo exige la norma como porque fijan el término de absorción del aire que consumen las guías de predicción. La excepción también está enunciada: la absorción del aire es despreciable cuando es más corto que 1,5 s a 2 kHz y 0,8 s a 4 kHz, y entonces no hace falta registrar el clima.

El brazo giratorio. El apartado 4.3.1 admite un micrófono en movimiento en lugar de posiciones discretas, con tres condiciones: un radio de barrido de al menos 0,7 m, un plano de recorrido al menos 10° fuera de todos los planos de la sala (pared, suelo, techo) y un periodo de recorrido de al menos 15 s. Sustituye a las múltiples posiciones de micrófono solo donde lo permita el grado de la Tabla 1: para el método de ruido interrumpido, y donde el resultado sea un término de corrección.

Qué debe llevar el informe (apartado 9.2). Una declaración de conformidad con la ISO 3382-2; lo suficiente para identificar la sala de forma unívoca; una planta acotada; el volumen; el estado de la sala (mobiliario, personas presentes); para el método de precisión, la temperatura y la humedad relativa; el tipo de fuente y una descripción de la señal; el grado de exactitud — control, ingeniería o precisión — con las posiciones de fuente y de micrófono, preferiblemente representadas sobre esa planta junto con sus alturas; los aparatos de medida y los micrófonos; el método de evaluación de las curvas de decaimiento; cómo se promedió el resultado en cada posición y entre posiciones; la tabla de resultados; y la fecha y la organización que midió. La ficha de la guía de acústica de salas lleva la mayoría de ellos como campos de ReportMetadata, pero la planta acotada con las posiciones encima hay que aportarla aparte.

La RI sale de esta página en varias direcciones. Filtrada en bandas y sometida a integración inversa de Schroeder se convierte en la curva de decaimiento cuya pendiente es el tiempo de reverberación: la guía de acústica de salas arranca exactamente ahí, y su hermana de oficinas diáfanas recorre la línea de puestos de trabajo de ISO 3382-3. Medidos a ambos lados de un cerramiento, los mismos barridos alimentan las diferencias de nivel del aislamiento acústico en campo. Y la distorsión armónica que el barrido exponencial empuja a tiempos de llegada negativos no siempre se descarta: leída a propósito, se convierte en el análisis de THD de la guía de distorsión por barrido sinusoidal.

  • Cubierto

    La adquisición determinista de la respuesta al impulso de sala de ISO 18233:2006: el barrido sinusoidal exponencial del Anexo B (room.sweep_signal, room.inverse_filter) con deconvolución espectral lineal (regularizada con Tikhonov) y la variante de filtro inverso de Farina (room.impulse_response, métodos "spectral" y "farina"), y las secuencias de longitud máxima del Anexo A (room.mls_signal, órdenes 2-20, room.mls_impulse_response por correlación cruzada circular). Los resultados son objetos ImpulseResponseResult que encajan sin cambios en room.room_parameters. Las reglas de dimensionado de la ISO 18233 (longitud de barrido y silencio del apartado B.3.1, ec. (10) del apartado 6.2.2.2 para el periodo de la MLS), los requisitos de equipo del apartado 4.2 de la ISO 3382-1 y las reglas de colocación de ISO 3382-1/-2 (separación, distancia a superficies, la distancia mínima a la fuente, la alternativa del brazo giratorio y los grados de exactitud) se citan para la planificación, junto con la lista de comprobación del informe del apartado 9.2.

  • No cubierto

    La reproducción y la grabación en sí (la E/S de la tarjeta de sonido, la calibración de nivel de la cadena) quedan fuera de la biblioteca. Los diagnósticos de varianza temporal y de distorsión de ISO 18233 no están implementados: la guía explica cómo el barrido separa la distorsión, pero ninguna función auxiliar la cuantifica (esa lectura vive en la guía de distorsión por barrido sinusoidal). Las reglas de posiciones son prosa de orientación: nada comprueba cuántas posiciones se midieron ni dónde.

¿Mido la respuesta al impulso de la sala con un barrido sinusoidal o con una MLS?

Sección titulada «¿Mido la respuesta al impulso de la sala con un barrido sinusoidal o con una MLS?»

Ambos son métodos de deconvolución de ISO 18233 que recuperan la respuesta al impulso con 20–30 dB más de relación señal-ruido efectiva que una fuente impulsiva. Prefiere el barrido sinusoidal exponencial (Anexo B): sitúa la distorsión armónica en tiempos de llegada negativos, donde se descarta. Usa la MLS (Anexo A) cuando la excitación deba ser periódica o el hardware favorezca una señal de dos niveles; es más sensible a la varianza temporal.