<!-- canonical: https://jmrplens.github.io/phonometry/es/buildings/design/detailed-prediction/ -->
Source: https://jmrplens.github.io/phonometry/es/buildings/design/detailed-prediction/

El modelo simplificado de
[Predicción del aislamiento acústico (EN 12354)](/phonometry/es/buildings/design/insulation-prediction/)
devuelve un solo número, $R'_\mathrm{w}$ o $L'_\mathrm{n,w}$, y oculta todo lo que ocurre
dentro del espectro. El **modelo detallado** (ISO 12354-1:2017 apartado 4.2 a
ruido aéreo, ISO 12354-2:2017 apartado 4.2 a ruido de impactos) lleva en cambio
cada magnitud por las bandas de tercio de octava: convierte los datos de
laboratorio del elemento en sus valores *in situ*, forma cada trayectoria de
transmisión banda a banda, las suma energéticamente y solo entonces valora el
espectro con ISO 717. Es lo que se calcula cuando se conocen los espectros de
los elementos y la pregunta no es «¿cumple?» sino «¿qué trayectoria tengo que
corregir, y en qué bandas?».

Esta página recorre el edificio del ejemplo resuelto de la propia norma de
principio a fin y cierra con la rama ligera (Tipo B) y con las comprobaciones
que la norma ofrece sobre sus propios números.

## La cadena, banda a banda

Antes de nada: la norma parte todos los elementos en dos, y toda la cadena de
abajo es una de las dos ramas. Un **elemento de Tipo A** (apartado 3.3.5) es
aquel cuyo tiempo de reverberación estructural lo fijan principalmente los
elementos a los que está conectado, al menos hasta la banda de tercio de octava
de 1 kHz, y a través del cual el nivel de vibración cae menos de 6 dB en la
dirección perpendicular a la línea de unión. El hormigón vertido in situ, la
madera maciza incluida la contralaminada, el vidrio, el plástico, el metal y la
fábrica de bloques con un acabado que la conecte mecánicamente son los ejemplos
que da la propia norma. Un **elemento de Tipo B** (3.3.6) es cualquier otra cosa,
típicamente placa de yeso o revestimiento de madera sobre un entramado de madera
o de metal. La distinción no es académica: es exactamente por lo que la cadena de
Tipo A arma el factor de pérdidas a partir del perímetro de uniones, porque en un
elemento de Tipo A las uniones *son* el amortiguamiento. Para un elemento de
Tipo B la norma toma $T_\mathrm{s,situ} = T_\mathrm{s,lab}$, así que la
corrección in situ vale 0 dB y $R_\mathrm{situ} = R$.

El edificio del Anexo L, y los pasos 1 a 5 de abajo, son la rama de Tipo A. Dos
consecuencias conviene llevárselas. La clasificación es **por banda de
frecuencia** — las notas 2 de las dos definiciones dicen que una pared de fábrica
puede ser de Tipo A en bajas y medias y de Tipo B en lo alto del rango —, así que
el título binario de la sección de construcciones ligeras de más abajo simplifica
una frontera que en realidad se mueve con la frecuencia. Y en una unión mixta
(apartado 4.2.2.3, «por ejemplo, una pared de Tipo B sobre un forjado de
Tipo A») la fórmula (10) todavía se puede usar como aproximación, tomando la
longitud de absorción equivalente del elemento de Tipo B como su superficie
dividida por la longitud de referencia,
$a_{i,\mathrm{situ}} = S_{i,\mathrm{situ}}/l_0$ (fórmula 13). Ejecutar
`in_situ_element` sobre una partición de entramado, en cambio, arma un factor de
pérdidas total a partir de unas uniones que no controlan su amortiguamiento, y
nada te avisará.

Ambas partes comparten la misma maquinaria, así que el edificio se describe una
sola vez y las cadenas de ruido aéreo y de impactos leen los mismos datos de
elemento in situ.

**1. Comportamiento del elemento.** Para un elemento homogéneo la norma calcula
el índice de reducción acústica a partir de las propiedades del material
(Anexo B):

$$
\tau = \left(\frac{2\rho_o c_o}{2\pi f m'}\right)^2 \cdot
\frac{\pi f_\mathrm{c} \sigma^2}{2 f \eta_\mathrm{tot}} \quad (f > f_\mathrm{c})
$$

con el factor de radiación para ondas de flexión libres $\sigma$ (fórmulas
B.4-B.6), el factor de radiación para ondas forzadas $\sigma_\mathrm{f}$ (fórmula B.3)
por debajo de $f_\mathrm{c}$ y una tercera rama para la banda que contiene $f_\mathrm{c}$. Por
encima de aproximadamente 1 kHz un elemento grueso deja de mejorar, y la
fórmula (B.10) acota inferiormente el factor de transmisión con una meseta
fijada por $\rho c_\mathrm{L}$.

**2. Conversión in situ.** El elemento radia y se amortigua de forma distinta
en el edificio y en el marco de ensayo. El factor de pérdidas total in situ es
(fórmula C.1)

$$
\eta_\mathrm{tot} = \eta_\mathrm{int}
+ \frac{2\rho_o c_o \sigma}{2\pi f m'}
+ \frac{c_o}{\pi^2 S \sqrt{f f_\mathrm{c}}} \sum_k l_k \alpha_k
$$

siendo los tres términos las pérdidas internas del material, la radiación al
aire y las pérdidas en el perímetro. Los coeficientes de perímetro se deducen
de las propias uniones, $\alpha_k = \sum_j \sqrt{f_{\mathrm{c},j}/f_\mathrm{ref}}
\, 10^{-K_{ij}/10}$ (fórmula C.4). De $\eta_\mathrm{tot}$ salen el tiempo de
reverberación estructural $T_\mathrm{s} = 2{,}2/(f\,\eta_\mathrm{tot})$ y la longitud de
absorción equivalente $a_\mathrm{situ} = 2{,}2\pi^2 S \sqrt{f_\mathrm{ref}/f} /
(c_o T_\mathrm{s,situ})$ (fórmula 11).

**3. Uniones.** El $K_{ij}$, invariante frente a la situación, se convierte en
la caída de nivel que la unión produce realmente (fórmula 10):

$$
\overline{D}_{v,ij,\mathrm{situ}} = K_{ij}
- 10\log_{10}\!\left(\frac{l_{ij}}{\sqrt{a_{i,\mathrm{situ}}\,a_{j,\mathrm{situ}}}}\right)
\ \ge 0\ \text{dB}
$$

**4. Trayectorias.** La trayectoria directa es $R_\mathrm{Dd} = R_\mathrm{s,situ} +
\Delta R_\mathrm{D,situ} + \Delta R_\mathrm{d,situ}$ (fórmula 14) y cada trayectoria
por flancos (fórmula 15)

$$
R_{ij} = \frac{R_{i,\mathrm{situ}}}{2} + \Delta R_{i,\mathrm{situ}}
+ \frac{R_{j,\mathrm{situ}}}{2} + \Delta R_{j,\mathrm{situ}}
+ \overline{D}_{v,ij,\mathrm{situ}}
+ 10\log_{10}\!\left(\frac{S_\mathrm{s}}{\sqrt{S_i S_j}}\right)
$$

La parte de impactos discurre en paralelo: el nivel por bandas del forjado
desnudo es
$L_\mathrm{n} = 155 - 30\log_{10} m' + 10\log_{10} T_\mathrm{s} + 10\log_{10}\sigma + 10\log_{10}(f/f_\mathrm{ref})$
(fórmula B.2 de la parte 2), la trayectoria directa resta el revestimiento de suelo
y cualquier techo suspendido (fórmula 11), y cada trayectoria por flancos es la
fórmula (12).

**5. Ensamblaje.** $R' = -10\log_{10}\sum 10^{-R/10}$ sobre las trece trayectorias de un
recinto con cuatro elementos de flanco, y $L'_\mathrm{n} = 10\log_{10}\sum 10^{L_\mathrm{n}/10}$ sobre
las cinco trayectorias de impactos, y después ISO 717.

## Partir de datos de elemento medidos

El apartado 4.1 es explícito sobre de dónde deberían salir los números: los datos
acústicos de los elementos implicados *deberían tomarse principalmente de
mediciones normalizadas de laboratorio*, y se deben declarar las fuentes de los
datos utilizados. El cálculo del Anexo B con el que abre esta página es el
recurso para cuando no existe medición. Un proyecto real suele partir de una hoja
de catálogo o de un informe de ensayo ISO 10140, y esa vía tiene sus propios tres
pasos.

**El traslado al edificio es un traslado de factor de pérdidas.** El laboratorio
midió el elemento en un marco de ensayo cuyo amortiguamiento no es el del
edificio, así que la fórmula (9) reescala el índice por el cociente de los dos
tiempos de reverberación estructurales,
$R_\mathrm{situ} = R - 10\lg(T_\mathrm{s,situ}/T_\mathrm{s,lab})$, y la fórmula (5)
de la parte 2 hace lo mismo con el nivel de impactos **con el signo cambiado**.
Lee el signo: un elemento más amortiguado en el edificio que en el marco de
ensayo tiene un $T_\mathrm{s}$ más corto in situ, lo que *sube* su índice y *baja* su
nivel de impactos; un elemento menos amortiguado pierde índice. La propia nota de
la norma añade que $R_\mathrm{situ} = R$ es una primera aproximación utilizable, y
para un elemento de Tipo B es exacta.

**$T_\mathrm{s,lab}$ sale del informe de ensayo, o del Anexo C.** Si el
laboratorio lo imprimió, úsalo. Si no, la fórmula (C.3) estima el factor de
pérdidas total de laboratorio como
$\eta_\mathrm{tot,lab} \approx \eta_\mathrm{int} + m'/(485\sqrt{f}) \approx 0{,}01 +
m'/(485\sqrt{f})$, válida para elementos por debajo de $m'$ = 800 kg/m², con
$\eta_\mathrm{int}$ tomado normalmente como 0,01 (la tabla B.1 del Anexo B lo
tabula por material). `laboratory_total_loss_factor` es esa fórmula y
`structural_reverberation_time` la convierte en $T_\mathrm{s} = 2{,}2/(f\eta_\mathrm{tot})$;
$T_\mathrm{s,situ}$ sale de la misma cadena de la fórmula (C.1) que la página ya
ejecuta.

**Las trayectorias por flancos necesitan una corrección más que la directa.** Por
debajo de su frecuencia crítica, un $R$ de laboratorio contiene transmisión
forzada, que una trayectoria por flancos no lleva: por una unión solo pasan ondas
de flexión libres. El Anexo B.1 corrige, por tanto, un $R$ medido a transmisión
resonante únicamente antes de que entre en una trayectoria por flancos — la
estimación de 8 dB para un elemento de entramado simple sin cámara —, mientras
que la trayectoria **directa** conserva la transmisión forzada que midió el
laboratorio. Eso es `resonant_sound_reduction_index`, y
`in_situ_element(..., resonant_only=True)` hace lo mismo sobre un elemento
calculado.

Los cuatro nombres de abajo (`laboratory_total_loss_factor`,
`structural_reverberation_time`, `in_situ_reduction_index` e
`in_situ_impact_level`) son nombres de primer nivel de `phonometry`; añádelos al
bloque de importación de la sección anterior para ejecutar esto.

```python
# Un R y un Ln de laboratorio medidos para el forjado separador de 220 mm,
# trasladados al edificio. `el` es el elemento in situ de la sección de arriba,
# cuyo `reverberation_time` es Ts,situ.
eta_lab = laboratory_total_loss_factor(bands, mass_per_area=484.0,
                                       internal_loss_factor=0.005)   # (C.3)
ts_lab = structural_reverberation_time(bands, eta_lab)               # (C.1)
print(np.round(ts_lab[[0, 10]], 3))                    # [0.301 0.089] s
print(np.round(el.reverberation_time[[0, 10]], 3))     # [0.53  0.152] s, in situ

r_situ = in_situ_reduction_index(r_measured, el.reverberation_time, ts_lab)
ln_situ = in_situ_impact_level(ln_measured, el.reverberation_time, ts_lab)
# Este forjado está *menos* amortiguado en el edificio que en el marco de ensayo
# (Ts,situ es el mayor de los dos), así que la fórmula (9) le quita de 2,0 a
# 2,5 dB de índice en todo el rango y la fórmula (5) de la parte 2 se los suma a
# su nivel de impactos.

# Una trayectoria por flancos toma la forma de transmisión resonante únicamente
# de ese mismo índice medido; la directa, no.
r_flanking = resonant_sound_reduction_index(r_situ, bands, critical_frequency=76.8)
```

### Qué necesitas antes de empezar

| Magnitud | De dónde sale |
| :--- | :--- |
| $R$, $L_\mathrm{n}$ por banda | Informe de ensayo ISO 10140-2 / ISO 10140-3 — **con el tiempo de reverberación estructural de laboratorio del mismo informe** |
| $\Delta R$ de un trasdosado | Anexo G de ISO 10140-1, o Anexo D de ISO 12354-1 |
| $\Delta L$ de un revestimiento | [ISO 16251-1](/phonometry/es/buildings/design/impact-improvement/) o ISO 10140-3 |
| $K_{ij}$ por unión | ISO 10848-1/-4, o el [catálogo del Anexo E](/phonometry/es/buildings/design/insulation-prediction/) |
| $m'$, $f_\mathrm{c}$, $\eta_\mathrm{int}$, $c_\mathrm{L}$ | La hoja de características del material, o la tabla B.1 del Anexo B |
| Superficies y longitudes de acoplamiento | Los planos, medidas **de superficie a superficie** |

Esa última fila cambia una respuesta: una longitud de acoplamiento medida de
superficie a superficie en lugar de de eje a eje se diferencia en el espesor de
una hoja en un elemento trasdosado o de doble hoja, y $l_{ij}$ entra directamente
en la fórmula (10). El apartado 4.1 exige además declarar la procedencia de cada
dato de entrada, que en una ficha es para lo que está el campo `notes` de
`ReportMetadata`.

## El edificio resuelto del Anexo L / Anexo G

El Anexo L de ISO 12354-1:2017 y el Anexo G de ISO 12354-2:2017 describen el
**mismo** edificio: dos viviendas una sobre otra, recintos de 55 m³, un forjado
separador de 5,00 m × 4,00 m de hormigón de 220 mm con una losa flotante de
35 mm sobre lana mineral, dos fachadas de bloque de hormigón celular de 365 mm
y dos particiones interiores de silicocalcáreo de 200 mm, que se encuentran en
uniones rígidas en T y en cruz. Entre ambos imprimen cerca de veinte tablas por
bandas, una por magnitud intermedia, lo que convierte el ejemplo en un oráculo
completo del modelo. Ocho defectos de esas tablas impresas están registrados en
[Erratas](/phonometry/es/reference/errata/), y el conjunto de datos de abajo
toma las lecturas corregidas.

El dibujo es lo que ata la lista de elementos a los números que multiplica el
fragmento de código. La suma de perímetro del forjado separador son 9 m de borde
exterior más 9 m de borde interior porque el forjado de 5,00 m × 4,00 m se
encuentra con una fachada en cada borde de 4,00 m y con una partición interior en
cada borde de 5,00 m, y cada una de esas uniones lleva el forjado por encima y
por debajo. El perímetro propio de una fachada toma 8,0 m de unión horizontal
(sus bordes superior e inferior, 4,00 m cada uno) y 2,75 m de vertical. Las
uniones de forjado con fachada son T rígidas y las de forjado con partición
interior, cruces rígidas. Y las trece trayectorias son una trayectoria directa
más tres por cada elemento de flanco, $1 + 4\times3$.

```python

from phonometry import (
    HomogeneousElement, airborne_flanking_path, detailed_airborne_prediction,
    direct_reduction_index, floating_floor_improvement, in_situ_element,
    junction_vibration_reduction, perimeter_absorption_coefficient,
)

bands = np.array([50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630,
                  800, 1000, 1250, 1600, 2000, 2500, 3150], float)

# Uniones del Anexo E (sin redondear): forjado-fachada en T rígida, fachada
# pasante, forjado-partición interior en cruz rígida, partición pasante.
k_floor_ext = junction_vibration_reduction("rigid_t", "corner", 484.0 / 219.0)
k_ext_ext = junction_vibration_reduction("rigid_t", "through", 484.0 / 219.0)
k_floor_int = junction_vibration_reduction("rigid_cross", "corner", 360.0 / 484.0)
k_int_int = junction_vibration_reduction("rigid_cross", "through", 484.0 / 360.0)
print(round(k_floor_ext, 1), round(k_ext_ext, 1))     # 6.4 11.2  (tabla L.5)
print(round(k_floor_int, 1), round(k_int_int, 1))     # 8.8 11.0  (tabla L.6)

# Perímetro del forjado: topa contra una fachada arriba y abajo en cada uno de
# sus dos bordes exteriores, y cruza las particiones interiores en los otros dos.
a_at_ext = perimeter_absorption_coefficient([92.6, 92.6], [k_floor_ext] * 2)
a_at_int = perimeter_absorption_coefficient(
    [76.8, 128.4, 128.4], [junction_vibration_reduction(
        "rigid_cross", "through", 360.0 / 484.0), k_floor_int, k_floor_int])
floor_perimeter = 9.0 * (a_at_ext + a_at_int)         # 2,659 m (fórmula C.4)

floor = HomogeneousElement("floor", 20.0, 5.0, 4.0, 484.0, 76.8, 0.005,
                           floor_perimeter, 2200.0, 3800.0)
el = in_situ_element(floor, bands)
print(np.round(el.total_loss_factor[[0, 10]], 4))     # [0.0831 0.029 ]  tabla L.3
print(np.round(el.sound_reduction_index[[0, 10]], 1)) # [31.8 54.9]      tabla L.3
print(np.round(el.impact_level[[0, 10]], 1))          # [57.3 63.6]      tabla G.3
print(np.round(el.absorption_length[[0, 10]], 1))     # [10.8 11.9]      tabla L.4
```

Cada columna impresa de las tablas L.2, L.3, L.4, G.3 y G.4 se reproduce con un
margen de 0,06 dB, y el mismo conjunto de datos alimenta los dos totales.

```python
# Suelo flotante: losa de 35 mm, m' = 73,5 kg/m2 sobre s' = 8 MN/m3.
f0 = 160.0 * np.sqrt(8.0 / 73.5)                      # 52,8 Hz (fórmula C.2)
delta = floating_floor_improvement(bands, resonance_frequency=f0)  # 30 lg(f/f0)

wall = in_situ_element(HomogeneousElement(
    "ext1", 11.0, 4.0, 2.75, 219.0, 92.6, 0.0125, 2.375, 600.0, 1900.0), bands)

# Trayectoria D1 (Df: forjado separador -> fachada 1), tabla L.4.
d1 = airborne_flanking_path(
    label="D1", kind="Df", element_i=el, element_j=wall,
    vibration_reduction_index=k_floor_ext, coupling_length=4.0,
    separating_area=20.0, delta_r_i=delta)
print(np.round(d1.values[[0, 10]], 1))                # [ 41.2  93.6]  tabla L.1
```

Ensamblar la trayectoria directa y las doce trayectorias por flancos da el índice
aparente por bandas, su reparto de energía y la valoración ISO 717-1 en una
sola llamada:

```python
# `paths` contiene las doce trayectorias por flancos de los cuatro elementos,
# construidas como `d1` más arriba; el bloque de código bajo la figura las
# construye todas.
res = detailed_airborne_prediction(
    bands, direct_index=direct_reduction_index(el.sound_reduction_index,
                                               delta_r_source=delta),
    flanking_paths=paths)
print(np.round(res.r_prime[[0, 10]], 1))   # [28.8 55.9]   total de la tabla L.1
print(res.rating.rating, res.dominant[0])  # 57 'Dd'
res.plot()                                 # barras de contribución por banda
```

*Esta es la figura por la que existe el modelo detallado. Por debajo de 80 Hz
el problema es el propio forjado separador, de modo que una losa más pesada o
un suelo flotante mejor ayudarían; decae en la transición de 80 Hz a 160 Hz y a
partir de 200 Hz ha salido por completo del reparto, y son las trayectorias por
flancos a través de las paredes las que fijan $R'$ por sí solos, así que
ningún trabajo sobre el forjado movería ya el resultado. El número único
$R'_\mathrm{w} = 57$ dB no dice nada de eso.*

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

```python

from phonometry import (
    HomogeneousElement, airborne_flanking_path, detailed_airborne_prediction,
    direct_reduction_index, floating_floor_improvement, in_situ_element,
    junction_vibration_reduction, perimeter_absorption_coefficient,
)

bands = np.array([50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630,
                  800, 1000, 1250, 1600, 2000, 2500, 3150], float)
k = {
    "floor-ext": junction_vibration_reduction("rigid_t", "corner", 484.0 / 219.0),
    "ext-ext": junction_vibration_reduction("rigid_t", "through", 484.0 / 219.0),
    "floor-floor": junction_vibration_reduction("rigid_cross", "through", 360.0 / 484.0),
    "floor-int": junction_vibration_reduction("rigid_cross", "corner", 360.0 / 484.0),
    "int-int": junction_vibration_reduction("rigid_cross", "through", 484.0 / 360.0),
    "int-ext": junction_vibration_reduction("rigid_t", "corner", 360.0 / 219.0),
    "extT-ext": junction_vibration_reduction("rigid_t", "through", 360.0 / 219.0),
    "corner": junction_vibration_reduction("corner", "corner", 1.0),
    "int-int-x": junction_vibration_reduction("rigid_cross", "through", 1.0),
}
a = perimeter_absorption_coefficient
floor_sum = 9.0 * (a([92.6, 92.6], [k["floor-ext"]] * 2)
                   + a([76.8, 128.4, 128.4],
                       [k["floor-floor"], k["floor-int"], k["floor-int"]]))
ext_top = a([76.8, 92.6], [k["floor-ext"], k["ext-ext"]])
ext_side = a([92.6], [k["corner"]]) + a([128.4, 92.6], [k["int-ext"], k["extT-ext"]])
int_top = a([76.8, 76.8, 128.4], [k["floor-int"], k["floor-int"], k["int-int"]])
int_side = a([92.6, 92.6], [k["int-ext"]] * 2) + a([128.4] * 3, [k["int-int-x"]] * 3)

specs = {
    "floor": (20.0, 5.0, 4.0, 484.0, 76.8, 0.005, floor_sum, 2200.0, 3800.0),
    "ext1": (11.0, 4.0, 2.75, 219.0, 92.6, 0.0125,
             8.0 * ext_top + 2.75 * ext_side, 600.0, 1900.0),
    "ext2": (13.75, 5.0, 2.75, 219.0, 92.6, 0.0125,
             10.0 * ext_top + 2.75 * ext_side, 600.0, 1900.0),
    "int1": (11.0, 4.0, 2.75, 360.0, 128.4, 0.01,
             8.0 * int_top + 2.75 * int_side, 1800.0, 2500.0),
    "int2": (13.75, 5.0, 2.75, 360.0, 128.4, 0.01,
             10.0 * int_top + 2.75 * int_side, 1800.0, 2500.0),
}
situ = {name: in_situ_element(HomogeneousElement(name, *spec), bands)
        for name, spec in specs.items()}
delta = floating_floor_improvement(bands,
                                   resonance_frequency=160.0 * np.sqrt(8.0 / 73.5))

paths = []
for tag, name, lij in (("1", "ext1", 4.0), ("2", "ext2", 5.0),
                       ("3", "int1", 4.0), ("4", "int2", 5.0)):
    wall = situ[name]
    cross = k["floor-ext"] if name.startswith("ext") else k["floor-int"]
    through = k["ext-ext"] if name.startswith("ext") else k["int-int"]
    paths += [
        airborne_flanking_path(label=f"D{tag}", kind="Df", element_i=situ["floor"],
                               element_j=wall, vibration_reduction_index=cross,
                               coupling_length=lij, separating_area=20.0,
                               delta_r_i=delta),
        airborne_flanking_path(label=f"{tag}d", kind="Fd", element_i=wall,
                               element_j=situ["floor"], vibration_reduction_index=cross,
                               coupling_length=lij, separating_area=20.0),
        airborne_flanking_path(label=f"{tag}{tag}", kind="Ff", element_i=wall,
                               element_j=wall, vibration_reduction_index=through,
                               coupling_length=lij, separating_area=20.0),
    ]
res = detailed_airborne_prediction(
    bands,
    direct_index=direct_reduction_index(situ["floor"].sound_reduction_index,
                                        delta_r_source=delta),
    flanking_paths=paths)

# Una línea: las contribuciones por trayectoria y banda con R' superpuesto.
res.plot()
plt.show()
```

</details>

La parte de impactos del mismo edificio se apoya en el mismo diccionario
`situ`:

```python
from phonometry import (detailed_impact_prediction, direct_impact_level,
                        impact_flanking_path)

direct = direct_impact_level(situ["floor"].impact_level, delta_l=delta)
flanking = [
    impact_flanking_path(label=f"Df{tag}", floor=situ["floor"], element_j=situ[name],
                         vibration_reduction_index=(
                             k["floor-ext"] if name.startswith("ext") else k["floor-int"]),
                         coupling_length=lij, delta_l=delta)
    for tag, name, lij in (("1", "ext1", 4.0), ("2", "ext2", 5.0),
                           ("3", "int1", 4.0), ("4", "int2", 5.0))
]
imp = detailed_impact_prediction(bands, direct_level=direct, flanking_paths=flanking)
print(np.round(imp.l_prime_n[[3, 10]], 1))     # [54.  35.9]   total de la tabla G.1
print(imp.rating.rating, imp.rating.ci)        # 41 2           impreso 41,0 (2)
```

*La mitad de impactos del mismo edificio, y es una imagen distinta de la de ruido
aéreo. Hay cinco trayectorias, no trece, porque solo se excita el forjado: la
máquina de impactos se apoya en él, así que hay una trayectoria directa y una
trayectoria Df hacia cada una de las cuatro paredes, y ninguna Ff ni Fd. La
trayectoria directa a través del forjado excitado manda en todas las bandas. Esa
es la lección práctica — un problema de impactos se arregla en el forjado emisor,
no en las uniones.*

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

```python
# Una línea: las contribuciones por camino y banda con L'n superpuesto.
imp.plot()
plt.show()
```

</details>

Lee la valoración de la misma manera. $L'_\mathrm{n,w} = 41$ dB con $C_\mathrm{I} = +2$ dB
significa que el nivel sin ponderar, el que importa para el caminar, queda por
encima de la valoración ponderada, que es la firma de un forjado cuya mejora se
concentra arriba — exactamente lo que hace un suelo flotante con
$f_0 = 52{,}8$ Hz y una ley de 30 lg. Hay tres palancas que lo mueven, en el
orden en que el modelo les responde: una capa elástica *más blanda* baja $f_0$ y
levanta toda la curva de mejora; una losa base *más pesada* baja directamente el
nivel desnudo a través de la fórmula (B.2) de la parte 2; y una unión mejor no
hace casi nada mientras no se haya resuelto la trayectoria directa. Fíjate además
en que el $\Delta L$ del suelo flotante se resta igual de la trayectoria directa
y de todas las trayectorias por flancos, porque las cinco arrancan en el mismo
forjado excitado.

## Simplificado frente a detallado

La norma aplica su modelo simplificado al mismo edificio (tablas L.10 / G.10):
$R'_\mathrm{w} = 57{,}0$ dB y $L'_\mathrm{n,w} = 39{,}7$ dB, frente a los $R'_\mathrm{w} = 57$ dB y
$L'_\mathrm{n,w} = 41$ dB del modelo detallado. Ambos coinciden holgadamente dentro de
la dispersión que los propios modelos declaran, y el conjunto de pruebas de la
biblioteca fija esa coincidencia. La ventaja del modelo detallado no está en la
exactitud del número único sino en el espectro que hay detrás: la predicción a
ruido aéreo del modelo detallado no tiene error sistemático y su desviación
típica es de 1,5 dB a 2,5 dB (apartado 5), frente a unos 2 dB del simplificado.

## Construcciones ligeras (Tipo B)

Para elementos cuyo tiempo de reverberación estructural *no* lo fijan los
elementos conectados, la norma toma $T_\mathrm{s,situ} = T_\mathrm{s,lab}$ y
describe la unión con la diferencia de niveles de velocidad **normalizada**
$\overline{D}_{v,ij,\mathrm{n}}$ en lugar de $K_{ij}$ (fórmula 17), o con una medición
en laboratorio de la diferencia de niveles por flancos $D_\mathrm{n,f}$ (fórmula 16).
Por debajo de $f_\mathrm{c}$ los índices del elemento deben corregirse antes a
transmisión resonante únicamente (Anexo B.1/B.2, una estimación de 8 dB para
elementos de entramado simple sin cámara). El lado de impactos ofrece las dos
mismas trayectorias: la fórmula (14) de la parte 2 a partir de
$\overline{D}_{v,ij,\mathrm{n}}$ y la fórmula (13) de la parte 2 a partir de un nivel
de impactos normalizado por flancos medido $L_\mathrm{n,f}$.

A diferencia de la cadena de Tipo A, esta rama consume datos de unión
**medidos**, así que sus cuatro entradas son arrays por banda sobre `bands` que
salen de un sitio concreto. `r_wall_leaf` es el índice de reducción acústica de
laboratorio de la hoja por banda (ISO 10140-2), corregido por debajo de su
frecuencia crítica a transmisión resonante únicamente porque una trayectoria por
flancos solo lleva ondas de flexión libres. `dv_n` es la diferencia de niveles de
velocidad de la unión promediada en las dos direcciones y **normalizada**, en dB,
medida según
[ISO 10848-2](/phonometry/es/buildings/insulation/flanking-lab/) y referida a una
longitud de referencia de 1 m. `dnf_13` es la diferencia de niveles por flancos
normalizada $D_\mathrm{n,f}$ de una unión medida en laboratorio, en dB, que la llamada
reescala por el cociente entre las longitudes de acoplamiento de obra y de
laboratorio. Y `lnf_13` es su gemelo de impactos, el nivel de impactos
normalizado por flancos $L_\mathrm{n,f}$ en dB, que reescala por superficie y por
longitud de acoplamiento. El bloque de abajo es un extracto: parte de esos cuatro
arrays.

```python
from phonometry import (flanking_impact_level_from_flanking_level,
                        flanking_reduction_index_from_flanking_level,
                        flanking_reduction_index_from_normalized_difference,
                        resonant_sound_reduction_index)

# ISO 12354-1 L.2.1: edificio de entramado de madera, forjado 20 m2, unión 4 m.
r_wall_leaf = ...   # R medido de la hoja interior por banda, dB (ISO 10140-2)
dv_n = ...          # dif. de niveles de velocidad de unión normalizada, dB (ISO 10848-2)
dnf_13 = ...        # dif. de niveles por flancos normalizada de laboratorio Dn,f, dB
lnf_13 = ...        # nivel de impactos normalizado por flancos de laboratorio Ln,f, dB

r_star = resonant_sound_reduction_index(r_wall_leaf, bands,
                                        critical_frequency=2200.0)   # +8 dB bajo fc
r_ff = flanking_reduction_index_from_normalized_difference(
    index_i=r_star, index_j=r_star, normalized_velocity_level_difference=dv_n,
    separating_area=20.0, coupling_length=4.0)                        # tabla L.11

# ISO 12354-1 L.2.2: unión medida entre dos paredes de entramado de madera.
r13 = flanking_reduction_index_from_flanking_level(
    dnf_13, separating_area=10.44, coupling_length=2.41,
    laboratory_coupling_length=2.5)                                   # tabla L.15

# ISO 12354-2 fórmula (13): el gemelo de impactos, a partir de un Ln,f medido.
ln_13 = flanking_impact_level_from_flanking_level(
    lnf_13, area=20.0, laboratory_area=10.0,
    coupling_length=4.0, laboratory_coupling_length=4.5)
```

## Comprobaciones que da la propia norma

Dos identidades permiten que un espectro se compruebe a sí mismo. Para un
forjado homogéneo el índice a ruido aéreo y el nivel de impactos suman una
función solo de la frecuencia (fórmulas B.3/B.4 de la parte 2),
$R + L_\mathrm{n} = 38 + 30\log_{10} f$ en bandas de tercio de octava y $43 + 30\log_{10} f$ en
bandas de octava, válida donde la transmisión forzada es despreciable;
`reciprocity_impact_level` la implementa. Y la tabla B.2 de la parte 2 tabula
el $L_\mathrm{n}$ en bandas de octava de cuatro forjados monolíticos calculados como los
calcula este módulo, una referencia útil de contraste para una solución
constructiva nueva.

## Parámetros de `in_situ_element()`

| Parámetro | Tipo | Unidades | Rango / por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `element` | `HomogeneousElement` | — | — | Área, longitudes de lado, $m'$, $f_\mathrm{c}$, $\eta_\mathrm{int}$, $\sum l_k \alpha_k$ y opcionalmente $\rho$/$c_\mathrm{L}$ |
| `frequencies` | array | Hz | > 0 | Frecuencias centrales de banda |
| `bands` | str | — | `'third'` (por defecto) / `'octave'` | Fija la banda que lleva la rama $f \approx f_\mathrm{c}$ |
| `resonant_only` | bool | — | por defecto `False` | Elimina el término de transmisión forzada por debajo de $f_\mathrm{c}$ (Anexo B.1, trayectorias por flancos) |
| `speed_of_sound` | float | m/s | por defecto `340` | El valor que fija el Anexo A de ISO 12354-1 |
| `air_density` | float | kg/m³ | por defecto `1.29` | $\rho_o$ del modelo del Anexo B |

## Parámetros de `airborne_flanking_path()` / `impact_flanking_path()`

| Parámetro | Tipo | Unidades | Rango / por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `label` | str | — | — | Nombre visible de la trayectoria |
| `kind` | str | — | `'Ff'` / `'Df'` / `'Fd'` | Solo a ruido aéreo; el constructor de impactos es siempre `Df` |
| `element_i` / `element_j` | `InSituElementResult` | — | — | Elementos del recinto emisor y del receptor (`floor` / `element_j` en impactos) |
| `vibration_reduction_index` | float o array | dB | — | $K_{ij}$ de esta trayectoria |
| `coupling_length` | float | m | > 0 | Longitud de acoplamiento de la unión $l_{ij}$ |
| `separating_area` | float | m² | > 0 | $S_\mathrm{s}$ (solo a ruido aéreo) |
| `delta_r_i` / `delta_r_j` | float o array | dB | por defecto `0` | Mejoras por trasdosados |
| `delta_l` | float o array | dB | por defecto `0` | Mejora del revestimiento de suelo (solo impactos) |

## Informe de predicción detallada (`.report()`)

`DetailedAirborneResult.report()` y `DetailedImpactResult.report()` escriben la
versión por bandas de las fichas de predicción simplificada: el mismo formato
de una página, una línea de base que cita el apartado 4.2 de ISO 12354-1/-2:2017,
la tabla de cuota de energía por trayectoria junto a la figura de contribución por
banda, el $R'_\mathrm{w}$ / $L'_\mathrm{n,w}$ recuadrado, la desviación típica de 1,5 dB a 2,5 dB
del modelo detallado y un veredicto CUMPLE/NO CUMPLE frente a un `requirement`.
`verbose=True` añade la banda en la que cada trayectoria alcanza su máximo. Ambos
necesitan la valoración ISO 717, así que el espectro debe cubrir de 100 Hz a
3150 Hz (o de 125 Hz a 2000 Hz en bandas de octava).

```python
airborne.report("prediccion-aereo.pdf", language="es")   # R'w, trece trayectorias
impact.report("prediccion-impactos.pdf", language="es")  # L'n,w, cinco trayectorias
```

Las fichas de ejemplo se regeneran con `make reports` y se mantienen
renderizadas en el repositorio; pulsa una vista previa para abrir el PDF. Las
dos muestran el edificio del anexo L de esta página: los mismos elementos, las
mismas uniones y el mismo suelo flotante con los que se construyen las tablas
de arriba.

## Qué cubre esta guía

La cadena por bandas del apartado 4.2 para elementos de **Tipo A**: el índice
de reducción acústica y el nivel de impactos de elemento homogéneo del Anexo B
y la conversión in situ del Anexo C mediante `HomogeneousElement`,
`in_situ_element` y `perimeter_absorption_coefficient`; el traslado de datos
de laboratorio *medidos* mediante `laboratory_total_loss_factor`,
`structural_reverberation_time`, `in_situ_reduction_index` e
`in_situ_impact_level` (fórmula 9 y fórmula 5 de la parte 2); la caída de
unión in situ de la fórmula (10); las trayectorias aéreas directa y por
flancos de las fórmulas (14)/(15) mediante `direct_reduction_index` y
`airborne_flanking_path` y sus gemelas de impactos `direct_impact_level` e
`impact_flanking_path`; las vías de **Tipo B** de las fórmulas (16)/(17) y la
corrección resonante del Anexo B.1/B.2 mediante
`resonant_sound_reduction_index`; el ensamblaje y la valoración ISO 717
mediante `detailed_airborne_prediction` y `detailed_impact_prediction`; la
identidad de reciprocidad B.3/B.4 de la parte 2 mediante
`reciprocity_impact_level`; y las dos fichas mediante `.report()`. El apartado
5 declara que el modelo a ruido aéreo no tiene error sistemático y que su
desviación típica es de 1,5 dB a 2,5 dB para edificios de elementos
homogéneos, suponiendo una buena ejecución — la cifra menor cuando se tiene en
cuenta cada aspecto, la mayor en situaciones complejas o cuando se desprecia
el tiempo de reverberación estructural.

Aquí solo se calculan elementos homogéneos del Anexo B; el espectro de un
elemento ligero, doble o compuesto es un dato de entrada, que sale de
[Predicción del aislamiento de
paneles](/phonometry/es/buildings/design/panel-sound-insulation/) o de un
informe de ensayo. El propio catálogo de uniones del Anexo E vive en
[Predicción del aislamiento acústico (EN
12354)](/phonometry/es/buildings/design/insulation-prediction/), y la mejora
por trasdosado del Anexo D de la Parte 1 en [Predicción del comportamiento de
capas elásticas](/phonometry/es/buildings/design/resilient-layers/); las tablas
por defecto de los anexos D y F de EN 12354-5 no están implementadas en
ninguna parte. La rama de Tipo B se muestra a partir de sus entradas
normativas en lugar de resolverse de principio a fin. La transmisión aérea a través de cámaras y de techos
suspendidos no se lleva en absoluto, y la nota 1 del apartado 3.3.4 advierte
de que ahí «puede contribuir o incluso dominar». Y la valoración ISO 717
necesita el espectro entero: de 100 Hz a 3150 Hz en tercios de octava, o de
125 Hz a 2000 Hz en octavas.

## Véase también

- [Predicción del aislamiento acústico (EN 12354)](/phonometry/es/buildings/design/insulation-prediction/):
  el modelo simplificado de número único y el catálogo de uniones del Anexo E
  sobre el que se apoya esta página.
- [Transmisión por flancos en laboratorio (ISO 10848)](/phonometry/es/buildings/insulation/flanking-lab/):
  de dónde salen el $K_{ij}$ medido y la longitud de absorción equivalente.
- [Índices globales de aislamiento (ISO 717)](/phonometry/es/buildings/insulation/insulation-ratings/):
  el motor de curva de referencia que convierte el espectro previsto en
  $R'_\mathrm{w}$ / $L'_\mathrm{n,w}$.
- [Medición del aislamiento en campo (ISO 16283)](/phonometry/es/buildings/insulation/insulation-field/):
  el resultado construido frente al que se contrasta la predicción.
- [Rigidez dinámica de materiales resilientes (EN 29052-1)](/phonometry/es/materials/resilient/dynamic-stiffness/):
  la $s'$ que hay detrás de la frecuencia de resonancia del suelo flotante.
- Referencia de la API: [`building.prediction.detailed_model`](/phonometry/es/reference/api/building/detailed-model/).
- Teoría: [Aislamiento acústico y absorción, predichos](/phonometry/es/reference/theory/rooms-buildings/#aislamiento-acústico-y-absorción-predichos-en-12354-1-2-6-bies-cremer-hopkins): el álgebra de trayectos directos y de flancos que el modelo detallado desglosa.
