Ir al contenido

Parámetros acústicos de salas (ISO 3382-1/2)

Normas aplicables: ISO 3382Referencias: Kuttruff 2016Schroeder 1965Hak et al. 2012

La acústica de salas parte de una única medición: la respuesta al impulso (RI) entre una fuente y un receptor. Fíltrala en bandas e intégrala, y da el tiempo de reverberación, la claridad y el tiempo central: todo lo que ISO 3382-1/2 pregunta sobre el campo sonoro dentro de un único recinto. Esta página convierte una RI medida en esos parámetros: la curva de decaimiento de Schroeder, las ventanas de evaluación, las marcas de validez y la ficha acreditada. Adquirir la propia RI (barridos, MLS, dónde medir) vive en Medición de la respuesta al impulso, y las métricas del habla de oficinas diáfanas de ISO 3382-3 en Acústica de oficinas diáfanas. Dos mediciones de decaimiento separadas en una cámara reverberante, una con la sala vacía y otra con la probeta instalada, dan la absorción acústica de un material; ese método (ISO 354) vive en Medida y clasificación de la absorción sonora. Para el aislamiento acústico entre recintos (la misma RI medida a ambos lados de un cerramiento) consulta la guía complementaria Medición del aislamiento en campo (ISO 16283).

Análisis del decaimiento y parámetros de sala (ISO 3382-1/2)

Sección titulada «Análisis del decaimiento y parámetros de sala (ISO 3382-1/2)»

La RI se filtra en bandas de octava (o de tercio de octava) y cada banda se convierte en una curva de decaimiento mediante la integración inversa de Schroeder de la RI al cuadrado:

La integración inversa elimina la fluctuación que afecta a la RI al cuadrado en bruto y produce una curva suave cuya pendiente es la tasa de decaimiento. El ruido de fondo haría que se estabilizara, así que la integración se trunca donde la recta de decaimiento ajustada cruza el suelo de ruido y la cola que falta se compensa suponiendo un decaimiento exponencial.

Los tiempos de reverberación provienen de un ajuste lineal por mínimos cuadrados sobre un rango de evaluación, extrapolado a una caída completa de 60 dB, : EDT de 0 a −10 dB (reverberación percibida), T20 de −5 a −25 dB y T30 de −5 a −35 dB. Los repartos de energía en una frontera temprano/tardío dan la claridad y la definición,

con ms → C50 (habla) y ms → C80 (música), más el tiempo central . Cada parámetro tiene una diferencia apenas perceptible (ISO 3382-1 Tabla A.1: EDT 5 %, C80 1 dB, D50 0,05, Ts 10 ms) que fija con qué precisión merece la pena informarlo.

Dónde está . Las tres integrales de energía empiezan en la llegada del sonido directo, no al principio del archivo. La ISO 3382-1, A.3.4, sitúa ese punto donde la respuesta sube por primera vez de forma apreciable por encima del fondo estando todavía más de 20 dB por debajo de su máximo, y room_parameters aplica ese disparo banda a banda antes de integrar, de modo que cualquier retardo de propagación y de sistema que arrastre la grabación se elimina automáticamente: una RI medida no necesita recorte manual. Importa de forma asimétrica. Los tiempos de reverberación usan solo la pendiente del decaimiento y les da igual dónde empiece, pero C50, C80 y integran desde , así que un origen situado un milisegundo tarde deja fuera parte del sonido directo y puede mover C50 y C80 varios decibelios y decenas de milisegundos, dejando T20 y T30 casi intactos: el error es invisible en el número que todo el mundo comprueba. El detector yerra deliberadamente por el lado temprano, que es la dirección inofensiva. De ahí salen dos reglas de trabajo: no recortes nunca una RI a mano para quitarle el retardo previo, y desconfía de los C50/C80 de una grabación cuyo sonido directo sea débil o venga precedido de resonancias por un procesado externo, porque entonces el disparo puede llegar tarde.

La energía de la cola de la respuesta al impulso al cuadrado se rellena desde el final mientras la integral inversa avanza hacia t = 0, y la curva de decaimiento de Schroeder emerge en un eje inferior, terminando con las rectas de regresión T20 y T30.

Descargar la animación (WebM)

La energía de la cola de la respuesta al impulso al cuadrado se rellena desde el final mientras la integral inversa avanza hacia t = 0, y la curva de decaimiento de Schroeder emerge en un eje inferior, terminando con las rectas de regresión T20 y T30.

Descargar la animación (WebM)

Respuesta al impulso al cuadrado con su curva de decaimiento por integración inversa de Schroeder, y las ventanas de regresión EDT, T20 y T30 marcadasRespuesta al impulso al cuadrado con su curva de decaimiento por integración inversa de Schroeder, y las ventanas de regresión EDT, T20 y T30 marcadas

La RI al cuadrado dentada (gris) se integra hasta la curva suave de Schroeder (azul); las ventanas EDT, T20 y T30 se ajustan sobre esa curva y cada una se extrapola a un decaimiento de 60 dB.

import numpy as np
from phonometry import room
fs = 48000
# Decaimiento de pendiente única con T = 1 s: p^2 = exp(-13.8155 t) (60/ln(10)/13.8155 = 1)
t = np.arange(fs) / fs
# ir: respuesta al impulso de sala medida; aquí la sustituye un decaimiento sintético de pendiente única.
ir = np.concatenate([np.zeros(10), np.exp(-13.8155 * t / 2.0)])
time, level = room.decay_curve(ir, fs) # curva de Schroeder (0 dB en t = 0)
res = room.room_parameters(ir, fs, limits=None) # banda única de banda ancha
print(round(float(res.t30[0]), 2)) # 1.0 s
print(round(float(res.c80[0]), 2)) # 3.05 dB
print(round(float(res.d50[0]), 3)) # 0.499
print(round(float(res.ts[0]) * 1000, 0)) # 72 ms
# Bandas de octava 125 Hz - 4 kHz (por defecto en ISO 3382-1); usa fraction=3 para tercios
octaves = room.room_parameters(ir, fs)
print(octaves.frequency) # ~[126, 251, 501, 1000, 1995, 3981]
print(octaves.t30_valid) # indicadores de rango dinámico por banda
octaves.plot() # barras EDT/T20/T30 + C50/C80 por banda (requiere matplotlib)
room.decay_curve(ir, fs).plot() # curva de Schroeder con los ajustes EDT/T20/T30
Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import room
fs = 48000
# Decaimiento de pendiente única con T = 1 s: p^2 = exp(-13.8155 t) (60/ln(10)/13.8155 = 1)
t = np.arange(fs) / fs
# ir: respuesta al impulso de sala medida; aquí la sustituye un decaimiento sintético de pendiente única.
ir = np.concatenate([np.zeros(10), np.exp(-13.8155 * t / 2.0)])
time, level = room.decay_curve(ir, fs) # curva de Schroeder (0 dB en t = 0)
# En una línea — la curva de Schroeder con los ajustes rectos EDT/T20/T30:
decay = room.decay_curve(ir, fs) # un DecayCurve (se sigue desempaquetando como time, level)
decay.plot(language="es")
plt.show()
# A mano, el decaimiento es solo la curva de Schroeder; marca los niveles de evaluación:
fig, ax = plt.subplots()
ax.plot(time, level, color="#1f77b4", label="Curva de Schroeder")
for db in (-5.0, -25.0, -35.0): # bordes de la ventana de evaluación T20 / T30
ax.axhline(db, ls=":", alpha=0.4)
ax.set_xlabel("Tiempo [s]")
ax.set_ylabel("Nivel re estado estacionario [dB]")
ax.set_ylim(top=3.0)
ax.legend()
plt.show()

Para este decaimiento de pendiente única, EDT, T20 y T30 devuelven todos ≈ 1,0 s, y los parámetros de energía coinciden con sus formas cerradas (C80 = 3,05 dB, D50 = 0,499, Ts = 72 ms). Una sala real tiene una pendiente inicial más pronunciada, así que EDT < T30.

Qué significan los parámetros de energía. C50 y D50 son la misma medida en dos unidades, ligadas por — la pareja impresa arriba la cumple, ya que = 0,499 da = −0,02 dB —, así que un espacio para el habla que apunte a está apuntando a dB, y no tiene sentido citar los dos como si fueran pruebas independientes. Para música, el C80 de salas de conciertos y polivalentes desocupadas de hasta 25 000 m³ suele ir entre −5 dB y +5 dB (la columna de «intervalo típico» de la Tabla A.1 de la ISO 3382-1), donde los valores negativos se leen como sala mezclada o reverberante y los superiores a unos +3 dB como seca; el de esas mismas salas va entre 60 ms y 260 ms y se mueve en sentido inverso a la claridad, y el entre 0,3 y 0,7. Con esos intervalos van dos cautelas. Son valores de una sola posición en salas desocupadas, y el público acorta el decaimiento y sube la claridad, así que una sala ocupada no queda descrita por ellos. Y a diferencia del T30, los parámetros de energía son magnitudes de energía temprana que varían mucho de butaca en butaca, así que un valor de una sola posición dice poco: declara la media espacial con su dispersión (más abajo). La columna de DAP fija la resolución de declaración en el otro sentido: una diferencia de 0,5 dB de C80 entre dos diseños no es ninguna diferencia.

Sobre un decaimiento real, dependiente de la frecuencia, el .plot() por bandas es el resumen de trabajo de toda la medición: los tiempos de caída como barras agrupadas por octava (bandas no válidas rayadas) sobre un segundo panel con C50 y C80.

Parámetros por banda ISO 3382 de una respuesta al impulso sintética de sala: barras agrupadas de EDT, T20 y T30 por banda de octava que caen de unos 1,4 s a 125 Hz a 0,7 s a 4 kHz, sobre un segundo panel donde C50 y C80 suben con la frecuenciaParámetros por banda ISO 3382 de una respuesta al impulso sintética de sala: barras agrupadas de EDT, T20 y T30 por banda de octava que caen de unos 1,4 s a 125 Hz a 0,7 s a 4 kHz, sobre un segundo panel donde C50 y C80 suben con la frecuencia

Una sala cuyo tiempo de reverberación cae de 1,4 s a 125 Hz a 0,7 s a 4 kHz, la firma típica de una sala amueblada cuya absorción crece con la frecuencia; la claridad sube a medida que el decaimiento se acorta.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
from phonometry import room
# Una RIR sintética con decaimiento dependiente de la frecuencia: portadoras
# de ruido por banda de octava cuyo T60 cae de 1,4 s a 125 Hz a 0,7 s a 4 kHz.
fs = 48000
rng = np.random.default_rng(3382)
t = np.arange(int(1.6 * fs)) / fs
ir = np.zeros_like(t)
for fc, t60 in [(125.0, 1.4), (250.0, 1.25), (500.0, 1.1),
(1000.0, 1.0), (2000.0, 0.85), (4000.0, 0.7)]:
sos = signal.butter(4, [fc / np.sqrt(2), fc * np.sqrt(2)],
btype="bandpass", fs=fs, output="sos")
carrier = signal.sosfilt(sos, rng.standard_normal(t.size))
ir += carrier * np.exp(-3.0 * np.log(10.0) / t60 * t)
# Una línea: barras EDT/T20/T30 por banda + C50/C80 (requiere matplotlib).
octaves = room.room_parameters(ir, fs)
octaves.plot(language="es")
plt.show()
# A mano: el espectro de T30 desde los campos del resultado.
fig, ax = plt.subplots()
ax.bar(np.arange(octaves.t30.size), octaves.t30)
ax.set_xticks(np.arange(octaves.t30.size))
ax.set_xticklabels([f"{f:g}" for f in octaves.frequency])
ax.set_xlabel("Frecuencia central de banda de octava [Hz]")
ax.set_ylabel("T30 [s]")
plt.show()

Los tres tiempos extrapolan el mismo decaimiento de 60 dB desde ventanas distintas, así que su desacuerdo lleva información:

  • T20 ≈ T30 (curvatura por debajo del 10 %): el decaimiento se acerca a una única pendiente recta en ambas ventanas de evaluación, algo compatible con un campo difuso (aunque no lo demuestra), y cualquiera de los dos tiempos puede representar «el» tiempo de reverberación de la banda.
  • T30 > T20 (curvatura por encima del 10 %): el decaimiento se comba, con la energía tardía decayendo más despacio que la temprana. Las causas habituales son volúmenes acoplados (una puerta abierta a un pasillo o a una escalera, un anfiteatro profundo o una caja escénica devolviendo energía) y una absorción muy desigual que deja reverberante un eje de la sala. Ningún número único describe ese decaimiento: informa de ambas ventanas junto con la curvatura, y trata con recelo las predicciones estadísticas, porque su hipótesis de campo difuso ha fallado a la vista.
  • EDT lejos de T20/T30: el EDT se ajusta donde aún dominan el sonido directo y las primeras reflexiones, así que varía de butaca en butaca mientras el T30 apenas se mueve. Un EDT por debajo del T30 dice que la posición recibe mucha energía temprana (cerca de la fuente, bajo un reflector): la sala suena allí más seca de lo que sugiere su T30, porque la reverberación percibida sigue al EDT. Un EDT por encima del T30 en una butaca apunta a un eco o a una superficie focalizante que concentra allí energía tardía.

Los tres casos son tres formas, y merece la pena verlas una al lado de la otra antes de tener que diagnosticar alguna.

Tres paneles que comparten el eje de nivel, cada uno con la curva de decaimiento de Schroeder de una respuesta al impulso sintética y con su EDT, T20, T30 y curvatura impresos: un decaimiento recto de pendiente única con curvatura cercana a cero, un decaimiento combado de dos exponenciales con un codo visible y una curvatura muy por encima del diez por ciento, y un decaimiento precedido de un sonido directo fuerte y una reflexión temprana cuyo tiempo de decaimiento inicial cae muy por debajo del T30Tres paneles que comparten el eje de nivel, cada uno con la curva de decaimiento de Schroeder de una respuesta al impulso sintética y con su EDT, T20, T30 y curvatura impresos: un decaimiento recto de pendiente única con curvatura cercana a cero, un decaimiento combado de dos exponenciales con un codo visible y una curvatura muy por encima del diez por ciento, y un decaimiento precedido de un sonido directo fuerte y una reflexión temprana cuyo tiempo de decaimiento inicial cae muy por debajo del T30

Tres decaimientos, un mismo eje, todos leídos por room_parameters. A la izquierda, una única exponencial con = 1,0 s: EDT, T20 y T30 devuelven todos 1,00 s y la curvatura es del −0,1 %. En el centro, un volumen acoplado — el 98 % de la energía decayendo a 0,6 s sobre una cola de 2,5 s — que pone un codo visible en la curva de Schroeder y devuelve EDT 0,72 s, T20 1,78 s, T30 2,18 s y una curvatura del 23 %: ningún número único lo describe. A la derecha, la misma cola de 1,0 s precedida de un racimo de reflexiones tempranas fuertes en los primeros 25 ms: T20 y T30 quedan intactos en 0,99 s y 1,00 s, la curvatura se queda en el 0,5 % y el EDT se desploma a 0,58 s — la butaca suena más seca de lo que dice su tiempo de reverberación, y solo el EDT lo sabe.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
# `np`, `fs` y `room` son las importaciones del bloque de decaimiento de arriba.
rng = np.random.default_rng(3382)
span = np.arange(int(4.0 * fs)) / fs
def energy(t60): # la envolvente de p^2 de un decaimiento T60 = t60
return np.exp(-6.0 * np.log(10.0) / t60 * span)
noise = rng.standard_normal(span.size)
tail = noise * np.sqrt(energy(1.0))
early = tail.copy() # un racimo de reflexiones tempranas fuertes
amplitude = np.sqrt(6.0 * float(np.sum(tail ** 2)) / 8.0)
for k, i in enumerate(np.linspace(0, int(0.025 * fs), 8).astype(int)):
early[i] += amplitude * 0.85 ** k * (1.0 if k % 2 == 0 else -1.0)
cases = {
"pendiente única": tail,
"volumen acoplado": noise * np.sqrt(0.98 * energy(0.6) + 0.02 * energy(2.5)),
"energía temprana fuerte": early,
}
fig, axes = plt.subplots(1, 3, sharey=True, figsize=(13.0, 4.4))
for ax, (name, signal) in zip(axes, cases.items()):
res = room.room_parameters(signal, fs, limits=None)
room.decay_curve(signal, fs).plot(ax=ax, language="es")
ax.set_title(f"{name}\nEDT {res.edt[0]:.2f} T20 {res.t20[0]:.2f} "
f"T30 {res.t30[0]:.2f} C {res.curvature[0]:.0f} %")
plt.show()

Cuánto rango de decaimiento permite el suelo de ruido

Sección titulada «Cuánto rango de decaimiento permite el suelo de ruido»

Una ventana de ajuste vale lo que el rango de decaimiento que tiene debajo. La relación impulso-ruido (INR) es la distancia de nivel entre el pico de la RI filtrada en banda y su suelo de ruido; la ventana de ajuste más un margen de seguridad debe caber dentro de ella, que es el requisito ISO 3382 de al menos 35 dB de rango útil de decaimiento para T20 y 45 dB para T30. Un rango escaso sesga el tiempo ajustado hacia arriba, hacia la cola plana que el suelo de ruido impone a la curva de decaimiento, y el sesgo crece en silencio antes de que el ajuste falle a la vista (Hak, Wenmaekers y van Luxemburg, 2012). room_parameters declara esa INR por banda como dynamic_range y endurece los límites de aceptación a 46 dB (T20) y 54 dB (T30) antes de marcar un valor como válido, de modo que el sesgo residual de truncado y compensación de un tiempo marcado válido quede dentro del 5 %: la DAP relativa que la Tabla A.1 tabula para el EDT y el valor que por costumbre se aplica a T20 y T30, para los que la tabla no da ninguna. Cuando una banda no supera su indicador, el orden de remedios es: usa T20 en lugar de T30 (su ventana necesita 10 dB menos de rango según los mínimos ISO, 8 dB con los límites endurecidos); sube la INR en la adquisición, porque duplicar la longitud del barrido o el número de promedios síncronos gana 3 dB cada vez; y solo entonces recurre al EDT, nunca a un ajuste estirado dentro del ruido.

De dónde sale el suelo de ruido, y cómo perderlo. El nivel de fondo se estima a partir de la última décima parte de la respuesta recortada por el origen, así que la grabación tiene que contener de verdad el fondo estacionario de la sala después de que el decaimiento haya terminado: medio segundo o más. Un archivo recortado al decaimiento audible, o un length= fijado solo al decaimiento, hace que el analizador mida señal decayendo como si fuera ruido: el suelo estimado queda demasiado alto, el punto de truncado se adelanta, la cola compensada se calcula desde el cruce equivocado y las marcas de validez por banda se aplican a un rango dinámico ficticio, todo ello sin error ni aviso. Graba silencio después de la excitación (el mismo silencio que pide la ISO 18233, 6.2.2.3), consérvalo en el archivo y deja que room_parameters encuentre el cruce en lugar de recortar a ojo. El diagnóstico de este fallo: un dynamic_range inverosímilmente grande en una banda que debería ser ruidosa, junto con una curvatura cercana a cero, es la firma de una cola de ruido ausente.

Todo el balance cabe en un dibujo, y el sesgo que controla también.

Nivel frente al tiempo de una respuesta al impulso filtrada en una banda: el pico en 0 dB, la respuesta al impulso al cuadrado cayendo como una recta, una meseta horizontal de ruido de fondo en menos 55 decibelios, una acotación vertical entre ambos etiquetada INR, el cruce de la recta ajustada con la estimación de ruido marcado como punto de truncado y la región posterior sombreada como cola compensada, y a la derecha una regla apilada con las ventanas de evaluación de EDT, T20 y T30, cada una con una prolongación rayada de margen de 15 decibelios y los umbrales de indicador de 46 y 54 decibelios marcados frente a la acotación de INRNivel frente al tiempo de una respuesta al impulso filtrada en una banda: el pico en 0 dB, la respuesta al impulso al cuadrado cayendo como una recta, una meseta horizontal de ruido de fondo en menos 55 decibelios, una acotación vertical entre ambos etiquetada INR, el cruce de la recta ajustada con la estimación de ruido marcado como punto de truncado y la región posterior sombreada como cola compensada, y a la derecha una regla apilada con las ventanas de evaluación de EDT, T20 y T30, cada una con una prolongación rayada de margen de 15 decibelios y los umbrales de indicador de 46 y 54 decibelios marcados frente a la acotación de INR

El balance de niveles de una banda. La INR es todo el espacio vertical del que dispones; la ventana de evaluación más el margen de 15 dB del apartado 5.3.3 de la ISO 3382-1 tiene que caber dentro, que es de donde salen los 35 dB (T20) y los 45 dB (T30). La integración se detiene donde la recta ajustada cruza la estimación de fondo, y la cola posterior se sustituye por la continuación exponencial del ajuste: una compensación cuyo sesgo residual es positivo, y por eso phonometry añade otros 11 dB y 9 dB de holgura antes de dar una banda por válida.

Error porcentual del T20 y del T30 ajustados frente al rango dinámico devuelto, de 25 a 80 decibelios, para un decaimiento sintético de un segundo: ambos errores son positivos y crecen al reducirse el rango dinámico, el T30 sale de la banda sombreada de más menos cinco por ciento por debajo de unos 54 decibelios y el T20 por debajo de unos 46 decibelios, con marcas verticales en los mínimos ISO de 35 y 45 decibelios y la región marcada como no válida rayadaError porcentual del T20 y del T30 ajustados frente al rango dinámico devuelto, de 25 a 80 decibelios, para un decaimiento sintético de un segundo: ambos errores son positivos y crecen al reducirse el rango dinámico, el T30 sale de la banda sombreada de más menos cinco por ciento por debajo de unos 54 decibelios y el T20 por debajo de unos 46 decibelios, con marcas verticales en los mínimos ISO de 35 y 45 decibelios y la región marcada como no válida rayada

Un decaimiento sintético de = 1,0 s con su suelo de ruido barrido, medido con room_parameters. El sesgo es siempre positivo — la cola plana de ruido solo puede hacer que el decaimiento ajustado parezca más largo — y crece al reducirse el rango: +0,4 % con 70 dB, +1,3 % (T30) con 61 dB, +3,1 % con 55 dB, +6,6 % con 46 dB y +8,8 % para el T20 con 37 dB, justo por encima del mínimo ISO. Ese es todo el argumento a favor de los indicadores endurecidos: con los propios mínimos de la ISO de 35 dB y 45 dB el sesgo que sobrevive ya queda fuera de la DAP del 5 %, y solo con 46 dB y 54 dB cae dentro. Por debajo de unos 34 dB el ajuste ni siquiera converge y los parámetros devuelven NaN, que es el fallo visible al que el sesgo se va acercando.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
# `np`, `fs` y `room` son las importaciones del bloque de decaimiento de arriba.
rng = np.random.default_rng(3382)
grid = np.arange(int(3.0 * fs)) / fs
clean = rng.standard_normal(grid.size) * np.exp(-3.0 * np.log(10.0) * grid)
noise = rng.standard_normal(grid.size)
peak = float(np.max(np.abs(clean)))
ranges, bias20, bias30 = [], [], []
for inr in range(25, 81, 3):
res = room.room_parameters(clean + noise * peak * 10 ** (-inr / 20.0),
fs, limits=None)
ranges.append(float(res.dynamic_range[0]))
bias20.append(100.0 * (float(res.t20[0]) - 1.0))
bias30.append(100.0 * (float(res.t30[0]) - 1.0))
fig, ax = plt.subplots()
ax.plot(ranges, bias20, "-o", label="T20")
ax.plot(ranges, bias30, "-s", label="T30")
ax.axhspan(-5.0, 5.0, alpha=0.15)
for limit, name in ((35.0, "ISO T20"), (45.0, "ISO T30"),
(46.0, "indicador T20"), (54.0, "indicador T30")):
ax.axvline(limit, ls=":", alpha=0.6)
ax.set_xlabel("dynamic_range (INR) [dB]")
ax.set_ylabel("Error del tiempo de decaimiento ajustado [%]")
ax.legend()
plt.show()

Por debajo de la frecuencia de Schroeder: modos, no decaimiento

Sección titulada «Por debajo de la frecuencia de Schroeder: modos, no decaimiento»

Por debajo de la frecuencia de Schroeder ( en m³, en s) estas estadísticas de caída dejan de contar toda la historia: el campo lo gobiernan modos propios discretos. La constante no es una constante física. Cada modo amortiguado hasta un tiempo de reverberación tiene una anchura de banda a media potencia de unos hercios, la densidad modal crece como , y exigir aproximadamente tres modos dentro de una anchura de banda da : una elección de cuánto solapamiento cuenta como difuso, que es la razón de que los textos más estrictos citen 4000 para la misma física. La transición es suave, así que una banda que quede a caballo de debe comprobarse posición a posición en lugar de darse por buena, y la escalera de modos de la guía de fuentes imagen enumera lo que hay ahí abajo de verdad. La simulación siguiente excita la misma sala rígida de 5 m por 3,5 m en su modo (2,1) y después entre dos modos; en resonancia un patrón de onda estacionaria con líneas nodales fijas crece hasta dominar el mapa de presión RMS, fuera de resonancia la sala sigue respondiendo, pero el campo forzado se mantiene débil y nunca se organiza en ese patrón nodal (2,1).

Simulación FDTD 2D de una sala rígida de 5 por 3,5 metros excitada en el modo (2,1) de 84 Hz y en una frecuencia fuera de modo, lado a lado. En resonancia un patrón de onda estacionaria con líneas nodales fijas crece hasta dominar el mapa de presión RMS; fuera de resonancia la respuesta forzada se mantiene débil y nunca se organiza en esa estructura nodal.

Descargar la animación (WebM)

Simulación FDTD 2D de una sala rígida de 5 por 3,5 metros excitada en el modo (2,1) de 84 Hz y en una frecuencia fuera de modo, lado a lado. En resonancia un patrón de onda estacionaria con líneas nodales fijas crece hasta dominar el mapa de presión RMS; fuera de resonancia la respuesta forzada se mantiene débil y nunca se organiza en esa estructura nodal.

Descargar la animación (WebM)

ParámetroTipoUnidadesRango / valor por defectoNotas
irarray 1Dcualquierano silenciosoRespuesta al impulso medida
fsintHz> 0Frecuencia de muestreo
limits(float, float) o NoneHzpor defecto (125.0, 4000.0)Límites de centros de banda; None = banda única de banda ancha
fractionint1 (octava, por defecto) / 3 (tercio)Fracción de ancho de banda
zero_phasebooldefecto FalseFiltrado de octava hacia delante y atrás (NOTA de ISO 3382-2, 7.3, que relaja a ); elimina el retardo de grupo del filtro antes de la integración inversa y reduce aproximadamente a la mitad el sesgo de T30 corto a 125 Hz (~+4,9 % → +2,4 % con = 0,2 s). decay_curve también lo acepta

es el producto anchura de banda por tiempo: la anchura de banda de la banda de análisis en hercios y el tiempo de reverberación en esa banda, en segundos. Los dos símbolos de esa celda no son el mismo que el del filtro: « = 0,2 s» se refiere al tiempo de reverberación. La octava de 125 Hz mide unos 88 Hz de ancho, así que un decaimiento de 0,2 s da y apenas supera el umbral de 16 del apartado 7.3 de la ISO 3382-2; reduce el decaimiento a la mitad o pasa a tercios de octava y ya no lo supera, que es el régimen para el que existe la relajación de la NOTA.

Devuelve un RoomAcousticsResult: frequency (centros de banda, o None en banda ancha), edt/t20/t30 (s), c50/c80 (dB), d50, ts (s), dynamic_range (dB, la INR por banda: pico filtrado en banda menos suelo de ruido), los indicadores edt_valid/t20_valid/t30_valid (ISO 3382-1, 5.3.3: ruido ≥ 25 dB por debajo del pico para EDT, endurecido a 46 dB para T20 y 54 dB para T30 para que el sesgo de compensación de cola de un valor marcado como válido quede dentro de la DAP del 5 %) y curvature % (valores por encima del 10 % señalan un decaimiento no recto). decay_curve(ir, fs, band=None, fraction=1, zero_phase=False) devuelve solo la curva (time, level) para una banda o la respuesta de banda ancha.

Todo lo anterior analiza una única respuesta al impulso; un parámetro de sala declarado nunca es una única respuesta al impulso. El apartado 8 de la ISO 3382-2 da dos procedimientos admisibles, y el que implementa esta API es el primero: la media aritmética de los tiempos de reverberación individuales sobre todas las combinaciones fuente-micrófono independientes (la alternativa, promediar el conjunto de curvas de decaimiento con sus inicios sincronizados, es otra operación y no es lo que hace promediar t30). Con ella viajan cuatro reglas. La desviación típica entre posiciones forma parte de la respuesta, no es un añadido de diagnóstico, y debe declararse siempre que supere la DAP del parámetro. , el descriptor de sala de número único habitual, es la media de las octavas de 500 Hz y 1 kHz. Los parámetros de energía varían entre butacas mucho más que el T30, así que su dispersión es el número interesante y no una molestia. Y una banda que no supera su marca de validez en algunas posiciones no debe colarse en la media sin más: enmascárala y di cuántas posiciones sobrevivieron.

# `np`, `fs` y `room` son las importaciones del bloque de decaimiento de arriba.
# medida: una respuesta al impulso por combinación fuente-micrófono. Tres
# decaimientos sintéticos de 0,95, 1,00 y 1,08 s hacen de tres posiciones.
rng = np.random.default_rng(3382)
grid = np.arange(int(3.0 * fs)) / fs
responses = [rng.standard_normal(grid.size) * np.exp(-3.0 * np.log(10.0) / t60 * grid)
for t60 in (0.95, 1.00, 1.08)]
results = [room.room_parameters(each, fs) for each in responses]
t30 = np.array([res.t30 for res in results])
valid = np.array([res.t30_valid for res in results])
mean = np.nanmean(np.where(valid, t30, np.nan), axis=0)
spread = np.nanstd(np.where(valid, t30, np.nan), axis=0)
print(np.round(mean, 2)) # [0.99 1. 1.02 1.02 1.03 1.01] s
print(np.round(100.0 * spread / mean, 1)) # [4. 4.7 4.8 5.1 4.9 4.8] %
print(int(valid.sum(axis=0).min())) # 3 posiciones superaron la marca

Aquí la dispersión va del 4 al 5 %, justo en la DAP, así que le corresponde ir en el informe junto a la media: tres posiciones que coinciden dentro de un 5 % son tres posiciones que discrepan de forma audible. Fíjate también en para qué sirve la máscara: np.nanmean sobre el array enmascarado es la media aritmética que prescribe el apartado 8 a), pero solo sobre las combinaciones cuya banda haya superado de verdad la marca, y el número de supervivientes forma parte del resultado.

RoomAcousticsResult.report(path) genera una ficha PDF de una página con el formato de un informe de medición de acústica de salas (una sala de espectáculos según la ISO 3382-1:2009 o una sala ordinaria según la ISO 3382-2:2008, ambos evaluados por el método de la respuesta al impulso integrada): una línea de base normativa, un bloque opcional de metadatos de cabecera, la tabla de parámetros por bandas a ancho completo (, , EDT, , , , ) sobre la gráfica de tiempos de caída por banda del propio resultado (.plot()), el resultado enmarcado del tiempo de reverberación de frecuencias medias (la media de los de las octavas de 500 Hz y 1000 Hz, el descriptor habitual de la sala) con el EDT de medias al lado, y un pie con el descargo de responsabilidad fijo. La ISO 3382-1/-2 son normas de caracterización sin cumple/no cumple intrínseco, por lo que solo aparece una fila de veredicto cuando se aporta un tiempo de reverberación de medias objetivo mediante el campo requirement de los metadatos (ReportMetadata(requirement=...), leído como el máximo aceptable, la forma habitual de un límite de aula u oficina diáfana). Un resultado de banda ancha no tiene octavas de 500 Hz / 1000 Hz que promediar, de modo que su recuadro y su veredicto recurren al de banda ancha sin afirmación de «500-1000 Hz». Usa el mismo contenedor ReportMetadata y el mismo motor de renderizado que la ficha de absorción ISO 11654; los campos específicos de sala room_volume, source_positions y receiver_positions rellenan la cabecera (la ISO 3382 exige indicar el volumen de la sala y el número de posiciones de fuente y de micrófono), junto con test_room (el nombre de la sala), specimen (la descripción de la sala y su estado de ocupación), area, instrumentation, temperature, relative_humidity, pressure, measurement_standard, test_date, laboratory, operator, report_id y notes. Al pasar metadata=None se obtiene una ficha de caracterización mínima. El renderizado necesita reportlab y, para la figura que incrusta la ficha, matplotlib (pip install "phonometry[report,plot]"); solo se admite engine="reportlab". La ficha se genera en inglés por defecto; pasa language="es" para una ficha en español (cadenas fijas traducidas y separador decimal de coma).

from phonometry import room, ReportMetadata
result = room.room_parameters(ir, fs) # bandas de octava 125 Hz - 4 kHz
result.report(
"ficha_sala.pdf",
metadata=ReportMetadata(
# El estado de la sala que pide el apartado 9.2 e): amueblamiento y
# número de personas presentes (el apartado 4.1 admite como mucho dos
# para representar el estado desocupado).
specimen="Auditorio pequeño, totalmente amueblado, desocupado (1 operador presente)",
test_room="Auditorio A",
room_volume=2830.0, area=340.0,
source_positions=2, receiver_positions=8,
# El apartado 9.2 i) exige declarar el grado de exactitud.
measurement_standard="ISO 3382-2 (grado de ingeniería)",
temperature=21.0, relative_humidity=45.0,
laboratory="Laboratorio de referencia Phonometry",
notes="16 combinaciones fuente-micrófono, 2 decaimientos cada una; "
"posiciones y alturas en la planta acotada adjunta",
requirement=1.3, # añade un veredicto frente a un T_mid objetivo
),
) # T_mid + la tabla de parámetros por banda

Tres de esas entradas están ahí porque el apartado 9.2 de la ISO 3382-2 las pide y la ficha no tiene un campo propio para ninguna. El apartado 9.2 i) exige el grado de exactitud — control, ingeniería o precisión —, así que le corresponde ir en measurement_standard en lugar de quedar sobreentendido. El apartado 9.2 e) exige el estado de la sala, el amueblamiento y el número de personas presentes, y el apartado 4.1 fija lo que puede significar «desocupada»: sin personas, o como mucho dos autorizadas a representar el estado desocupado salvo que se especifique otra cosa; eso va en specimen. Y los apartados 9.2 c) e i) juntos exigen una planta acotada con las posiciones de fuente y de micrófono y sus alturas, que la ficha no dibuja: elabórala aparte y remite a ella, como hace aquí notes. El apartado 9.2 f) añade la temperatura y la humedad relativa solo para el método de precisión, que los campos de clima ya llevan.

La ficha de ejemplo se regenera con make reports y se mantiene renderizada en el repositorio; pulsa la vista previa para abrir el PDF.

Informe de ejemplo de parámetros acústicos de salas ISO 3382 (PDF)

Ficha de acústica de salas de una página: una cabecera de metadatos (cliente, sala, descripción, volumen de la sala, superficie del suelo, posiciones de fuente y de micrófono, instrumentación, temperatura, humedad y presión), la tabla de parámetros por bandas de octava (T20, T30, EDT, C50, C80, D50 y Ts de 125 Hz a 4 kHz) sobre la gráfica de barras de tiempos de caída por banda, el tiempo de reverberación de medias enmarcado T_mid = 1,15 s con el EDT de medias al lado, y un veredicto CUMPLE frente al objetivo de 1,3 s.

Descargar el informe (PDF)

Ficha de parámetros acústicos de salas (RoomAcousticsResult.report), T_mid y la tabla por banda.

Con los parámetros en la mano, los dos eslabones vecinos de la cadena son la adquisición que produjo la respuesta al impulso (Medición de la respuesta al impulso) y, para una planta diáfana en lugar de una sala cerrada, la línea de puestos de trabajo de la ISO 3382-3 (Acústica de oficinas diáfanas).

  • Cubierto

    La ISO 3382-1:2009 (apartado 5.3.3 de integración inversa y las fórmulas de parámetros del anexo A) y la ISO 3382-2:2008 (apartado 6 y el criterio de rango dinámico del apartado 5.3.3), calculados por room.room_parameters/room.decay_curve: EDT, T20, T30, C50, C80, D50, Ts y las marcas de validez y curvatura por banda, con el filtrado de fase cero opcional de la NOTA del apartado 7.3 de ISO 3382-2, y la ficha ISO 3382 de una página con .report().

  • No cubierto

    El anexo A de la ISO 3382-1 también define la fuerza acústica y los parámetros binaurales LF/LFC e IACC; phonometry implementa solo la familia de reverberancia y claridad citada arriba (EDT, T20, T30, C50, C80, D50, Ts). La adquisición de la respuesta al impulso (ISO 18233) y las magnitudes de oficina diáfana (ISO 3382-3) tienen guías propias, Medición de la respuesta al impulso y Acústica de oficinas diáfanas. La absorción en cámara reverberante de ISO 354 que consume el par / medido vive en Medida y clasificación de la absorción sonora.

Cada banda de la respuesta al impulso se convierte en una curva de decaimiento mediante la integración inversa de Schroeder de la RI al cuadrado, y una recta ajustada por mínimos cuadrados sobre un rango de evaluación se extrapola a una caída completa de 60 dB, (ISO 3382-1/2): EDT de 0 a −10 dB (reverberación percibida), T20 de −5 a −25 dB y T30 de −5 a −35 dB.

¿Cuánto rango de decaimiento necesito para un T20 o T30 válido?

Sección titulada «¿Cuánto rango de decaimiento necesito para un T20 o T30 válido?»

La ventana de ajuste más un margen de seguridad debe caber dentro de la relación impulso-ruido (res.dynamic_range), la distancia de nivel entre el pico de la RI filtrada en banda y su suelo de ruido: la ISO 3382 exige al menos 35 dB de rango útil de decaimiento para T20 y 45 dB para T30. Un rango escaso sesga el tiempo ajustado hacia arriba, así que room_parameters endurece sus indicadores de validez a 46 dB y 54 dB, manteniendo el sesgo dentro de la DAP del 5 %. El suelo de ruido se estima a partir de la última décima parte de la respuesta, así que la grabación debe contener silencio después del decaimiento.

  • Hak, C. C. J. M., Wenmaekers, R. H. C. y van Luxemburg, L. C. J. (2012). Measuring room impulse responses: Impact of the decay range on derived room acoustic parameters. Acta Acustica united with Acustica, 98(6), 907-915. https://doi.org/10.3813/aaa.918574El análisis de la INR que sustenta la discusión del rango dinámico y los indicadores de validez endurecidos de esta página.
  • International Organization for Standardization. (2008). Acoustics — Measurement of room acoustic parameters — Part 2: Reverberation time in ordinary rooms (ISO 3382-2:2008). Los grados de exactitud y el criterio de rango dinámico tras el análisis del decaimiento; sus reglas de posiciones se aplican en la guía de medición de la respuesta al impulso.
  • International Organization for Standardization. (2009). Acoustics — Measurement of room acoustic parameters — Part 1: Performance spaces (ISO 3382-1:2009). Las definiciones de parámetros y las diferencias apenas perceptibles tras el análisis del decaimiento.
  • Kuttruff, H. (2016). Room acoustics (6.ª ed.). CRC Press. https://doi.org/10.1201/9781315372150La monografía de referencia que sustenta esta página: la teoría estadística de los campos sonoros en decaimiento, la frecuencia de Schroeder y los parámetros perceptivos de sala de esta página.
  • Schroeder, M. R. (1965). New method of measuring reverberation time. The Journal of the Acoustical Society of America, 37(3), 409-412. https://doi.org/10.1121/1.1909343El método de integración inversa que convierte la respuesta al impulso al cuadrado en la curva suave de decaimiento de esta página.