<!-- canonical: https://jmrplens.github.io/phonometry/es/buildings/rooms/room-impulse-response/ -->
Source: https://jmrplens.github.io/phonometry/es/buildings/rooms/room-impulse-response/

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](/phonometry/es/buildings/rooms/room-acoustics/);
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)](/phonometry/es/buildings/insulation/insulation-field/).

## Dos excitaciones deterministas (ISO 18233)

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.

*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.*

<details>
<summary>Mostrar el código de esta figura</summary>

```python

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()
```

</details>

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

$$
f(t) = f_1 \left( \frac{f_2}{f_1} \right)^{t/T},
$$

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),

$$
H = \frac{Y\ \overline{X}}{|X|^2 + \varepsilon},
$$

con un pequeño término de Tikhonov $\varepsilon$ 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 $k$-é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

$$
\Delta t_k = T\,\frac{\ln k}{\ln (f_2/f_1)} .
$$

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
$t = 0$ 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.

*`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
$-\Delta t_k$, y el retorno por defecto sencillamente se queda con la mitad
sombreada.*

<details>
<summary>Mostrar el código de esta figura</summary>

```python

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()
```

</details>

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 $N$ y longitud $2^N-1$ 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.

### Dimensionar la excitación

Las dos excitaciones se dimensionan frente a un único número que el lector ya
tiene: el tiempo de reverberación $T$ 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 $T$ más largo esperado**, seguida de un **hueco de silencio de aproximadamente
un $T$**; 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 $T$. 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 $T$**, 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 $N$ es $(2^N-1)/f_\mathrm{s}$, eso fija el orden:

$$
N \geq \frac{\lg\!\left(T f_\mathrm{s} + 1\right)}{\lg 2} .
$$

A 48 kHz, el orden 16 da 1,37 s y el orden 18 da 5,46 s, y una sala con
$T = 1,5$ 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 $T$ 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.

```python

# `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)
```

*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 $\Delta\vartheta \leq 200/(f\,T)$ °C para una medición de tiempo
de reverberación.*

<details>
<summary>Mostrar el código de esta figura</summary>

```python

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()
```

</details>

```python

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](/phonometry/es/signals/spectra/system-measurement/) 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.

<details>
<summary>Mostrar el código de esta figura</summary>

```python
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

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)")
```

</details>

## La respuesta al impulso recuperada

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](/phonometry/es/buildings/rooms/room-acoustics/).

<details>
<summary>Mostrar el código de esta figura</summary>

```python

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

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]")
```

</details>

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 $T_\mathrm{s}$, 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()`

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `fs` | int | Hz | > 0 | Frecuencia de muestreo |
| `f1` | float | Hz | > 0, en/por debajo de la banda más baja | Frecuencia inicial del barrido |
| `f2` | float | Hz | `f1 < f2 <= fs/2` | Frecuencia final del barrido |
| `seconds` | float | s | 2–4 × la T más larga esperada | Duración del barrido; ver «Dimensionar la excitación» más arriba |
| `amplitude` | float | — | por defecto `1.0` | Amplitud de pico |
| `fade` | float | — | `[0, 0.5)`, por defecto `0.01` | Fracció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ámetros de `impulse_response()`

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `recorded` | array 1D | cualquiera | no vacío | Respuesta del sistema grabada |
| `reference` | array 1D | cualquiera | no vacío | El barrido emitido |
| `fs` | int | Hz | > 0 | Frecuencia de muestreo |
| `method` | str | — | `'spectral'` (por defecto) / `'farina'` | `'farina'` requiere `f_range` |
| `f_range` | (float, float) | Hz | por defecto `None` | `(f1, f2)` del barrido (solo Farina) |
| `regularization` | float | — | por defecto `1e-6` | Término de Tikhonov como fracción de la energía espectral de pico |
| `length` | int, opcional | muestras | por defecto `len(recorded)` | Muestras de RI causal a devolver |
| `return_full` | bool | — | por defecto `False` | Devuelve la secuencia completa (distorsión en la cola) |

`mls_signal(order)` toma un entero `order` en 2–20 (longitud de secuencia
$2^{\text{order}}-1$); `mls_impulse_response(recorded, mls, length=None)`
necesita que `recorded` abarque un número entero de periodos de MLS.

## La cadena de medición

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] | 125 | 250 | 500 | 1000 | 2000 | 4000 |
| :--- | :---: | :---: | :---: | :---: | :---: | :---: |
| 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**.

Esos mismos 45 dB son lo que comprueba aguas abajo la marca de validez de T30: la
[guía de acústica de salas](/phonometry/es/buildings/rooms/room-acoustics/) 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.

## Dónde medir

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
$\geq 2$ m entre sí, $\geq 1$ m de cualquier superficie, a $1{,}2$ 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.

**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.

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
  $d_\mathrm{min} = 2\sqrt{V/(c\,\hat T)}$ de la fuente, con $\hat T$ 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](/phonometry/es/buildings/rooms/room-acoustics/)) 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:

*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 $d_\mathrm{min}$, 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.*

<details>
<summary>Mostrar el código de esta figura</summary>

```python

# `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()
```

</details>

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:

*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.*

<details>
<summary>Mostrar el código de esta figura</summary>

```python

# `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()
```

</details>

**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 $T$ 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](/phonometry/es/buildings/rooms/room-acoustics/) lleva
la mayoría de ellos como campos de `ReportMetadata`, pero la planta acotada con
las posiciones encima hay que aportarla aparte.

## De la respuesta al impulso en adelante

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](/phonometry/es/buildings/rooms/room-acoustics/) arranca
exactamente ahí, y su hermana de oficinas diáfanas recorre la
[línea de puestos de trabajo de ISO 3382-3](/phonometry/es/buildings/rooms/open-plan-acoustics/).
Medidos a ambos lados de un cerramiento, los mismos barridos alimentan las
diferencias de nivel del
[aislamiento acústico en campo](/phonometry/es/buildings/insulation/insulation-field/). 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](/phonometry/es/devices/electroacoustics/swept-sine-distortion/).

## Qué cubre esta guía

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.

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](/phonometry/es/devices/electroacoustics/swept-sine-distortion/)).
Las reglas de posiciones son prosa de orientación: nada comprueba cuántas
posiciones se midieron ni dónde.

## Véase también

- [Acústica de salas](/phonometry/es/buildings/rooms/room-acoustics/): el análisis
  del decaimiento y los parámetros ISO 3382 calculados a partir de la RI que
  esta página adquiere.
- [Acústica de oficinas diáfanas (ISO 3382-3)](/phonometry/es/buildings/rooms/open-plan-acoustics/):
  la línea de privacidad del habla medida con la misma adquisición.
- [Medición de sistemas](/phonometry/es/signals/spectra/system-measurement/): pares
  de Golay complementarios y barridos con espectro conformado, que devuelven
  los mismos tipos de resultado.
- [Distorsión y fase con barrido sinusoidal](/phonometry/es/devices/electroacoustics/swept-sine-distortion/):
  la lectura de Farina de la distorsión que el barrido separa.
- [Medición del aislamiento en campo (ISO 16283)](/phonometry/es/buildings/insulation/insulation-field/):
  la misma medición a ambos lados de un cerramiento.
- [Fuentes imagen y campo estacionario](/phonometry/es/buildings/rooms/room-image-sources/):
  respuestas al impulso simuladas sobre las que ensayar la cadena de
  procesamiento.
- [Teoría](/phonometry/es/reference/theory/rooms-buildings/): la integración
  de Schroeder que el análisis del decaimiento aplica a esta RI.
- Referencia de la API: [`room.impulse_response`](/phonometry/es/reference/api/rooms/impulse-response/).
- Teoría: [Respuesta al impulso y parámetros de acústica de salas](/phonometry/es/reference/theory/rooms-buildings/#respuesta-al-impulso-y-parámetros-de-acústica-de-salas-iso-18233-iso-3382-1-2-3): la integración inversa de Schroeder y la deconvolución en la que se apoya el método del barrido.

## Respuestas rápidas

### ¿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.
