<!-- canonical: https://jmrplens.github.io/phonometry/es/guides/room-image-sources/ -->
Source: https://jmrplens.github.io/phonometry/es/guides/room-image-sources/

Dos modelos clásicos predicen el campo sonoro de una sala rectangular antes de
construirla. El modelo de **fuentes imagen** da el patrón determinista de
reflexiones tempranas — toda la respuesta al impulso como suma de imágenes
especulares de la fuente — mientras que el modelo **estacionario** da el nivel
estadístico al que se asienta una fuente de potencia conocida, separado en un
campo directo y otro reverberante. Esta página cubre ambos en
`phonometry.room`: el primero complementa la respuesta al impulso *medida* de la
[guía de Acústica de salas](/phonometry/es/guides/room-acoustics/) con una
sintética, y el segundo complementa la tasa de decaimiento única de la
[guía de Predicción del tiempo de reverberación](/phonometry/es/guides/reverberation-prediction/)
con una predicción de nivel frente a distancia, uniendo la
[potencia acústica](/phonometry/es/guides/sound-power/) de una fuente con el nivel
que produce en el interior.

## 1. Respuesta al impulso por fuentes imagen

Una sala rectangular rígida o absorbente — una *caja de zapatos* — refleja una
fuente puntual en sus seis paredes, y cada reflexión es exactamente el sonido en
campo libre de una **imagen especular** de la fuente. Reflejar una coordenada en
una pared ($S_n = S - 2 d\,\mathbf{n}$) convierte la fuente en una red regular
de imágenes, y la respuesta al impulso es el sonido directo más un impulso
retardado y atenuado por imagen,

$$
g(t) = \sum_n A_n\ \delta(t - t_n), \qquad
A_n = \frac{1}{4\pi r_n}\ e^{-m r_n / 2} \prod_{\text{paredes}} R_w^{\,k_{w,n}},
\qquad t_n = \frac{r_n}{c}.
$$

Cada imagen a distancia $r_n$ del receptor llega en $t_n = r_n/c$ con una
amplitud formada por la divergencia esférica $1/(4\pi r_n)$, el producto de los
**factores de reflexión de presión** de pared $R_w = \sqrt{1 - \alpha_w}$ cada
uno elevado al número de reflexiones $k_{w,n}$ que esa imagen hizo en la pared
$w$, y la pérdida de presión del aire $e^{-m r_n/2}$ a lo largo del camino ($m$
el coeficiente de atenuación de intensidad, de modo que la intensidad cae como
$e^{-m r}$). Una caja de zapatos tiene exactamente
$\tfrac{2}{3}(2 i_0^3 + 3 i_0^2 + 4 i_0)$ imágenes audibles hasta el orden de
reflexión $i_0$ (1560 en el orden 10), y la densidad de reflexiones crece como
$\mathrm{d}N/\mathrm{d}t = 4\pi c^3 t^2 / V$.

```python

from phonometry import room

# Sala de 7 x 5 x 3 m, fuente y receptor descentrados.
res = room.image_source_rir(
    dimensions=(7.0, 5.0, 3.0),
    source=(2.0, 1.6, 1.5),
    receiver=(5.2, 3.4, 1.7),
    absorption=0.12,          # absorción de pared uniforme (escalar)
    fs=48000,
    max_order=12,
)

print(res.ir.shape)                          # (n_muestras,) RIR de banda ancha
print(round(res.direct_time * 1000, 2))      # llegada del sonido directo, ms
print(res.times.size == room.audible_image_count(12) + 1)   # imágenes + fuente

res.plot()   # el reflectograma de la figura de abajo

# La RIR sintética entra directa en el análisis de decaimiento de ISO 3382.
params = room.room_parameters(res.ir, res.fs, limits=None)
print(bool(params.t30_valid[0]))             # True: la ventana de decaimiento es usable
# T30 crece hacia la estimación de Eyring al aumentar max_order (ver abajo); a
# orden bajo la cola especular se trunca, trátalo como un valor limitado por orden.
print(round(float(params.t30[0]), 2))        # tiempo de reverberación, s
```

`image_source_rir` devuelve un `ImageSourceResult`. Su `ir` es la RIR muestreada
(un array 1D en banda ancha, o una fila por banda de octava con absorción por
banda), mientras que la tabla **exacta** de reflexiones a resolución subenteros
se guarda en `times`, `distances`, `orders`, `amplitudes` e `image_positions`,
de modo que la geometría es exacta con independencia de la frecuencia de
muestreo. El sonido directo y las reflexiones tempranas individuales son
magnitudes geométricas buenas a precisión de máquina.

El reflectograma inferior muestra todo el patrón: el sonido directo a 0 dB y
luego la nube de reflexiones coloreada por orden de reflexión decayendo bajo la
envolvente de divergencia $1/r$. Las reflexiones de orden 1 (las seis paredes)
quedan justo por debajo del sonido directo; los órdenes superiores llegan más
tarde, más densos y más débiles.

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

```python

from phonometry import room

res = room.image_source_rir((7.0, 5.0, 3.0), (2.0, 1.6, 1.5),
                            (5.2, 3.4, 1.7), 0.12, fs=48000, max_order=10)

# Una línea: el reflectograma (nivel en dB rel. directo vs tiempo, por orden).
res.plot(language="es")
plt.show()

# A mano: dispersión de las amplitudes de reflexión coloreadas por orden.
t_ms = np.asarray(res.times) * 1e3
amp = np.asarray(res.amplitudes)
level = 20 * np.log10(np.abs(amp) / np.max(np.abs(amp)))
order = np.asarray(res.orders)
fig, ax = plt.subplots()
sc = ax.scatter(t_ms[order > 0], level[order > 0], c=order[order > 0],
                cmap="viridis", s=18)
ax.stem([t_ms[order == 0][0]], [0.0])         # sonido directo
fig.colorbar(sc, label="Orden de reflexión")
ax.set_xlabel("Tiempo de llegada [ms]"); ax.set_ylabel("Nivel rel. directo [dB]")
ax.set_xlim(0, 120); ax.set_ylim(-60, 5)
plt.show()
```

</details>

**Por banda, por pared y con aire.** Pasa coeficientes por banda (un array por
pared `(6, n_bandas)`, un vector por banda o una lista `frequencies`) para
sintetizar un decaimiento por banda de octava; un vector de longitud 6 fija cada
pared por separado (orden `x0, xL, y0, yL, z0, zL`); y `air_attenuation` (el
coeficiente de intensidad `m` de `air_attenuation_m`) añade la pérdida de aire
`exp(-m r / 2)` que se come la cola de altas frecuencias.

```python

from phonometry import room

freqs = [250.0, 500.0, 1000.0, 2000.0]
alpha = np.array([[0.10, 0.15, 0.25, 0.40]] * 6)     # (6 paredes, 4 bandas)
res = room.image_source_rir((7.0, 5.0, 3.0), (2.0, 1.6, 1.5), (5.2, 3.4, 1.7),
                            alpha, fs=48000, max_order=12, frequencies=freqs)
print(res.ir.shape)                                  # (4 bandas, n_muestras)
print(np.round(np.sum(res.ir ** 2, axis=1), 4))      # más absorción -> menos energía
```

**Reproducir el decaimiento estadístico.** La tasa de decaimiento inicial de la
RIR sintética reproduce el tiempo de reverberación de **Eyring**
$T = -24 V \ln 10 / (c S \ln(1 - \bar\alpha))$, porque la tasa media de
reflexiones $cS/4V$ es igual a $\tfrac{c}{2}(1/L_x + 1/L_y + 1/L_z)$. El acuerdo
solo es estrecho en el límite casi cúbico: una sala alargada sostiene la energía
a lo largo de su eje largo, así que su decaimiento *especular* puro es más lento
que la estimación difusa de Eyring — exactamente la anisotropía que los
[modelos de Fitzroy y Arau-Puchades](/phonometry/es/guides/reverberation-prediction/)
se construyeron para corregir. El modelo capta solo reflexiones especulares (sin
difracción ni difusión) y es exacto para factores de reflexión de pared reales e
independientes del ángulo.

### Parámetros de `image_source_rir()`

| Parámetro | Tipo | Unidades | Rango / defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `dimensions` | (float, float, float) | m | todas > 0 | Longitudes de sala `(Lx, Ly, Lz)` |
| `source` / `receiver` | (float, float, float) | m | estrictamente dentro de la sala | Posiciones `(x, y, z)` |
| `absorption` | escalar / (6,) / (n,) / (6, n) | — | `[0, 1]` | Uniforme, por pared, por banda o por pared y banda |
| `fs` | int | Hz | > 0 | Frecuencia de muestreo |
| `max_order` | int | — | ≥ 0, defecto 20 | Corte de orden de reflexión |
| `speed_of_sound` | float | m/s | > 0, defecto 343 | Velocidad del sonido `c` |
| `air_attenuation` | float o (n,) | 1/m | ≥ 0, defecto 0 | Coeficiente de intensidad del aire `m` |
| `duration` | float, opcional | s | > 0 | Longitud de la RIR (defecto: última llegada) |
| `frequencies` | (n,), opcional | Hz | — | Centros de banda que etiquetan un resultado por banda |

Devuelve un `ImageSourceResult` (`ir`, `fs`, `frequencies` y la tabla exacta de
reflexiones `times`/`distances`/`orders`/`amplitudes`/`image_positions`) con
`.plot()` y una propiedad `direct_time`. `audible_image_count(order)` da el
recuento de imágenes de la caja de zapatos y `reflection_density(t, volume)` la
densidad $4\pi c^3 t^2 / V$.

## 2. Campo estacionario de sala

Cuando una fuente de potencia acústica constante funciona en una sala, el nivel se
asienta en la suma de un **campo directo** que cae con la distancia y un **campo
reverberante** difuso que es (aproximadamente) el mismo en todas partes. La
**constante de sala** $R = S\bar\alpha/(1-\bar\alpha)$ mide cuánto campo
reverberante levanta una potencia dada, y el nivel estacionario es

$$
L_p = L_W + 10 \lg\!\left( \frac{Q}{4\pi r^2} + \frac{4}{R} \right),
$$

con el factor de directividad de la fuente $Q$ (1 omnidireccional, 2 sobre un
suelo duro, 4 en una arista, 8 en una esquina). Los dos términos se cruzan en la
**distancia crítica** $r_c = \sqrt{Q R / 16\pi}$: más cerca que $r_c$ domina el
campo directo y duplicar la distancia baja el nivel 6 dB; más lejos manda el
campo reverberante y alejarse apenas ayuda.

```python
from phonometry import room

field = room.steady_state_field(
    sound_power_level=90.0,     # Lw, dB re 1 pW
    surface_area=100.0,          # área total de contorno S, m^2
    mean_absorption=0.2,         # absorción media de Sabine alpha_bar
)
print(round(field.room_constant, 1))          # 25.0 m^2
print(round(field.critical_distance, 2))       # 0.71 m
field.plot()                                    # directo / reverberante / total vs distancia
```

El `SteadyFieldResult.plot()` dibuja los niveles directo, reverberante y total
frente a la distancia con la distancia crítica marcada: la curva total sigue el
campo directo $1/r^2$ cerca de la fuente y se aplana en la meseta reverberante
más allá de $r_c$.

*Una fuente de 90 dB re 1 pW en un taller de 12 x 8 x 4 m con absorción
media de 0,15: dentro de $r_c = 1{,}11$ m alejarse baja el nivel 6 dB por
duplicación; más allá manda la meseta reverberante y solo la absorción, no
la distancia, baja el nivel (Bies 5.ª ed., §6.4).*

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

```python

from phonometry import room

field = room.steady_state_field(
    sound_power_level=90.0,     # Lw, dB re 1 pW
    surface_area=352.0,          # un taller de 12 x 8 x 4 m
    mean_absorption=0.15,
)

# Una línea: niveles directo, reverberante y total con rc marcada.
field.plot(language="es")
plt.show()

# A mano, desde los campos del resultado:
fig, ax = plt.subplots()
ax.semilogx(field.distances, field.direct, "--", label="Campo directo")
ax.semilogx(field.distances, field.reverberant, ":", label="Campo reverberante")
ax.semilogx(field.distances, field.total, label="Total")
ax.axvline(field.critical_distance, ls="-.",
           label=f"rc = {field.critical_distance:.2f} m")
ax.set_xlabel("Distancia a la fuente [m]")
ax.set_ylabel("Nivel de presión acústica [dB]")
ax.legend()
plt.show()
```

</details>

Los bloques se exponen por separado, de modo que una medición
de emisión fluye directa a una predicción de nivel:

```python
from phonometry import room

R = room.room_constant(100.0, 0.2)                     # constante de sala de Bies, 25 m^2
print(round(float(room.critical_distance(R)), 3))      # 0.705 m (Q = 1)
print(round(float(room.steady_state_spl(90.0, 5.0, R)), 2))   # nivel a 5 m, dB
```

La distancia de reverberación de Kuttruff ($r_c = \sqrt{A/16\pi}$ para $Q = 1$)
usa el área de absorción de Sabine $A = S\bar\alpha$ en lugar de la constante de
sala $R = A/(1-\bar\alpha)$; ambas coinciden para $\bar\alpha$ pequeño, y este
módulo usa $R$ de modo que $r_c$ es exactamente el cruce de su propio
`steady_state_spl`. Pasa `characteristic_impedance=rho_c` para añadir el término
$10\lg(\rho c / 400)$ de Bies (unos +0,14 dB a 20 °C).

**Dónde se difumina la estadística.** La **frecuencia de Schroeder**
$f_s = 2000\sqrt{T/V}$ (V en m³, T en s) marca aproximadamente la transición
modal-a-difuso, un cruce heurístico y no un corte abrupto: bastante por debajo
dominan los modos discretos y los supuestos difusos de $R$ y $r_c$ pierden
fiabilidad, bastante por encima los modos se solapan y esta imagen estadística
se cumple. En salas límite conviene comprobar banda a banda.

```python
from phonometry import room
print(round(float(room.schroeder_frequency(1.0, 200.0)), 0))   # 141 Hz
```

### Parámetros de `steady_state_field()`

| Parámetro | Tipo | Unidades | Rango / defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `sound_power_level` | float | dB re 1 pW | — | Nivel de potencia de la fuente `Lw` |
| `surface_area` | float | m² | > 0 | Área total de contorno `S` |
| `mean_absorption` | float | — | `(0, 1)` | Absorción media de Sabine `alpha_bar` |
| `distances` | array 1D, opcional | m | > 0 | Rejilla de distancias (defecto: `0.1 rc` a `10 rc`) |
| `directivity` | float | — | > 0, defecto 1 | Factor de directividad de la fuente `Q` |
| `characteristic_impedance` | float, opcional | Pa·s/m | > 0 | Añade el término `10 lg(rho c / 400)` |

Devuelve un `SteadyFieldResult` (`distances`, `direct`, `reverberant`, `total`,
`critical_distance`, `room_constant`) con `.plot()`. Las piezas `room_constant`,
`critical_distance`, `schroeder_frequency` y `steady_state_spl` también son
invocables directamente (cada una acepta arrays por banda).

## Validación

Las implementaciones se comprueban contra las formas cerradas y los anclajes
numéricos de los propios textos fuente (ver el
[informe de conformidad](/phonometry/es/reference/conformance/)):

- la amplitud del sonido directo $1/(4\pi r)$ y su retardo $r/c$ (geometría
  exacta), el recuento de imágenes audibles (Kuttruff 6.ª ed., ec. (9.23)) y
  la densidad de reflexiones (ec. (4.6));
- el tiempo de reverberación de Eyring recuperado del decaimiento de la RIR
  sintética en el límite casi cúbico (tolerancia documentada ≈ 10 %), y un
  [solucionador 2D FDTD](/phonometry/es/guides/fdtd-simulation/)
  independiente que reproduce el retardo del eco de pared rígida y el
  $T_{60}$ con amortiguamiento uniforme;
- la constante de sala, la distancia crítica como cruce exacto
  directo/reverberante, la frecuencia de Schroeder (el ejemplo de aula de
  Kuttruff, $V = 200$ m³, $T = 1$ s → 141 Hz) y el nivel estacionario
  (Bies 5.ª ed., ec. (6.43)).

## Qué cubre esta guía

**Cubierto.** El libro *Room Acoustics* de Kuttruff (la construcción de
fuentes imagen del apartado 4.1, la fórmula de reverberación de Eyring
usada en la comprobación casi cúbica y la frecuencia de Schroeder del
apartado 3.6), *Auralization* de Vorländer (el modelo de fuentes espejo
del capítulo 11, sus expresiones de factor de reflexión y retardo) y la
descomposición por orden de reflexión de Allen y Berkley, todo
implementado por `room.image_source_rir`; y el campo estacionario de sala
de Bies, Hansen y Howard del apartado 6.4 (constante de sala, directividad
$Q$, distancia crítica) implementado por `room.steady_state_field`,
`room.room_constant`, `room.critical_distance`, `room.steady_state_spl` y
`room.schroeder_frequency`.

**No cubierto.** El modelo de fuentes imagen solo capta reflexiones
especulares: sin difracción y sin dispersión difusa, de modo que el
decaimiento real de una sala alargada es más lento que la estimación de
Eyring de campo difuso frente a la que se comprueba (la anisotropía que
los modelos de Fitzroy y Arau-Puchades de la
[guía de predicción del tiempo de reverberación](/phonometry/es/guides/reverberation-prediction/)
se diseñaron para corregir). La distancia de reverberación alternativa de
Kuttruff (que usa el área de absorción de Sabine en lugar de la constante
de sala) se cita como comparación pero no está implementada:
`steady_state_field` y `critical_distance` usan siempre la formulación de
Bies con la constante de sala.

## Véase también

- [Acústica de salas](/phonometry/es/guides/room-acoustics/): la respuesta al
  impulso *medida* (ISO 18233) y los parámetros de ISO 3382 que alimenta la RIR
  sintética.
- [Predicción del tiempo de reverberación (Sabine, Arau)](/phonometry/es/guides/reverberation-prediction/):
  la tasa de decaimiento estadística que reproduce el modelo de fuentes imagen y
  los modelos de anisotropía más allá de ella.
- [Absorción acústica en recintos (EN 12354-6)](/phonometry/es/guides/enclosed-space-absorption/):
  el área de absorción equivalente tras la absorción media `alpha_bar`.
- [Potencia acústica](/phonometry/es/guides/sound-power/): el `Lw` que impulsa el
  nivel estacionario.
- [Simulación de ondas FDTD 2D](/phonometry/es/guides/fdtd-simulation/): el
  solver de ondas independiente usado para contrastar el eco de pared rígida y
  el decaimiento.
- [Teoría: Salas y edificación](/phonometry/es/reference/theory/rooms-buildings/):
  las derivaciones de la red de imágenes y del campo estacionario.
- [Informe de conformidad](https://github.com/jmrplens/phonometry/blob/main/docs/CONFORMANCE.md):
  las formas cerradas y anclas resueltas contra las que se validan estas
  implementaciones.
- Referencia de la API: [`room.image_source`](/phonometry/es/reference/api/rooms/image-source/)
  y [`room.steady_field`](/phonometry/es/reference/api/rooms/steady-field/).
