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

Para valorar un elemento constructivo por sí solo (un tipo de pared, un suelo
flotante, una ventana) se lleva a un laboratorio cualificado, donde la
transmisión por flancos suprimida hace que la transmisión directa sea toda la
historia. Esta página cubre la cadena de laboratorio: el índice de reducción
acústica y el nivel de impactos normalizado de ISO 10140, la alternativa por
intensidad acústica de ISO 15186, la mejora de revestimientos de suelo en maqueta
pequeña de ISO 16251-1 y la medición de la transmisión por flancos de
ISO 10848. La medición en campo y sus índices están en
[Medición del aislamiento en campo e índices](/phonometry/es/guides/insulation-field/),
y la predicción que consume estos índices de laboratorio en
[Predicción del aislamiento acústico (EN 12354)](/phonometry/es/guides/insulation-prediction/).

## Medición en laboratorio (ISO 10140)

Una [medición ISO 16283 en campo](/phonometry/es/guides/insulation-field/) da las magnitudes
con prima ($R'$, $L'_n$): el número que un edificio real alcanza, con
transmisión por flancos incluida. Para valorar un elemento por sí solo (un tipo de pared, un suelo
flotante, una ventana), se lleva a un **laboratorio** cualificado (ISO 10140),
donde la transmisión por flancos suprimida hace que la transmisión *directa* sea
toda la historia. Las fórmulas pierden sus primas: el **índice de reducción
acústica** $R$ (no $R'$) y el **nivel de impactos normalizado** $L_n$ (no $L'_n$),
con el área de absorción de la sala receptora $A = 0{,}16\ V/T$ ahora una propiedad
conocida de la instalación:

$$
R = L_1 - L_2 + 10 \log_{10}\frac{S}{A}, \qquad
L_n = L_i + 10 \log_{10}\frac{A}{A_0}, \quad A_0 = 10\ \text{m}^2.
$$

| | Campo (ISO 16283) | Laboratorio (ISO 10140) |
| :--- | :--- | :--- |
| Índice aéreo de elemento | $R'$ aparente (con flancos) | $R$ directo (flancos suprimidos) |
| Aéreo de pareja de salas | $D_{nT}$, $D_n$ (sin prima: magnitudes de sala) | — |
| Impactos | $L'_n$, $L'_{nT}$ aparentes | $L_n$ directo |
| Índice global | $R'_w$, $D_{nT,w}$, $L'_{n,w}$, $L'_{nT,w}$ | $R_w$, $L_{n,w}$ |
| Área de absorción | medida en la sala | propiedad de la instalación |

El apóstrofo es el marcador de flancos de la acústica de edificios, y viaja
con la magnitud hasta su índice global: $R_w$ califica un espectro de
laboratorio, $R'_w$ uno de campo. Las diferencias de nivel estandarizada y
normalizada $D_{nT}$ y $D_n$ no llevan prima porque describen la pareja de
salas y no un elemento, así que no hay contraparte sin flancos que marcar. En
una construcción bien ejecutada $R'_w$ queda unos pocos dB por debajo del
$R_w$ de laboratorio de la misma partición; una diferencia mucho mayor dice
que dominan los flancos, y el
[modelo EN 12354](/phonometry/es/guides/insulation-prediction/) dice qué vía
domina.

Los índices de un solo número reutilizan los mismísimos motores de ISO 717-1/2
(`weighted_rating`, `weighted_impact_rating`): un espectro $R$ se valora a $R_w$
exactamente igual que un espectro $R'$ se valoraba a $R'_w$. Antes de formar el
índice, los niveles de la sala receptora deben **corregirse por ruido de fondo**
(Cláusula 4.3): la resta energética $10 \log_{10}(10^{L_{sb}/10} - 10^{L_b/10})$
se aplica para un margen señal-fondo de 6–15 dB, una corrección fija de 1,3 dB
(el *límite de medición*) en 6 dB o por debajo, y ninguna corrección en 15 dB o
por encima.

```python

from phonometry import building

# Niveles emisor/receptor y T de la sala receptora en las 16 bandas de tercio
# de octava; S es el área libre de la abertura de ensayo, V el volumen de la sala receptora.
l1 = np.full(16, 80.0)
l2 = np.full(16, 40.0)
t2 = np.full(16, 0.5)
lab = building.lab_airborne_insulation(l1, l2, t2, area=10.0, volume=50.0)
print(round(float(lab.r[0]), 1))              # 38.0  R = L1 - L2 + 10 lg(S/A)
print(round(float(lab.absorption[0]), 1))     # 16.0  A = 0.16 V / T (m^2)
print(lab.rating.rating, lab.rating.c, lab.rating.ctr)   # 38 0 0  ->  Rw(C;Ctr)

# Impactos: el nivel de la máquina de impactos Li normalizado a A0 = 10 m^2 da Ln
li = np.array([62.1, 63.2, 63.5, 66.2, 68.5, 70.0, 71.7, 73.1,
               73.8, 73.5, 73.8, 73.3, 73.1, 73.0, 72.4, 71.2])
imp = building.lab_impact_insulation(li, t2, volume=50.0)
print(round(float(imp.l_n[0]), 1))            # 64.1  Ln = Li + 10 lg(A/A0)
print(imp.rating.rating, imp.rating.ci)       # 81 -11  ->  Ln,w(CI)

# Corrección por ruido de fondo: márgenes 6 / 1 / 20 dB -> saturado / saturado / sin cambio
corrected = building.background_correction([30.0, 33.0, 50.0], [24.0, 32.0, 30.0])
print(np.round(corrected, 1))                 # [28.7 31.7 50.0]  (saturación de 1.3 dB dos veces)

lab.rating.plot()   # R medido frente a la referencia ISO 717-1 desplazada (requiere matplotlib)
```

Un margen en 6 dB o por debajo emite un `LabInsulationWarning` y marca la banda
como el límite de medición; captúralo con `warnings.simplefilter("error",
LabInsulationWarning)`. El índice automático se forma solo cuando se suministran
exactamente 16 valores en tercio de octava o 5 en octava (`rating` es `None` en
caso contrario).

*Las dos magnitudes de laboratorio de ISO 10140 con sus índices ISO 717: el
$R$ aéreo se evalúa donde la referencia queda **por encima** de la medición,
y el $L_n$ de impactos donde la medición queda **por encima** de la
referencia (un nivel de impactos mayor es peor). `lab.plot()` e `imp.plot()`
dibujan cada panel por separado.*

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

```python

from phonometry import building

# El muro del Anexo C de ISO 717-1 en una cámara ISO 10140 (S = 10 m2,
# V = 50 m3, T = 0,8 s) y el suelo del Anexo C de ISO 717-2 bajo la máquina
# de impactos.
r = np.array([20.4, 16.3, 17.7, 22.6, 22.4, 22.7, 24.8, 26.6,
              28.0, 30.5, 31.8, 32.5, 33.4, 33.0, 31.0, 25.5])
l1 = np.full(16, 90.0)
t2 = np.full(16, 0.8)
lab = building.lab_airborne_insulation(l1, l1 - r, t2, area=10.0, volume=50.0)
li = np.array([62.1, 63.2, 63.5, 66.2, 68.5, 70.0, 71.7, 73.1,
               73.8, 73.5, 73.8, 73.3, 73.1, 73.0, 72.4, 71.2])
imp = building.lab_impact_insulation(li, t2, volume=50.0)

# Una línea cada uno: R (o Ln) frente a su referencia ISO 717 desplazada:
lab.plot(language="es")
imp.plot(language="es")
plt.show()

# A mano, ambos paneles desde los campos de los resultados:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(11, 4.5))
ax1.semilogx(lab.rating.band_centers, lab.r, "o-", label="R medido")
ax1.semilogx(lab.rating.band_centers, lab.rating.shifted_reference, "s--",
             label="referencia desplazada")
ax1.set_title(f"Rw = {lab.rating.rating} dB")
ax2.semilogx(imp.rating.band_centers, imp.l_n, "o-", label="Ln normalizado")
ax2.semilogx(imp.rating.band_centers, imp.rating.shifted_reference, "s--",
             label="referencia desplazada")
ax2.set_title(f"Ln,w = {imp.rating.rating} dB")
for ax in (ax1, ax2):
    ax.set_xlabel("Frecuencia [Hz]")
    ax.legend()
ax1.set_ylabel("Índice de reducción acústica R [dB]")
ax2.set_ylabel("Nivel de presión acústica de impactos Ln [dB]")
plt.show()
```

</details>

### Parámetros de `lab_airborne_insulation()` / `lab_impact_insulation()`

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `l1` / `l2` | array 1D o 2D | dB | uno/banda, o `(posiciones, bandas)` | Niveles emisor / receptor (ruido aéreo) |
| `li` | array 1D o 2D | dB | uno/banda, o `(posiciones, bandas)` | SPL de impactos de la máquina de impactos (impactos) |
| `t2` | array 1D | s | > 0, uno por banda | Tiempo de reverberación de la sala receptora |
| `area` | float | m² | > 0 | Área libre de la abertura de ensayo `S` (solo ruido aéreo) |
| `volume` | float | m³ | > 0 | Volumen de la sala receptora `V` |

`lab_airborne_insulation()` devuelve un `LabAirborneInsulationResult` (`r`,
`absorption`, `rating`); `lab_impact_insulation()` un
`LabImpactInsulationResult` (`l_n`, `absorption`, `rating`);
`background_correction(signal_and_background, background)` devuelve los niveles
corregidos directamente.

### Informe de ensayo en laboratorio de ISO 10140 (`.report()`)

Ambos resultados de laboratorio escriben directamente el informe de ensayo de
ISO 10140 en una página, con el formato de los informes de laboratorio
acreditados valorados según ISO 717. `LabAirborneInsulationResult.report()`
genera la ficha del índice de reducción acústica $R$ (ISO 10140-2:2010) y
`LabImpactInsulationResult.report()` la del nivel de presión acústica de
impactos normalizado $L_n$ (ISO 10140-3:2010). Cada ficha nombra la norma de
laboratorio en su línea de base, evalúa el índice global de ISO 717-1 /
ISO 717-2 (16 bandas de tercio de octava de 100 Hz a 3150 Hz, o las 5 bandas de
octava), presenta la magnitud con un decimal tanto en forma de tabla como en
forma de curva frente a la curva de referencia desplazada, encaja el índice de
laboratorio (`Rw (C; Ctr)` o `Ln,w (CI)`) e imprime la declaración de que la
evaluación se basa en resultados de medidas en laboratorio obtenidos mediante un
método de precisión. Como un laboratorio cualificado suprime la transmisión por
flancos, la magnitud declarada es la *directa* $R$ / $L_n$, no la in situ
$R'$ / $L'_n$.

`verbose=True` anexa el área de absorción acústica equivalente por bandas
$A = 0{,}16\,V/T$ (ISO 10140-4:2010) junto a la magnitud declarada, el dato de
normalización que recoge el informe de laboratorio. Los metadatos (cliente,
muestra, montaje, volúmenes de las salas, condiciones climáticas), el veredicto
frente al requisito (aéreo cumple igual o por encima, impactos igual o por
debajo), `language="es"` y el extra `phonometry[report]` se comportan igual que
en las fichas de ISO 717 e ISO 16283.

```python

from phonometry import building, ReportMetadata

# Aéreo en laboratorio: niveles emisor/receptor y T por banda de tercio de octava
l1 = np.full(16, 90.0)
r = np.array([20.4, 16.3, 17.7, 22.6, 22.4, 22.7, 24.8, 26.6,
              28.0, 30.5, 31.8, 32.5, 33.4, 33.0, 31.0, 25.5])
lab = building.lab_airborne_insulation(
    l1, l1 - r, np.full(16, 0.8), area=10.0, volume=50.0
)
lab.plot()   # R medido frente a la referencia ISO 717-1 desplazada (requiere matplotlib)
metadata = ReportMetadata(
    specimen="Muro de bloque de hormigón celular curado en autoclave de 100 mm",
    client="Cliente de ejemplo",
    area=10.0, mass_per_area=75.0,
    source_volume=53.0, receiving_volume=50.0,
    test_room="Suite de transmisión (ejemplo)",
    mounting="Montaje tipo A, perímetro recibido con mortero (ISO 10140-1)",
    measurement_standard="ISO 10140-2",
    laboratory="Laboratorio de referencia Phonometry",
    report_id="PHN-2026-0143",
    requirement=30.0,               # Rw >= 30 dB -> fila CUMPLE/NO CUMPLE
)
lab.report("Rw_lab.pdf", metadata=metadata)            # Rw (C; Ctr)
lab.report("Rw_lab_chain.pdf", metadata=metadata,
           verbose=True)                               # f | A | R

# Impactos en laboratorio: niveles de la máquina de impactos en el receptor
li = np.array([62.1, 63.2, 63.5, 66.2, 68.5, 70.0, 71.7, 73.1,
               73.8, 73.5, 73.8, 73.3, 73.1, 73.0, 72.4, 71.2])
imp = building.lab_impact_insulation(li, np.full(16, 0.8), volume=50.0)
imp.report("Lnw_lab.pdf",
           metadata=ReportMetadata(requirement=80.0))  # Ln,w (CI)
```

Ambas fichas de ejemplo se regeneran con `make reports` y se guardan en el
repositorio. Haz clic en cualquier vista previa para abrir el PDF:

## Aislamiento acústico por intensidad (ISO 15186)

El método de laboratorio de ISO 10140, más arriba, lee la potencia transmitida de forma
*indirecta*, a partir del nivel de la sala receptora y de su área de absorción,
lo que falla cuando los flancos filtran una potencia que la sala integra
igualmente. El método por **intensidad acústica** (ISO 15186) lo evita: una sonda
de intensidad barre una superficie de medición que envuelve el espécimen y mide
la potencia radiada de forma *directa*, así que solo contribuye el elemento
ensayado. Es la herramienta preferida cuando la transmisión por flancos es alta
(ISO 15186-1:2000, cláusula 1). A partir del nivel de la sala emisora $L_{p1}$ y
del nivel medio de intensidad normal $L_{In}$ sobre la superficie (área $S_m$),
para un espécimen de área $S$,

$$
R_I = L_{p1} - 6 - \left[ L_{In} + 10 \log_{10}\frac{S_m}{S} \right],
$$

donde los $6$ dB son el desfase de campo difuso entre el nivel de presión acústica
y el nivel de intensidad incidente. La misma fórmula da el índice aparente
$R'_I$ en campo (ISO 15186-2). Como el método por intensidad *subestima*
ligeramente la potencia radiada a una sala receptora real, un **índice
modificado** $R_{I,M} = R_I + K_c$ reproduce el resultado por presión de la
ISO 10140-2; el término de adaptación $K_c$ (Anexo B) es
$10 \log_{10}(1 + S_{b2}\lambda/8V_2)$ para una sala bien definida, o el
independiente de la sala $10 \log_{10}(1 + 61,4/f)$. Para elementos pequeños, la
**diferencia de niveles normalizada por elemento** sustituye $10\lg(S_m/S)$ por
$10\lg(S_m/A_0) + 10\lg N$ ($A_0 = 10\ \text{m}^2$, $N$ unidades de elemento).

```python

from phonometry import building

# Nivel de sala emisora Lp1 y nivel medio de intensidad normal LIn sobre la
# superficie de medición (Sm), para un espécimen de área S; 16 bandas 1/3 octava.
lp1 = np.full(16, 85.0)
l_in = np.full(16, 40.0)
freqs = [100, 125, 160, 200, 250, 315, 400, 500, 630, 800,
         1000, 1250, 1600, 2000, 2500, 3150]   # centros nominales 1/3 octava
kc = building.adaptation_term_kc(freqs)                  # Anexo B (B.2)
res = building.intensity_sound_reduction(lp1, l_in, measurement_area=12.0, area=10.0, kc=kc)
print(round(float(res.r_i[0]), 2))          # 38.21  RI = Lp1 - 6 - [LIn + 10 lg(Sm/S)]
print(round(float(res.r_i_modified[0]), 2)) # 40.29  RI,M = RI + Kc
print(res.rating.rating)                     # 38  ->  RI,w (motor ISO 717-1)

# Cualifica la superficie de medición: FpI = Lp - LIn debe quedar < 10 dB (< 6 dB
# si el lado receptor es absorbente); el índice residual de la sonda > FpI+10.
fpi = building.surface_pressure_intensity_indicator(np.full(16, 46.0), l_in)
print(round(float(fpi[0]), 1))               # 6.0

res.plot()   # RI medido vs curva de referencia ISO 717-1 desplazada (necesita matplotlib)
```

*El índice modificado $R_{I,M} = R_I + K_c$ eleva $R_I$ (más en las bandas
bajas, donde $K_c$ es mayor), de modo que una medición por intensidad reproduce
el resultado por presión de la ISO 10140-2. El índice automático solo se forma
con exactamente 16 valores de tercio de octava o 5 de octava
(`rating`/`rating_modified` son `None` en otro caso). Las subáreas barridas por
separado se combinan primero con `combine_subareas` (Fórmulas (11)-(12)); una
subárea cuya energía neta fluye de vuelta hacia el espécimen se introduce con
área negativa, aplicando la regla del signo menos de la Cláusula 6.4.6
mientras $S_m$ conserva la suma de áreas sin signo.*

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

```python

from phonometry import building

# Una pared ligera: SPL de la sala emisora Lp1 = 85 dB y el nivel de intensidad
# normal medido LIn sobre la superficie Sm = 12 m2, 16 bandas de tercio de octava.
freqs = [100, 125, 160, 200, 250, 315, 400, 500, 630, 800,
         1000, 1250, 1600, 2000, 2500, 3150]
l_in = np.array([57.8, 61.9, 60.5, 55.6, 55.8, 55.5, 53.4, 51.6,
                 50.2, 47.7, 46.4, 45.7, 44.8, 45.2, 47.2, 52.7])
kc = building.adaptation_term_kc(freqs)           # término de adaptación del Anexo B
res = building.intensity_sound_reduction(np.full(16, 85.0), l_in,
                                         measurement_area=12.0, area=10.0,
                                         kc=kc)

x = np.arange(len(freqs))
fig, ax = plt.subplots()
ax.fill_between(x, res.r_i, res.r_i_modified, alpha=0.2, label="Adaptación Kc")
ax.plot(x, res.r_i, "-o", label="RI (intensidad)")
ax.plot(x, res.r_i_modified, "--s", label="RI,M = RI + Kc")
ax.set_xticks(x, [str(f) for f in freqs], rotation=45)
ax.set(xlabel="Frecuencia [Hz]", ylabel="Índice de reducción acústica [dB]",
       title=f"RI,w = {res.rating.rating} dB, RI,M,w = {res.rating_modified.rating} dB")
ax.legend()
plt.show()
```

</details>

### Parámetros de `intensity_sound_reduction()` / `adaptation_term_kc()`

| Parámetro | Tipo | Unidades | Rango / def. | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `lp1` | array 1D o 2D | dB | uno/banda, o `(posiciones, bandas)` | Nivel de presión de la sala emisora |
| `l_in` | array 1D o 2D | dB | uno/banda, o `(posiciones, bandas)` | Nivel de intensidad normal sobre la superficie |
| `measurement_area` | float | m² | > 0 | Área de la superficie de medición `Sm` |
| `area` | float | m² | > 0 | Área del espécimen `S` |
| `kc` | array 1D | dB | uno por banda / `None` | Término de adaptación para el índice modificado |
| `freq` | array 1D | Hz | > 0 | Frecuencias centrales (`adaptation_term_kc`) |
| `boundary_area` / `volume` | float | m² / m³ | > 0, ambos o ninguno | Sala `Sb2` / `V2` para la Fórmula (B.1) |

`intensity_sound_reduction()` devuelve un `IntensityReductionResult` (`r_i`,
`r_i_modified`, `rating`, `rating_modified`);
`intensity_element_normalized_difference()` un
`IntensityElementNormalizedResult` (`d_i_n_e`, `rating`);
`surface_pressure_intensity_indicator()` y `combine_subareas()` devuelven arrays.

### Informe de ensayo por intensidad de ISO 15186-1 (`.report()`)

`IntensityReductionResult.report()` escribe el informe de ensayo de una página
de ISO 15186-1:2000 del índice de reducción acústica por intensidad $R_I$,
reutilizando la misma disposición acreditada de dos paneles que las fichas de
ISO 10140 e ISO 16283. Como $R_I$ es un índice de reducción acústica ordinario,
su valor único $R_{I,w}$ es el índice a ruido aéreo de ISO 717-1 evaluado sobre
el espectro por intensidad: la ficha nombra ISO 15186-1 en su línea de base,
tabula $R_I$ con un decimal junto a la curva medida frente a la referencia
desplazada, encajona `RI,w (C; Ctr)` e imprime la declaración de que la potencia
acústica transmitida se midió directamente sobre la superficie de medición. Con
`verbose=True` se anexa el índice modificado por $K_c$, $R_{I,M}$ (Fórmula (9)),
junto a $R_I$ cuando se suministró un término de adaptación.

Los campos aplicables de `ReportMetadata` describen la medición por intensidad:
`specimen` (el elemento ensayado), `area` (superficie de la muestra $S$),
`client`, `manufacturer`, `test_room`, `laboratory`, `operator`, `report_id` y
`test_date`, además de los campos de sala/clima compartidos con las demás
fichas de aislamiento. No hay un campo específico para la geometría de la
superficie de medición ni para el método de adquisición por barrido o por
puntos discretos; anótelos en `notes` y nombre la norma en
`measurement_standard` (`"ISO 15186-1"`). El veredicto frente al requisito,
`language="es"` y el extra `phonometry[report]` se comportan igual que en las
fichas hermanas.

```python

from phonometry import building, ReportMetadata

freqs = np.array([100, 125, 160, 200, 250, 315, 400, 500, 630, 800,
                  1000, 1250, 1600, 2000, 2500, 3150], dtype=float)
lp1, sm, s = 85.0, 12.0, 10.0
l_in = np.array([57.8, 61.9, 60.5, 55.6, 55.8, 55.5, 53.4, 51.6,
                 50.2, 47.7, 46.4, 45.7, 44.8, 45.2, 47.2, 52.7])
kc = building.adaptation_term_kc(freqs)                 # Anexo B, Fórmula (B.2)
res = building.intensity_sound_reduction(
    np.full(16, lp1), l_in, measurement_area=sm, area=s, kc=kc
)
metadata = ReportMetadata(
    specimen="100 mm autoclaved aerated concrete block wall",
    area=10.0, measurement_standard="ISO 15186-1",
    test_room="Transmission suite (example)",
    laboratory="Phonometry Reference Laboratory",
    report_id="PHN-2026-0150",
    requirement=30.0,                                   # RI,w >= 30 dB -> CUMPLE
)
res.report("RIw.pdf", metadata=metadata)                # RI,w (C; Ctr)
res.report("RIw_kc.pdf", metadata=metadata, verbose=True)  # f | RI | RI,M
```

La ficha de ejemplo se regenera con `make reports` y se conserva en el
repositorio. Haga clic en la vista previa para abrir el PDF:

Para un **elemento constructivo pequeño** (un aireador, una caja de enchufe, una
ventana pequeña) el método por intensidad informa en su lugar la diferencia de
niveles normalizada de elementos $D_{I,n,e}$ (Fórmula (8)), normalizada al área
de absorción de referencia $A_0 = 10\ \text{m}^2$.
`IntensityElementNormalizedResult.report()` escribe la misma ficha de una página
a través del renderizador compartido, con `DI,n,e,w (C; Ctr)` en caja evaluado
según ISO 717-1; `verbose=True` muestra la evaluación ISO 717 por banda y un
`requirement` añade un veredicto CUMPLE/NO CUMPLE (el aislamiento del elemento
cumple igualando o superando el objetivo).

```python

from phonometry import building, ReportMetadata

lp1, sm, n = 85.0, 12.0, 1                              # NPS fuente, superficie, unidades
l_in = np.array([57.9, 62.0, 60.6, 55.7, 55.9, 55.6, 53.5, 51.7,
                 50.3, 47.8, 46.5, 45.8, 44.9, 45.3, 47.3, 52.8])
res = building.intensity_element_normalized_difference(
    np.full(16, lp1), l_in, measurement_area=sm, n=n
)
metadata = ReportMetadata(
    specimen="Aireador en un muro de fábrica de 100 mm",
    measurement_standard="ISO 15186-1",
    laboratory="Phonometry Reference Laboratory",
    report_id="PHN-2026-0151",
    requirement=30.0,                                   # DI,n,e,w >= 30 dB -> CUMPLE
)
res.plot()   # DI,n,e frente a la referencia ISO 717-1 desplazada (requiere matplotlib)
res.report("DIne.pdf", metadata=metadata)               # DI,n,e,w (C; Ctr)
```

*El elemento pequeño se evalúa exactamente como un muro: $D_{I,n,e}$
alimenta el motor de ISO 717-1 y las desviaciones desfavorables (referencia
por encima de la medición) fijan $D_{I,n,e,w}$. La normalización
$10\lg(S_m/A_0)$ sustituye al término de superficie de la muestra, de modo
que el número describe el elemento con independencia del muro en el que se
monte.*

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

```python

from phonometry import building

# Un aireador en un muro de fábrica: NPS de la sala emisora de 85 dB y el
# nivel de intensidad normal sobre la superficie de medición Sm = 12 m2.
l_in = np.array([57.9, 62.0, 60.6, 55.7, 55.9, 55.6, 53.5, 51.7,
                 50.3, 47.8, 46.5, 45.8, 44.9, 45.3, 47.3, 52.8])
res = building.intensity_element_normalized_difference(
    np.full(16, 85.0), l_in, measurement_area=12.0, n=1
)

# Una línea: DI,n,e frente a la referencia ISO 717-1 desplazada:
res.plot(language="es")
plt.show()

# A mano, desde el índice que porta el resultado:
w = res.rating
fig, ax = plt.subplots()
ax.semilogx(w.band_centers, res.d_i_n_e, "o-", label="DI,n,e (elemento)")
ax.semilogx(w.band_centers, w.shifted_reference, "s--",
            label="referencia desplazada")
ax.fill_between(w.band_centers, w.measured, w.shifted_reference,
                where=w.measured < w.shifted_reference, interpolate=True,
                alpha=0.3, label="desviaciones desfavorables")
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel("Diferencia de niveles normalizada de elemento [dB]")
ax.set_title(f"DI,n,e,w = {w.rating} dB  (C={w.c:+d}; Ctr={w.ctr:+d})")
ax.legend()
plt.show()
```

</details>

## Mejora a impacto de revestimientos de suelo (ISO 16251-1)

La ISO 16251-1:2014 es un método de laboratorio para la **mejora del aislamiento
a ruido de impactos** $\Delta L$ de un revestimiento de suelo blando y de reacción
local (moqueta, PVC, linóleo). Las dos salas de ISO 10140 se sustituyen por una
pequeña placa de hormigón con apoyo elástico; una máquina de impactos normalizada
la excita y se mide el **nivel de aceleración** estructural en la cara inferior con
y sin el revestimiento. Para revestimientos de reacción local, esa diferencia de
niveles de aceleración equivale a la reducción de ruido de impactos de ISO 10140.

**Nivel de aceleración (Fórmula (1)).** $L_a = 10\lg(\langle a^2\rangle / a_0^2)$ dB,
referencia $a_0 = 10^{-6}\ \text{m/s}^2$. La **corrección de ruido de fondo
(Fórmula (2))** sigue la regla de tres ramas de ISO 10140 (sin cambio si ≥ 15 dB;
sustracción energética para 6 ≤ margen < 15 dB; el límite de 1,3 dB por debajo de
6 dB, marcado como $> \Delta L$). La mejora es la diferencia promediada por
posiciones $\Delta L = L_0 - L_1$ (Fórmulas (3)/(4)); las octavas siguen
$\Delta L_\text{oct} = -10\lg[\tfrac{1}{3}\sum 10^{-\Delta L_n/10}]$ (Fórmula (5)).

**Mejora ponderada.** $\Delta L_w$ es la reducción ponderada de ISO 717-2: la
mejora se aplica al **suelo de referencia** pesado $L_{n,r,0}$ (ISO 717-2 Tabla 4),
$L_{n,r} = L_{n,r,0} - \Delta L$, y $\Delta L_w = 78 - L_{n,r,w}$, calculada por
`weighted_impact_improvement()`, que reutiliza el motor de valoración de
ISO 717-2. Una medición según el apartado 6.3 abarca 18 bandas (100–5000 Hz,
opcionalmente ampliadas hasta 50 Hz); la valoración se forma sobre el subrango
100–3150 Hz de cualquier espectro que lo contenga. La expresión de resultados
(apartado 8 e)) incluye además el término de adaptación espectral
$C_{I,\Delta} = C_{I,r,0} - C_{I,r}$ (ISO 717-2:2020, Fórmula (A.4)), expuesto
como `ci_delta` en el resultado y de forma independiente como
`impact_improvement_adaptation_term()`.

El ejemplo siguiente es una medición real: la mejora de una moqueta textil sobre
la maqueta pesada del CSTB, digitalizada de la Figura 4 de Foret, Chéné y
Guigou-Carter, "A comparison of the reduction of transmitted impact noise by
floor coverings measured using ISO 140-8 and ISO/CD 16251-1" (Forum Acusticum
2011, Aalborg). Su mejora ponderada ISO 16251-1 publicada es
$\Delta L_w = 29$ dB, reproducida exactamente por el motor de valoración.

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

```python

from phonometry import building

freqs = [100, 125, 160, 200, 250, 315, 400, 500,
         630, 800, 1000, 1250, 1600, 2000, 2500, 3150]
bare = np.full(16, 78.0)                       # nivel de aceleración de la placa desnuda
# Una moqueta textil real medida en la maqueta del CSTB (Foret et al. 2011, Fig. 4).
covering = bare - np.array([5, 8, 10, 14, 18, 23, 30, 31,
                            39, 49, 53, 57, 60, 67, 68, 71])
res = building.impact_improvement(bare, covering, freqs)
print(res.delta_lw)   # mejora ponderada delta-Lw = 29 dB (ISO 717-2)
res.plot(language="es")
plt.show()
```

</details>

```python
from phonometry import building

# delta-Lw directo de un espectro de mejora (16 bandas de tercio de octava):
delta_l = [5, 8, 10, 14, 18, 23, 30, 31, 39, 49, 53, 57, 60, 67, 68, 71]
print(building.weighted_impact_improvement(delta_l))    # 29 dB (moqueta)

# A partir de los niveles de aceleración medidos (desnudo/cubierto) y un fondo:
freqs = [100, 125, 160, 200, 250, 315, 400, 500, 630, 800,
         1000, 1250, 1600, 2000, 2500, 3150]
bare_levels = [72, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80]
covered_levels = [b - d for b, d in zip(bare_levels, delta_l)]
bg = [40.0] * 16
res = building.impact_improvement(bare_levels, covered_levels, freqs, background=bg)
res.improvement       # delta-L por banda
res.delta_lw          # número único ponderado (valorado sobre el subrango 100-3150 Hz)
res.ci_delta          # término de adaptación espectral CI,delta (Fórmula (A.4))
res.limited           # bandas en el límite de medida de 1,3 dB (> delta-L)
res.octave_bands()    # (frec. de octava, delta-L_oct) vía Fórmula (5)
res.plot()            # el espectro de mejora delta-L(f) de arriba (requiere matplotlib)
```

### Informe de mejora a impacto de ISO 16251-1 (`.report()`)

`FloorCoveringImprovementResult.report(path)` escribe una ficha acreditada de
mejora a impacto de una página: la línea de base normativa, una cabecera de
metadatos, la tabla por bandas (frecuencia y $\Delta L$, con las bandas en el
límite de 1,3 dB precedidas por `>`) junto a la curva de mejora $\Delta L(f)$,
el número único encuadrado $\Delta L_w\ (C_{I,\Delta})$ (la expresión de
resultados de la Cláusula 8 e) de ISO 16251-1) y un pie. Pasa un
`ReportMetadata` para la cabecera; los campos aplicables son `specimen` (el
revestimiento de suelo ensayado), `client`, `manufacturer`, `mounting`,
`mass_per_area`, `test_room`, `test_date`, `temperature`, `pressure`,
`measurement_standard`, `laboratory`, `operator`, `report_id`, `notes` y
`requirement` (una mejora ponderada mayor es mejor, así que el veredicto es apto
en cuanto la iguala o la supera). El suelo de referencia desnudo es el suelo
pesado normalizado de la Tabla 4 de ISO 717-2:2020, fijado por la norma.
`verbose=True` añade la columna del suelo de referencia con revestimiento
$L_{n,r} = L_{n,r,0} - \Delta L$, la base de la derivación de $\Delta L_w$.

```python
from phonometry import building, ReportMetadata

freqs = [100, 125, 160, 200, 250, 315, 400, 500,
         630, 800, 1000, 1250, 1600, 2000, 2500, 3150]
delta_l = [5, 8, 10, 14, 18, 23, 30, 31, 39, 49, 53, 57, 60, 67, 68, 71]
bare = [78.0] * 16
res = building.impact_improvement(bare, [b - d for b, d in zip(bare, delta_l)], freqs)
res.report("dLw.pdf",
           metadata=ReportMetadata(
               specimen="Revestimiento textil (moqueta), colocada suelta",
               measurement_standard="ISO 16251-1",
               requirement=20.0),
           language="es")  # delta-Lw (CI,delta) = 29 (-13) dB
```

La ficha de ejemplo se regenera con `make reports` y se mantiene en el
repositorio. Pulsa la vista previa para abrir el PDF:

## Transmisión por flancos en laboratorio (ISO 10848)

ISO 10848:2006/2010 es el método de laboratorio que **mide** el **índice de
reducción de vibraciones** de unión $K_{ij}$ que la [predicción EN 12354](/phonometry/es/guides/insulation-prediction/)
toma como entrada, junto con los descriptores globales de flanco $D_{n,f}$
(aéreo) y $L_{n,f}$ (impacto). Es la contraparte de medición de la función
empírica `junction_vibration_reduction()` de esa predicción.

**Índice de reducción de vibraciones (Fórmula (13)).**
$K_{ij} = \overline{D}_{v,ij} + 10\lg\!\big(l_{ij} / \sqrt{a_i a_j}\big)$ dB, a
partir de la diferencia de nivel de velocidad promediada en dirección
$\overline{D}_{v,ij} = \tfrac{1}{2}(D_{v,ij} + D_{v,ji})$ (Fórmula (11), que hace
$K_{ij}$ simétrico), la longitud de unión de arista común $l_{ij}$ y las
**longitudes de absorción equivalentes**
$a_j = 2.2\pi^2 S_j /(T_{s,j} c_0)\sqrt{f_\text{ref}/f}$ (Fórmula (12),
$f_\text{ref} = 1000$ Hz). Para elementos ligeros y bien amortiguados
$a_j = S_j / l_0$ ($l_0 = 1$ m) y la Fórmula (13) se reduce a la Fórmula (14)
simplificada. El **factor de pérdidas total** asociado es $\eta = 2.2/(f T_s)$.

**Descriptores globales.** $D_{n,f} = L_1 - L_2 - 10\lg(A/A_0)$ (Fórmula (4),
aéreo) y $L_{n,f} = L_2 + 10\lg(A/A_0)$ (Fórmula (5), máquina de impactos),
$A_0 = 10\ \text{m}^2$; sus números únicos $D_{n,f,w}$ / $L_{n,f,w}$ reutilizan
los motores de ISO 717. El número único $\overline{K}_{ij}$ es la media
aritmética entre 200 y 1250 Hz en tercios de octava, o entre 125 y 1000 Hz en
bandas de octava (Anexo A).

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

```python

from phonometry import building

freqs = [100, 125, 160, 200, 250, 315, 400, 500, 630,
         800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000]
# Diferencia de nivel de velocidad promediada en dirección de una unión en T (dB):
dv = np.array([4.5, 4.8, 5.2, 5.6, 6.0, 6.5, 7.0, 7.6, 8.1, 8.7,
               9.2, 9.8, 10.3, 10.9, 11.4, 11.9, 12.3, 12.7])
res = building.vibration_reduction_index(
    dv, junction_length=4.0, area_i=12.0, area_j=10.0, frequency=freqs,
    structural_reverberation_time_i=0.35, structural_reverberation_time_j=0.40,
)
print(res.single_number)   # Kij medio entre 200 y 1250 Hz (Anexo A)
res.plot(language="es")
plt.show()
```

</details>

**Validez.** $K_{ij}$ se apoya en una simplificación de análisis estadístico de
energía: `strong_coupling_satisfied()` comprueba la desigualdad de la
Fórmula (15) y, para las uniones pesadas de la Parte 4, `modal_density()`,
`band_mode_count()` y `modal_overlap_factor()` (Fórmulas (5)/(4)/(6)) cuantifican
dónde el número de modos es demasiado bajo para que $K_{ij}$ sea fiable. Pasa el
factor de solapamiento modal por banda a
`vibration_reduction_index(..., modal_overlap=M)`: las bandas con $M < 0.25$ se
marcan en `result.bracketed` y quedan excluidas del número único
$\overline{K}_{ij}$, como exige la Cláusula 9 de la Parte 4.
Como ISO 10848 no contiene ningún ejemplo numérico resuelto, la conformidad se
ancla en identidades de forma cerrada ($K_{ij}$ simplificado, $a_j$ a
$f_\text{ref}$, $\eta$).

```python

from phonometry import building

freqs = [200, 250, 315, 400, 500, 630, 800, 1000, 1250]
lij, s_i, s_j = 4.0, 12.0, 10.0     # longitud de unión (m), áreas de elemento (m^2)
ts = np.linspace(0.30, 0.10, 9)     # tiempo de reverberación estructural Ts (s)
dv_ij = [5.6, 6.0, 6.5, 7.0, 7.6, 8.1, 8.7, 9.2, 9.8]    # elemento i excitado (dB)
dv_ji = [6.4, 6.8, 7.3, 7.8, 8.4, 8.9, 9.5, 10.0, 10.6]  # elemento j excitado (dB)

# Kij desde ambas direcciones de excitación (simétrico por el promedio direccional):
dbar = building.direction_averaged_level_difference(dv_ij, dv_ji)
res = building.vibration_reduction_index(dbar, lij, s_i, s_j, frequency=freqs,
                                structural_reverberation_time_i=ts,
                                structural_reverberation_time_j=ts)
res.k_ij           # Kij por banda (Fórmula (13))
res.single_number  # Kij medio entre 200 y 1250 Hz, o None sin ese conjunto de bandas
res.octave_bands() # Kij en octavas (su número único promedia 125-1000 Hz)

# Descriptor global aéreo de flanco y una comprobación de validez de la Parte 4:
dnf = building.normalized_flanking_level_difference(np.full(9, 75.0), np.full(9, 42.0),
                                           absorption_area=np.full(9, 12.0))
m = building.modal_overlap_factor(s_i, critical_frequency=85.0,
                         structural_reverberation_time=ts)
res_m = building.vibration_reduction_index(dbar, lij, s_i, s_j, frequency=freqs,
                                  modal_overlap=m)   # bandas con M < 0.25 acotadas
res_m.bracketed    # marcas por banda; las bandas acotadas salen del número único

# Con 16 bandas de tercio de octava (o 5 de octava), dnf.plot() dibuja Dn,f
# frente a la referencia ISO 717-1 desplazada con Dn,f,w anotado (requiere matplotlib):
```

*El descriptor global de flancos $D_{n,f}$ es una magnitud aérea, así que su
número único $D_{n,f,w}$ sale del motor de ISO 717-1 sin cambios; entra
directamente en el modelo EN 12354-1 como dato del camino de flancos de la
unión ensayada (el homólogo de impactos $L_{n,f}$ se evalúa igual según
ISO 717-2).*

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

```python

from phonometry import building

# Una unión ligera en el laboratorio: nivel de la sala emisora, nivel de la
# sala receptora por el camino de flancos y el área de absorción receptora.
l1 = np.full(16, 80.0)
dnf_target = np.array([48, 49, 50, 51, 52, 54, 55, 57,
                       58, 59, 60, 61, 62, 63, 64, 65], dtype=float)
dnf = building.normalized_flanking_level_difference(
    l1, l1 - dnf_target, absorption_area=np.full(16, 10.0)
)

# Una línea: Dn,f frente a la referencia ISO 717-1 desplazada:
dnf.plot(language="es")
plt.show()

# A mano, desde el índice que porta el resultado:
w = dnf.rating
fig, ax = plt.subplots()
ax.semilogx(w.band_centers, dnf.d_n_f, "o-", label="Dn,f (flancos)")
ax.semilogx(w.band_centers, w.shifted_reference, "s--",
            label="referencia desplazada")
ax.fill_between(w.band_centers, w.measured, w.shifted_reference,
                where=w.measured < w.shifted_reference, interpolate=True,
                alpha=0.3, label="desviaciones desfavorables")
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel("Diferencia de niveles normalizada de flancos [dB]")
ax.set_title(f"Dn,f,w = {w.rating} dB  (C={w.c:+d}; Ctr={w.ctr:+d})")
ax.legend()
plt.show()
```

</details>

### Informes de transmisión por flancos ISO 10848 (`.report()`)

Cada uno de los tres resultados genera una ficha PDF de una página.
`VibrationReductionResult.report()` escribe un informe de **caracterización de
la unión** del índice de reducción de vibraciones $K_{ij}$ (ISO 10848-1:2006):
la línea de base normativa, una cabecera de metadatos opcional, la tabla de
$K_{ij}$ por banda junto a la curva $K_{ij}(f)$ y un recuadro con el número
único (media de $K_{ij}$) sobre el intervalo de bandas del anexo A, con el
recuento de bandas promediadas y acotadas. Las bandas acotadas por solapamiento
modal insuficiente ($M < 0.25$, ISO 10848-4:2010 apartado 9) imprimen su valor
entre corchetes y se excluyen de la media; `verbose=True` añade una columna que
indica si cada banda entra en la media.

`FlankingLevelDifferenceResult.report()` y `FlankingImpactLevelResult.report()`
escriben informes de **medición** de los descriptores globales $D_{n,f}$
(aéreo) y $L_{n,f}$ (impactos, máquina de impactos), reutilizando la misma
disposición de dos paneles del aislamiento: la magnitud por banda junto a la
curva medida frente a la referencia ISO 717 desplazada y el número único
`Dn,f,w (C; Ctr)` (ISO 717-1) o `Ln,f,w (CI)` (ISO 717-2). `verbose=True` anexa
la evaluación ISO 717 por banda (el valor, la referencia desplazada y la
desviación desfavorable). Un `requirement` indicado en `ReportMetadata` añade un
veredicto ($D_{n,f,w}$ cumple igualando o superándolo, $L_{n,f,w}$ igualándolo o
por debajo), y `language="es"` genera cada ficha en español. Se necesita
reportlab (`pip install phonometry[report]`).

```python

from phonometry import building, ReportMetadata

freqs = [100, 125, 160, 200, 250, 315, 400, 500, 630,
         800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000]
dv = np.array([4.5, 4.8, 5.2, 5.6, 6.0, 6.5, 7.0, 7.6, 8.1, 8.7,
               9.2, 9.8, 10.3, 10.9, 11.4, 11.9, 12.3, 12.7])
m = np.full(18, 1.0); m[:3] = 0.1                        # acota las bandas bajas
kij = building.vibration_reduction_index(
    dv, junction_length=4.0, area_i=12.0, area_j=10.0, frequency=freqs,
    structural_reverberation_time_i=0.35, structural_reverberation_time_j=0.40,
    modal_overlap=m,
)
kij.report("Kij.pdf", metadata=ReportMetadata(specimen="Unión rígida en T"),
           language="es")

l1 = np.full(16, 80.0)
dnf = np.array([48, 49, 50, 51, 52, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65],
               dtype=float)
dres = building.normalized_flanking_level_difference(
    l1, l1 - dnf, absorption_area=np.full(16, 10.0)
)
dres.report("Dnf.pdf", metadata=ReportMetadata(requirement=55.0), language="es")

recv = np.array([58, 57, 56, 55, 54, 52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32],
                dtype=float)
lres = building.normalized_flanking_impact_level(recv, absorption_area=np.full(16, 10.0))
lres.report("Lnf.pdf", metadata=ReportMetadata(requirement=55.0), language="es")
```

Las fichas de ejemplo se regeneran con `make reports` y se mantienen en el
repositorio. Pulsa una vista previa para abrir el PDF:

## Qué cubre esta guía

**Cubierto.** La ISO 10140-2:2010 (el índice de reducción acústica de
laboratorio $R$ con la corrección de ruido de fondo del apartado 4.3) y la
ISO 10140-3:2010 (el nivel de impactos normalizado de laboratorio $L_n$),
mediante `building.lab_airborne_insulation`,
`building.lab_impact_insulation` y `building.background_correction`; el
índice de reducción acústica por intensidad $R_I$ de la ISO 15186-1:2000
(apartado 3.8), su versión modificada por $K_c$, $R_{I,M}$ (anexo B), y la
diferencia normalizada de elemento $D_{I,n,e}$ (apartado 3.9), mediante
`building.intensity_sound_reduction`, `building.adaptation_term_kc` y
`building.intensity_element_normalized_difference`; la mejora de
aislamiento a impactos de revestimientos de suelo $\Delta L$ de la
ISO 16251-1:2014 y su $\Delta L_w$ ponderado frente al suelo de referencia
de la Tabla 4 de la ISO 717-2, mediante `building.impact_improvement` y
`building.weighted_impact_improvement`; y el documento marco de la ISO
10848-1:2006 (el índice de reducción de vibraciones $K_{ij}$, Fórmula
(13), la longitud de absorción equivalente y las comprobaciones de validez
de densidad modal/solape modal del apartado 9 de la Parte 4), con los
descriptores globales $D_{n,f}$/$L_{n,f}$, mediante
`building.vibration_reduction_index`,
`building.normalized_flanking_level_difference` y
`building.normalized_flanking_impact_level`.

**No cubierto.** Los requisitos generales de instalación de ensayo y de
tipo de montaje de la ISO 10140-1 no están implementados; la guía solo los
cita como una cadena de texto en los metadatos del informe (`"Type A
mounting, mortar-bedded perimeter (ISO 10140-1)"`). La propia medición por
intensidad acústica (la sonda de barrido, la adquisición con dos
micrófonos y la calibración de desajuste de fase detrás de $L_{p1}$ y
$L_{In}$) no está implementada: ambos niveles se toman como entradas ya
medidas, y la ficha de informe de la ISO 15186-1 declara explícitamente
que no tiene campo para la geometría de la superficie de medición ni para
el método de barrido frente a puntos discretos. Las Partes 2, 3 y 4 de la
ISO 10848 difieren en los tipos de unión y de muestra a los que se
aplican; phonometry implementa solo las fórmulas de $K_{ij}$/$D_{n,f}$/
$L_{n,f}$ de la Parte 1 de forma genérica, más la comprobación de validez
de solape modal de la Parte 4, no las configuraciones de ensayo
específicas de instalación que describen las demás partes.

## Véase también

- [Medición del aislamiento en campo e índices](/phonometry/es/guides/insulation-field/):
  las mediciones aéreas, de impactos y de fachada en el edificio, sus índices
  de un solo número y su incertidumbre.
- [Predicción del aislamiento acústico (EN 12354)](/phonometry/es/guides/insulation-prediction/):
  el modelo de flancos que consume los $R$, $L_n$ y $K_{ij}$ de laboratorio.
- [Potencia acústica](/phonometry/es/guides/sound-power/): los métodos de `LW` que comparten
  la maquinaria del área de absorción de la sala receptora.
- Referencia de la API: [`building.lab_insulation`](/phonometry/es/reference/api/building/lab-insulation/), [`building.intensity_insulation`](/phonometry/es/reference/api/building/intensity-insulation/) y [`building.flanking_transmission`](/phonometry/es/reference/api/building/flanking-transmission/).
