<!-- canonical: https://jmrplens.github.io/phonometry/es/guides/insulation-prediction/ -->
Source: https://jmrplens.github.io/phonometry/es/guides/insulation-prediction/

Un índice de laboratorio describe un elemento aislado; un edificio también
transmite el sonido por cada camino de flancos. Esta página cubre la predicción
EN 12354 del comportamiento in situ a partir de datos de elemento de
laboratorio: los modelos de flancos aéreo y de impactos de EN 12354-1/2 con sus
índices de reducción de vibraciones de unión, y el aislamiento de fachada y la
radiación al exterior de EN 12354-3/4. Las magnitudes medidas con las que se
comprueba el modelo están en
[Medición del aislamiento en campo e índices](/phonometry/es/guides/insulation-field/);
los datos de laboratorio vienen de
[Medición del aislamiento en laboratorio](/phonometry/es/guides/insulation-lab/).

## ¿Cómo predigo el aislamiento acústico con EN 12354 en Python?

Construye los tres caminos de flanco de cada unión con
`building.flanking_element()` y combínalos con
`building.predicted_airborne_insulation(r_direct=57.0, flanking_paths=paths)`.
Para el ejemplo del anexo H.3 de EN 12354-1 que se usa abajo devuelve
`r_prime_w` = 52,2 dB, es decir $R'_w$ = 52 dB, y nombra el camino dominante.
El aislamiento a impactos pasa por `predicted_impact_insulation()`.

## Predicción del comportamiento (EN 12354)

Un índice de laboratorio describe un elemento de forma aislada, pero el sonido
que un edificio transmite realmente también viaja *alrededor* del cerramiento
(por el suelo, por la fachada, a través de las paredes de flanco) y se vuelve a
radiar en la sala receptora. Esta **transmisión por flancos** es toda la
diferencia entre el $R$ de laboratorio y el $R'$ de campo. EN 12354 predice el
índice aparente in situ a partir de los índices de laboratorio de los elementos
más la transmisión vibratoria de sus uniones.

Cada unión entre un elemento de flanco y el elemento separador lleva tres
caminos, $Ff$ (flanco→flanco), $Df$ (directo→flanco) y $Fd$ (flanco→directo),
junto al único camino directo $Dd$.

El **modelo simplificado de un solo número**
los combina energéticamente (Fórmula 26):

$$
R'_w = -10 \log_{10}\Big[ 10^{-R_{Dd,w}/10}
      + \sum 10^{-R_{Ff,w}/10} + \sum 10^{-R_{Df,w}/10}
      + \sum 10^{-R_{Fd,w}/10} \Big],
$$

con el camino directo $R_{Dd,w} = R_{s,w} + \Delta R_{Dd,w}$ (Fórmula 27) y cada
camino de flanco (Fórmula 28a)

$$
R_{ij,w} = \tfrac{R_{i,w} + R_{j,w}}{2} + \Delta R_{ij,w} + K_{ij}
         + 10 \log_{10}\frac{S_s}{l_0\ l_f},
$$

donde $l_0 = 1$ m es la longitud de acoplamiento de referencia, $l_f$ la longitud
de acoplamiento de la unión y $K_{ij}$ el **índice de reducción de vibraciones** de
la unión (Anexo E, empírico en la relación de masas
$M = \log_{10}(m'_{\perp,i}/m'_i)$).

```python

from phonometry import building

# EN 12354-1 Anexo H.3: una pared separadora Rs,w = 57 dB, área Ss = 11.5 m², con
# cuatro elementos de flanco. El modelo simplificado lee el Kij de cada unión a
# 500 Hz a partir de la relación de masas m'perp / m' (Anexo E); aquí la unión
# rígida en cruz del suelo (la relación de masas está redondeada, de ahí 12.5 vs Anexo 12.4):
print(round(building.junction_vibration_reduction("rigid_cross", "through", 1.61), 1))  # 12.5  KFf
print(round(building.junction_vibration_reduction("rigid_cross", "corner",  1.61), 1))  #  8.9  KFd = KDf

# Construye los tres caminos de flanco (Ff, Df, Fd) de cada elemento a partir del
# Kij tabulado del Anexo H, luego combina el camino directo Dd energéticamente (Fórmula 26).
elements = [   # (nombre, Rw, KFf, KFd = KDf, longitud de acoplamiento lf)
    ("floor",    49, 12.4,  8.9, 4.50),
    ("ceiling",  46, 14.4,  9.2, 4.50),
    ("facade",   42, 12.6,  6.7, 2.55),
    ("int-wall", 33, 33.5, 15.7, 2.55),
]
paths = []
for name, rw, k_ff, k_fd, lf in elements:
    paths += building.flanking_element(label=name, r_flanking=rw, r_separating=57,
                              k_ff=k_ff, k_fd=k_fd, k_df=k_fd,
                              separating_area=11.5, coupling_length=lf)

res = building.predicted_airborne_insulation(r_direct=57.0, flanking_paths=paths)
print(round(res.r_prime_w, 1))                          # 52.2  ->  R'w = 52 dB
print(res.dominant.label, round(res.dominant.fraction, 2))   # Dd 0.33 (domina el directo)

res.plot()   # fracción de energía transmitida por camino, de mayor a menor (requiere matplotlib)
```

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

```python

from phonometry import building

# Construye los tres caminos de flanco (Ff, Df, Fd) de cada elemento a partir del
# Kij tabulado del Anexo H, luego combina el camino directo Dd energéticamente (Fórmula 26).
elements = [   # (nombre, Rw, KFf, KFd = KDf, longitud de acoplamiento lf)
    ("floor",    49, 12.4,  8.9, 4.50),
    ("ceiling",  46, 14.4,  9.2, 4.50),
    ("facade",   42, 12.6,  6.7, 2.55),
    ("int-wall", 33, 33.5, 15.7, 2.55),
]
paths = []
for name, rw, k_ff, k_fd, lf in elements:
    paths += building.flanking_element(label=name, r_flanking=rw, r_separating=57,
                              k_ff=k_ff, k_fd=k_fd, k_df=k_fd,
                              separating_area=11.5, coupling_length=lf)
res = building.predicted_airborne_insulation(r_direct=57.0, flanking_paths=paths)

# Índice de reducción acústica por camino y fracción de energía transmitida de cada
# camino para el resultado del Anexo H.3 calculado arriba.
labels = [p.label for p in res.paths]
r_w = [p.r_w for p in res.paths]
frac = [100.0 * p.fraction for p in res.paths]

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(9, 6), sharex=True)
ax1.bar(labels, r_w, color="tab:blue")
ax1.axhline(res.r_prime_w, ls="--", color="k", label=f"R'w = {res.r_prime_w:.1f} dB")
ax1.set_ylabel("Rij,w del camino [dB]"); ax1.legend()
ax2.bar(labels, frac, color="tab:orange")
ax2.set_ylabel("Fracción de energía [%]"); ax2.set_xlabel("Camino de transmisión")
for ax in (ax1, ax2):
    ax.tick_params(axis="x", rotation=45)
fig.suptitle("EN 12354-1 Anexo H.3 — transmisión por flancos")
fig.tight_layout()
plt.show()
```

</details>

Cada camino de flanco añadido rebaja estrictamente $R'_w$ por debajo del directo
$R_{Dd,w} = 57$; `res.paths` expone la fracción de energía transmitida de cada
camino, de modo que el camino dominante queda visible. `flanking_element` es una
función de conveniencia que construye de una vez los tres caminos de una unión; el constructor
de camino único que hay detrás, `flanking_path`, construye un camino `Ff`, `Df`
o `Fd` cada vez (Fórmula 28a). La Cláusula 4.4.2 también
impone un límite inferior $K_{ij} \ge K_{ij,\min}$ a partir de la geometría de
la unión (Fórmula 29). Pasa el área del elemento de flanco a
`flanking_element(..., flanking_area=...)` y la saturación se aplica
automáticamente camino a camino; o calcula el límite con
`junction_min_vibration_reduction` y pásalo a
`flanking_path(..., kij_min=...)`, que eleva un $K_{ij}$ por debajo del límite
hasta el mínimo:

```python
from phonometry import building
# Kij,min = 10 lg[lf·l0·(1/Si + 1/Sj)]; los elementos grandes dan un límite bajo
# (aquí negativo), así que un Kij tabulado realista rara vez se satura; pero
# los elementos pequeños y ligeros pueden superarlo (p. ej. lf = 4 m,
# S = 1.5 m² da 7.3 dB, por encima del suelo de 5 dB de las uniones ligeras).
print(round(building.junction_min_vibration_reduction(coupling_length=4.5,
                                             s_i=11.5, s_j=11.5), 1))     # -1.1
```

La contrapartida a impactos (EN 12354-2, Fórmula 21) es una resta directa:
$L'_{n,w} = L_{n,w,eq} - \Delta L_w + K$, con el nivel equivalente del suelo
desnudo $L_{n,w,eq} = 164 - 35 \log_{10}(m'/m'_0)$ (Anexo B), la mejora del
revestimiento $\Delta L_w$ (ISO 717-2) y la corrección por flancos $K$ de la
Tabla 1.

```python
from phonometry import building

# EN 12354-2 Anexo E.3: un forjado de hormigón de 0.14 m (m' = 322 kg/m²) con un
# suelo flotante (ΔLw = 33 dB), salas una sobre otra, masa media de flanco 145 kg/m².
ln_eq = building.equivalent_impact_level(322.0)                   # 164 - 35 lg(m')
k = building.impact_flanking_correction(322.0, 145.0)             # Tabla 1 (sep 322, flk 145)
imp = building.predicted_impact_insulation(ln_w_eq=ln_eq, delta_l_w=33.0, k_correction=k)
print(round(ln_eq, 1), k, round(imp.l_prime_n_w, 1))     # 76.2 2 45.2  ->  L'n,w = 45 dB

# Fórmula (3) exacta: L'nT,w = L'n,w - 10 lg(0.032 V). El redondeo del propio
# Anexo E.3 a 10 lg(V/30) queda 0.18 dB por debajo; ambos dan L'nT,w = 43 dB.
print(round(building.standardized_impact_level(imp.l_prime_n_w, 50.0), 1))   # 43.2  L'nT,w

imp.plot()   # los términos de la Fórmula (21) como barras: Ln,w,eq - dLw + K -> L'n,w (requiere matplotlib)
```

*Todo el modelo simplificado de EN 12354-2 es una resta: el forjado masivo
desnudo parte de $L_{n,w,eq} = 76{,}2$ dB, el suelo flotante recupera 33 dB
y la corrección de flancos devuelve 2 dB, quedando en $L'_{n,w} = 45$ dB.*

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

```python

from phonometry import building

# EN 12354-2 Anexo E.3: forjado de hormigón de 0,14 m (m' = 322 kg/m2),
# suelo flotante con delta-Lw = 33 dB, masa media de flancos de 145 kg/m2.
ln_eq = building.equivalent_impact_level(322.0)
k = building.impact_flanking_correction(322.0, 145.0)
imp = building.predicted_impact_insulation(ln_w_eq=ln_eq, delta_l_w=33.0,
                                           k_correction=k)

# Una línea: los términos de la Fórmula (21) como barras:
imp.plot(language="es")
plt.show()

# A mano, desde los campos del resultado:
labels = ["Ln,w,eq", "-dLw", "+K", "L'n,w"]
values = [imp.ln_w_eq, -imp.delta_l_w, imp.k_correction, imp.l_prime_n_w]
fig, ax = plt.subplots()
ax.bar(np.arange(4), values)
ax.axhline(0.0, color="k", lw=0.8)
ax.set_xticks(np.arange(4), labels)
ax.set_ylabel("Nivel / corrección [dB]")
ax.set_title(f"L'n,w = {imp.l_prime_n_w:.1f} dB (EN 12354-2 Anexo E.3)")
plt.show()
```

</details>

La contrapartida aérea de ese cierre es la Fórmula (5b),
$D_{nT} = R' + 10\lg(0.32\,V/S_s)$, expuesta como
`standardized_level_difference`: cierra el ejemplo del Anexo H.3
(`standardized_level_difference(52.2, 50.0, 11.5)` da 53,6 dB, la cadena
impresa con $V/(3S)$ 53,8 dB, y ambas redondean a $D_{nT,w} = 54$ dB).

Las tres guías de aislamiento cierran un bucle: el
[laboratorio](/phonometry/es/guides/insulation-lab/) mide $R$ y $K_{ij}$
elemento a elemento y unión a unión, este modelo los ensambla en un $R'_w$
predicho, y la
[medición en campo](/phonometry/es/guides/insulation-field/) comprueba el
resultado construido. Cuando el valor medido queda muy por debajo de la
predicción, busca un defecto de ejecución en la vía dominante que informa el
modelo: un puente rígido a través de una unión resiliente, un trasdosado
ausente, una fuga alrededor del elemento separador.

### Parámetros de `junction_vibration_reduction()` / `flanking_element()`

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `junction_type` | str | — | `'rigid_cross'` / `'rigid_t'` / `'flexible_t'` / `'lightweight_facade'` / `'lightweight_double_homogeneous'` / `'lightweight_double_coupled'` / `'corner'` / `'thickness_change'` | Geometría de la unión (Anexo E.3-E.9) |
| `path` | str | — | `'through'` (K13) / `'corner'` (K12 = K23) / `'double_leaf'` (K24) | Rama del camino |
| `mass_ratio` | float | — | > 0 | `m'⊥,i / m'i` (Fórmula E.2) |
| `frequency` | float | Hz | por defecto `500` | `flexible_t` y las uniones de doble hoja E.7/E.8 dependen de la frecuencia |
| `r_flanking` / `r_separating` | float | dB | — | Índices ponderados del elemento de flanco / separador |
| `k_ff` / `k_fd` / `k_df` | float | dB | — | `Kij` de la unión para los tres caminos |
| `separating_area` | float | m² | > 0 | Superficie del elemento separador `Ss` |
| `coupling_length` | float | m | > 0 | Longitud de acoplamiento de la unión `lf` |
| `delta_r_ff` / `delta_r_fd` / `delta_r_df` | float | dB | por defecto `0` | Mejoras del trasdosado por camino |
| `flanking_area` | float | m² | por defecto `None` | Área del elemento de flanco `SF`; activa la saturación automática a `Kij,min` (Cláusula 4.4.2 / Fórmula 29) |

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

| Parámetro | Tipo | Unidades | Rango / defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `label` | str | — | — | Nombre visible del camino |
| `kind` | str | — | `'Ff'` / `'Df'` / `'Fd'` | Rama de flanco del camino |
| `r_source` / `r_receive` | float | dB | — | Índices ponderados de los elementos lado emisor / lado receptor |
| `k_ij` | float | dB | — | Índice de reducción de vibraciones de la unión para este camino |
| `separating_area` | float | m² | > 0 | Área del elemento separador `Ss` |
| `coupling_length` | float | m | > 0 | Longitud de acoplamiento `lf` |
| `delta_r` | float | dB | def.: `0` | Mejora por revestimiento en este camino |
| `kij_min` | float | dB | def.: `None` | Si se da, `k_ij` se acota inferiormente a este mínimo de la Fórmula (29) |

`predicted_airborne_insulation()` devuelve un `AirbornePredictionResult`
(`r_prime_w`, `r_direct_w`, `paths` de `PathContribution`, `dominant`);
`predicted_impact_insulation()` un `ImpactPredictionResult` (`l_prime_n_w`,
`ln_w_eq`, `delta_l_w`, `k_correction`). El modelo simplificado lleva una
desviación típica declarada de unos 2 dB (Cláusula 5).

### Informe de predicción EN 12354 (`.report()`)

Ambos resultados de predicción generan un informe de **predicción** de una
página mediante el método `report(path)`. A diferencia de las fichas de
medición, el resultado informado es una *estimación* del comportamiento in situ
a partir de los datos de laboratorio de los elementos más la transmisión por
flancos de las uniones; la hoja lo indica de forma explícita y se rotula como
predicción, nunca como medición. `AirbornePredictionResult.report()` genera la
ficha del índice de reducción acústica aparente previsto (la tabla de vías de
transmisión junto al gráfico de fracción de energía por vía, con `R'w` en un
recuadro); `ImpactPredictionResult.report()` genera la ficha del nivel de
impactos aparente previsto (la tabla de términos de la fórmula (21) junto al
gráfico de términos, con `L'n,w` en un recuadro). Cada una nombra la
EN/ISO 12354-1/-2 y la parte de índice ISO 717 en su línea de base, imprime la
desviación típica del modelo (~2 dB) y, cuando se da un `requirement`, añade un
veredicto CUMPLE/NO CUMPLE (el índice aéreo cumple igualando o superándolo, y el
de impactos igualándolo o quedando por debajo).

`verbose=True` añade a la tabla aérea la fracción de energía transmitida de cada
vía. Los metadatos, `language="es"` y el extra `phonometry[report]` se comportan
igual que en las fichas de medición; los campos aplicables de `ReportMetadata`
son el elemento separador (`specimen`), la superficie del separador o el suelo
(`area`), la geometría de los recintos (`source_volume`, `receiving_volume`), la
masa del suelo desnudo (`mass_per_area`, impactos), el fabricante
(`manufacturer`), el recinto o la instalación de ensayo (`test_room`), la
identidad del calculista/laboratorio (`client`, `laboratory`, `operator`,
`report_id`, `test_date`) y un resumen en texto libre de la construcción de
flancos y las hipótesis del modelo (`notes`).

```python
from phonometry import building, ReportMetadata

# Predicción aérea (EN 12354-1 Anexo H.3): un tabique separador Rs,w = 57 dB
# flanqueado por cuatro elementos -> R'w = 52 dB.
paths = []
for label, rw, kff, kfd, lf in [
    ("suelo", 49.0, 12.4, 8.9, 4.5), ("techo", 46.0, 14.4, 9.2, 4.5),
    ("fachada", 42.0, 12.6, 6.7, 2.55), ("tabique interior", 33.0, 33.5, 15.7, 2.55),
]:
    ff, df, fd = building.flanking_element(
        label=label, r_flanking=rw, r_separating=57.0,
        k_ff=kff, k_fd=kfd, k_df=kfd, separating_area=11.5, coupling_length=lf)
    paths += [ff, df, fd]
air = building.predicted_airborne_insulation(r_direct=57.0, flanking_paths=paths)
air.report("Rpw_prediccion.pdf", language="es", metadata=ReportMetadata(
    specimen="Tabique separador, Rs,w = 57 dB", area=11.5,
    source_volume=53.0, receiving_volume=50.0, requirement=50.0,
    notes="Flancos: suelo/techo/fachada/tabique interior."))   # R'w = 52 dB
air.report("Rpw_prediccion_vias.pdf", verbose=True, language="es")

# Predicción de impactos (EN 12354-2 Anexo E.3): un forjado de hormigón
# (m' = 322 kg/m²) con suelo flotante (ΔLw = 33 dB) -> L'n,w = 45 dB.
ln_eq = building.equivalent_impact_level(322.0)
k = building.impact_flanking_correction(322.0, 145.0)
imp = building.predicted_impact_insulation(ln_w_eq=ln_eq, delta_l_w=33.0, k_correction=k)
imp.report("Lnw_prediccion.pdf", language="es",
           metadata=ReportMetadata(mass_per_area=322.0, requirement=53.0))  # L'n,w = 45 dB
```

Ambas fichas de ejemplo se regeneran con `make reports` y se mantienen
renderizadas en el repositorio; haz clic en cualquier vista previa para abrir el
PDF.

### Aislamiento de fachada y potencia radiada (EN 12354-3 / -4)

Las partes 3 y 4 predicen los dos sentidos a través del cerramiento del edificio,
ambos a partir de la misma suma energética de los **factores de transmisión** de
los elementos $\tau = 10^{-R/10}$, ponderados por área según $S_i/S$ (un elemento
pequeño o un paso de aire entra a través de su diferencia de nivel normalizada del
elemento $D_{n,e}$ con el área de referencia $A_0 = 10\ \text{m}^2$):

$$
R' = -10 \log_{10}\!\Big( \sum_i \tfrac{S_i}{S}\,10^{-R_i/10}
                          + \sum_k \tfrac{A_0}{S}\,10^{-D_{n,e,k}/10} \Big).
$$

**Parte 3: exterior → interior.** A partir de $R'$ (Fórmula 10) se derivan los
índices referidos a altavoz y a tráfico $R_{45} = R'+1$ y $R_{tr,s} = R'$, y la
salida principal, la diferencia de nivel estandarizada a 2 m (Fórmula 13)

$$
D_{2m,nT} = R' + \Delta L_{fs} + 10 \log_{10}\frac{V}{6\,T_0\,S}, \qquad T_0 = 0{,}5\ \text{s},
$$

con el término de forma de la fachada $\Delta L_{fs}$ (Anexo C; 0 dB para una
fachada plana reflectante; `facade_shape_level_difference` lo consulta en la
tabla de la Figura C.2 para galerías, balcones y terrazas, interpolando sobre
la absorción del intradós $\alpha_w$). Los índices de un solo número reutilizan
EN ISO 717-1 (`weighted_rating`).

```python
from phonometry import building

# EN 12354-3 Anexo F: una fachada de 11.3 m² (V = 50 m³, plana con ΔLfs = 0) de una
# doble hoja, una ventana, un pequeño tragaluz y una entrada de aire con
# tratamiento acústico (un elemento Dn,e).
elements = [
    building.FacadeElement("wall",     area=6.0, r=[41, 46, 52, 58, 64]),   # octava 125-2000
    building.FacadeElement("window",   area=4.5, r=[23, 22, 30, 36, 37]),
    building.FacadeElement("skylight", area=0.5, r=[24, 27, 30, 33, 30]),
    building.FacadeElement("air inlet", dn_e=[28, 23, 25, 38, 44]),         # elemento pequeño
]
fac = building.facade_sound_reduction(elements, area=11.3, volume=50.0,
                             frequencies=[125, 250, 500, 1000, 2000], bands="octave")
print(fac.r_tr_s_w, fac.c_tr, fac.d_2m_nt_w)   # 31 -3 33  (R'tr,s,w / Ctr / D2m,nT,w)

fac.plot()   # índices parciales por elemento con R' y D2m,nT superpuestos (requiere matplotlib)
```

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

```python

from phonometry import building

# EN 12354-3 Anexo F: una fachada de 11.3 m² (V = 50 m³, plana con ΔLfs = 0) de una
# doble hoja, una ventana, un pequeño tragaluz y una entrada de aire con
# tratamiento acústico (un elemento Dn,e).
elements = [
    building.FacadeElement("wall",     area=6.0, r=[41, 46, 52, 58, 64]),   # octava 125-2000
    building.FacadeElement("window",   area=4.5, r=[23, 22, 30, 36, 37]),
    building.FacadeElement("skylight", area=0.5, r=[24, 27, 30, 33, 30]),
    building.FacadeElement("air inlet", dn_e=[28, 23, 25, 38, 44]),         # elemento pequeño
]
fac = building.facade_sound_reduction(elements, area=11.3, volume=50.0,
                             frequencies=[125, 250, 500, 1000, 2000], bands="octave")

x = np.arange(5)
fig, ax = plt.subplots(figsize=(9, 5.5))
for name, rp in fac.element_r.items():
    ax.plot(x, rp, "--", alpha=0.6, marker=".", label=f"Rp — {name}")
ax.plot(x, fac.r_prime, "k-", lw=2.5, marker="o", label="R′ (fachada)")
ax.plot(x, fac.d_2m_nt, lw=2, marker="s", label="D2m,nT")
ax.set_xticks(x); ax.set_xticklabels([125, 250, 500, 1000, 2000])
ax.set_xlabel("Frecuencia [Hz]"); ax.set_ylabel("Índice / diferencia de nivel [dB]")
ax.set_title("Aislamiento acústico de fachada EN 12354-3 (Anexo F)")
ax.legend(ncol=2); ax.grid(alpha=0.4)
fig.tight_layout(); plt.show()
```

</details>

La predicción de fachada también escribe un informe de **predicción** de una
página mediante un método `report(path)`, con la misma maquetación que las
fichas de predicción a ruido aéreo y de impactos. `FacadePredictionResult.report()`
representa la tabla de elementos de la fachada (el índice parcial ponderado
`Rp,w` de cada elemento) junto a la gráfica por elemento / `R'` / `D2m,nT`, el
número único previsto `D2m,nT,w` en un recuadro (con `R'tr,s,w` y `Ctr`), la
declaración de predicción y, cuando se aporta un `requirement`, un veredicto
APTO/NO APTO (la diferencia de niveles cumple si es igual o mayor). `verbose=True`
añade la fracción de energía sonora transmitida por cada elemento, que señala el
elemento limitante (aquí la entrada de aire, no la pared). El informe necesita
los índices de número único de ISO 717-1, así que construye el resultado sobre
las 5 bandas de octava o las 16 de tercio de octava. Los campos aplicables de
`ReportMetadata` describen la situación prevista: `specimen` (el conjunto de
elementos de la fachada), `area` (la superficie expuesta de la fachada), el
volumen del recinto receptor `receiving_volume`, la situación exterior/de tráfico
en `test_room`, además de los campos de identidad del calculista / laboratorio
(`client`, `manufacturer`, `measurement_standard`, `laboratory`, `operator`,
`report_id`, `test_date`), un resumen libre de la forma de la fachada y del
modelo en `notes` y el objetivo `D2m,nT,w` en `requirement`. Los metadatos,
`language="es"` y el extra `phonometry[report]` se comportan como en las fichas
de medición.

```python
from phonometry import building, ReportMetadata

# EN 12354-3 Anexo F, fachada -> D2m,nT,w = 33 dB (R'tr,s,w = 31, Ctr = -3).
elements = [
    building.FacadeElement("Masonry wall", area=6.0, r=[41, 46, 52, 58, 64]),
    building.FacadeElement("Glazing",      area=4.5, r=[23, 22, 30, 36, 37]),
    building.FacadeElement("Roof light",   area=0.5, r=[24, 27, 30, 33, 30]),
    building.FacadeElement("Air inlet", dn_e=[28, 23, 25, 38, 44]),
]
fac = building.facade_sound_reduction(elements, area=11.3, volume=50.0,
                             frequencies=[125, 250, 500, 1000, 2000], bands="octave")
fac.report("D2mnT_prediction.pdf", metadata=ReportMetadata(
    specimen="Masonry wall + window + roof light + air inlet", area=11.3,
    receiving_volume=50.0, requirement=30.0,
    notes="Fachada plana, ΔLfs = 0 dB (Anexo C)."))         # D2m,nT,w = 33 dB
```

**Parte 4: interior → exterior.** El nivel de potencia acústica radiada por un
segmento (Fórmula 2) es $L_W = L_{p,in} + C_d - R' + 10 \log_{10}(S/S_0)$ con
$S_0 = 1$ m² y el término de difusividad del campo interior $C_d$ (Anexo B;
−6 dB difuso ideal, −5 dB industrial medio). Los huecos son elementos cuya «R»
es la pérdida por inserción del silenciador (un hueco desnudo es 0 dB). El nivel
exterior se obtiene de la atenuación simplificada $A_{tot}$ del Anexo E de un lado
radiante finito, $L_p = L_W - A_{tot}$.

```python
from phonometry import building

# EN 12354-4 Anexo G, lado 1: un segmento de pared de hormigón de 10×20 m con una
# puerta industrial de 6×4 m, nivel interior Lp,in, Cd = -5 dB. El tope de 40 dB
# sobre R' es una nota al pie del ejemplo del Anexo G (fugas en obra), no parte
# de la Fórmula (2)/(3): pásalo explícitamente para reproducir el Anexo G;
# por defecto no se aplica ningún tope.
bands = [63, 125, 250, 500, 1000, 2000, 4000, 8000]
seg = building.radiated_sound_power(
    [building.FacadeElement("wall", area=176.0, r=[32, 36, 36, 33, 39, 49, 57, 63]),
     building.FacadeElement("door", area=24.0,  r=[21, 23, 28, 30, 30, 30, 30, 30])],
    lp_in=[70, 74, 76, 72, 70, 67, 62, 57], area=200.0, c_d=-5.0,
    r_prime_cap=40.0, octave_bands=bands)
print(round(seg.l_w[0], 1), round(seg.l_w[1], 1))     # 59.8 61.2  (LW a 63/125 Hz)

# Nivel exterior a 5 m frente al centro del lado de 60×10 m (LWA = 62.9 dB(A)).
a_tot = building.outdoor_attenuation(width=60.0, height=10.0, distance=5.0)
print(round(a_tot, 1), round(building.outdoor_level(62.9, a_tot), 1))   # 26.3 36.6

seg.plot()   # LW radiada por octava con la línea de LWA ponderada A (requiere matplotlib)
```

*El segmento del lado 1 del Anexo G: el muro domina la superficie pero la
$R$ más débil de la puerta gobierna la potencia radiada, así que el espectro
de octavas se mantiene plano donde el muro solo caería. La línea discontinua
es el valor único ponderado A $L_{WA}$ formado a partir de las octavas.*

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

```python

from phonometry import building

# EN 12354-4 Anexo G, lado 1: un segmento de muro de hormigón de 10×20 m con
# una puerta industrial de 6×4 m, nivel interior Lp,in y Cd = -5 dB.
bands = [63, 125, 250, 500, 1000, 2000, 4000, 8000]
seg = building.radiated_sound_power(
    [building.FacadeElement("muro", area=176.0, r=[32, 36, 36, 33, 39, 49, 57, 63]),
     building.FacadeElement("puerta", area=24.0, r=[21, 23, 28, 30, 30, 30, 30, 30])],
    lp_in=[70, 74, 76, 72, 70, 67, 62, 57], area=200.0, c_d=-5.0,
    r_prime_cap=40.0, octave_bands=bands)

# Una línea: LW por octava con la línea de LWA ponderada A:
seg.plot(language="es")
plt.show()

# A mano, desde los campos del resultado:
x = np.arange(len(bands))
fig, ax = plt.subplots()
ax.bar(x, seg.l_w, label="LW radiada por octava")
ax.axhline(seg.l_w_dba, ls="--", color="tab:red",
           label=f"LWA = {seg.l_w_dba:.1f} dB(A)")
ax.set_xticks(x, [str(b) for b in bands])
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel("Nivel de potencia acústica radiada [dB re 1 pW]")
ax.set_title("Potencia acústica radiada EN 12354-4 (Anexo G)")
ax.legend()
plt.show()
```

</details>

> **Nota sobre los ejemplos resueltos.** Los ejemplos resueltos de 2000 arrastran
> pequeñas inconsistencias internas de redondeo en las bandas de octava altas (el
> $R'$ impreso de la Parte 3 no concuerda con sus propios índices parciales por
> elemento a 1 k/2 k; las filas de $R'$ de la Parte 4 por encima de 500 Hz no
> concuerdan con sus entradas de la Tabla G.2). La implementación es fiel a las
> fórmulas: reproduce exactamente las bandas bajas, todos los índices de un solo
> número y toda la propagación del Anexo E.

### Parámetros de `FacadeElement` / `facade_sound_reduction()` / `radiated_sound_power()`

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `FacadeElement.area` | float | m² | > 0 para `r` / `insertion_loss` | Área del elemento $S_i$ (se ignora para `dn_e`) |
| `FacadeElement.r` / `dn_e` / `insertion_loss` | float o secuencia | dB | dar exactamente uno | Elemento de área $R_i$ / elemento pequeño $D_{n,e}$ / pérdida por inserción del hueco |
| `facade_sound_reduction(area)` | float | m² | > 0 | Área total de la fachada $S$ |
| `facade_sound_reduction(volume)` | float | m³ | > 0 | Volumen de la sala receptora $V$ (Fórmula 13) |
| `facade_sound_reduction(delta_l_fs)` | float | dB | por defecto `0` | Término de forma de la fachada $\Delta L_{fs}$ (Anexo C; consúltalo con `facade_shape_level_difference`) |
| `radiated_sound_power(lp_in)` | float o secuencia | dB | — | Nivel interior $L_{p,in}$ por banda |
| `radiated_sound_power(c_d)` | float | dB | por defecto `-6` | Término de difusividad $C_d$ (Anexo B) |
| `radiated_sound_power(r_prime_cap)` | float | dB | por defecto `None` (sin tope) | Tope de campo opcional sobre $R'$, nota al pie del ejemplo del Anexo G (usa 40 dB), no parte de la Fórmula (2)/(3) |
| `radiated_sound_power(octave_bands)` | sec. de int | Hz | por defecto `None` | Centros de octava que casan con las bandas; habilita el $L_{WA}$ ponderado A |
| `facade_sound_reduction(frequencies)` | secuencia | Hz | por defecto `None`; longitud = nº de bandas | Centros de banda que se conservan en el resultado para las gráficas |
| `outdoor_attenuation(width, height, distance)` | float | m | > 0 | Lado radiante finito y distancia de recepción (Anexo E) |
| `outdoor_level(l_w, attenuation)` | float o sec. | dB | compatibles por difusión | $L_p$ exterior de uno o varios lados (Fórmula E.1) |

`facade_sound_reduction()` devuelve un `FacadePredictionResult` (`r_prime`, `r_45`,
`r_tr_s`, `d_2m_nt`, `element_r`, y los números únicos `r_tr_s_w` / `d_2m_nt_w` /
`c_tr`); `radiated_sound_power()` un `RadiatedPowerResult` (`l_w`, `r_prime`,
`l_w_dba`). Ambos exponen `.plot()`.

## Véase también

- [Medición del aislamiento en campo e índices](/phonometry/es/guides/insulation-field/):
  las magnitudes in situ medidas con las que se comprueba la predicción.
- [Medición del aislamiento en laboratorio](/phonometry/es/guides/insulation-lab/):
  los índices ISO 10140 y los datos de unión ISO 10848 que consume el modelo.
- [Absorción acústica en recintos (EN 12354-6)](/phonometry/es/guides/enclosed-space-absorption/):
  el miembro de absorción de la misma familia EN 12354.
- [Rigidez dinámica de materiales resilientes (EN 29052-1)](/phonometry/es/guides/dynamic-stiffness/):
  la entrada s' del término de suelo flotante de EN 12354-2.
- Referencia de la API: [`building.building_prediction`](/phonometry/es/reference/api/building/building-prediction/) y [`building.facade_prediction`](/phonometry/es/reference/api/building/facade-prediction/).
