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

Toda magnitud de aislamiento acústico de esta documentación termina su viaje
igual: entra un espectro por bandas y sale un número único. Sea el espectro
un $R$ de laboratorio, un $R'$ o $D_\mathrm{nT}$ de campo, un $D_{2\mathrm{m,nT}}$ de
fachada, un $L_\mathrm{n}$ o $L'_\mathrm{nT}$ de impactos o un $D_\mathrm{n,f}$ de flancos, lo que
citan las normativas es el número único ponderado de ISO 717, y dos motores
de curva de referencia los producen todos: **ISO 717-1** para las
magnitudes aéreas, donde una desviación desfavorable es una banda que cae
*por debajo* de la referencia, e **ISO 717-2** para las de impactos, con el
signo invertido porque un nivel de impactos más alto es peor. Esta guía
cubre los propios motores: la regla de desplazamiento, los términos de
adaptación espectral $C$, $C_\mathrm{tr}$ y $C_\mathrm{I}$, las variantes de rango ampliado
y con un decimal, y la ficha ISO 717. Las mediciones que producen los
espectros viven en las guías de
[campo](/phonometry/es/buildings/insulation/insulation-field/),
[laboratorio](/phonometry/es/buildings/insulation/insulation-lab/),
[intensidad](/phonometry/es/buildings/insulation/insulation-intensity/),
[método de control](/phonometry/es/buildings/insulation/insulation-survey/) y
[flancos](/phonometry/es/buildings/insulation/flanking-lab/); la predicción que consume
los índices es [EN 12354](/phonometry/es/buildings/design/insulation-prediction/).

## ¿Cómo calculo Rw a partir de datos de reducción acústica en tercios de octava con Python?

Pasa los 16 valores en tercios de octava de 100 Hz a 3150 Hz a
`building.weighted_rating(R)`. Desplaza la curva de referencia de ISO 717-1 y
devuelve el índice leído a 500 Hz, junto con los términos de adaptación
espectral $C$ y $C_\mathrm{tr}$. Para el espectro medido que se usa abajo,
`w.rating, w.c, w.ctr` imprime `30 -2 -3`: $R_\mathrm{w}\ (C\ ;\ C_\mathrm{tr}) = 30\ (-2\ ;\ -3)$. La
misma llamada valora $R'$, $D_\mathrm{n}$ y $D_\mathrm{nT}$.

## Índices de ruido aéreo (ISO 717-1)

El espectro por bandas se reduce a un número mediante el **método de la curva
de referencia** de ISO 717-1: una curva de referencia fija se desplaza en
pasos de 1 dB hacia la curva medida hasta que la suma de desviaciones
*desfavorables* (donde la medición cae por debajo de la referencia) sea lo
mayor posible pero no mayor que 32,0 dB (16 bandas de tercio de octava) o
10,0 dB (5 bandas de octava). Los dos topes son una sola regla, no dos
constantes: $32{,}0 = 2{,}0 \times 16$ y $10{,}0 = 2{,}0 \times 5$, así que lo
que el método permite en realidad es **una desviación desfavorable media de
2 dB por banda**. El índice ($R_\mathrm{w}$, $R'_\mathrm{w}$, $D_\mathrm{nT,w}$ …) es la
referencia desplazada leída a 500 Hz.

La curva de referencia en sí (ISO 717-1:2020, Tabla 3) tampoco es arbitraria.
Sube 9 dB por octava de 100 Hz a 500 Hz, después solo 4 dB en la octava
siguiente, y es plana a partir de 1250 Hz. Un motor de valoración que lleve esa
forma es deliberadamente indulgente en baja frecuencia e implacable por encima
de 1 kHz, que es la razón por la que una construcción con un valle en baja
frecuencia puede valorarse bien, y la razón por la que existe $C_\mathrm{tr}$: para
devolverle la penalización. El objeto de resultado entrega la curva en su
posición desplazada, así que la curva sin desplazar está a una resta de
distancia:

```python

from phonometry import building

R = [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]
w = building.weighted_rating(R)

# La curva se desplaza hasta que lee `rating` a 500 Hz; sin desplazar lee ahí
# 52 dB, así que el desplazamiento aplicado fue 52 - rating.
reference = np.asarray(w.shifted_reference) + (52 - w.rating)
print(w.rating, 52 - w.rating)          # 30 22   (desplazada 22 dB hacia abajo)
print(reference.astype(int).tolist())
# [33, 36, 39, 42, 45, 48, 51, 52, 53, 54, 55, 56, 56, 56, 56, 56]
```

Los **términos de adaptación espectral** $C$ (ruido rosa) y $C_\mathrm{tr}$ (tráfico
urbano) añaden la penalización en baja frecuencia de una fuente real. Los dos
salen de una única definición (apartado 4.5, Fórmulas (1) y (2)): revalorar el
espectro medido frente a un espectro de fuente normalizado y restar el índice
basado en la curva,

$$
C_j = X_{\mathrm{A},j} - X_\mathrm{w}, \qquad
X_{\mathrm{A},j} = -10\log_{10}\sum_i 10^{(L_{i,j} - X_i)/10},
$$

donde $L_{i,j}$ es el nivel del espectro de fuente $j$ en la banda $i$ (los dos
espectros están ponderados A y normalizados a 0 dB globales) y $X_i$ el
aislamiento medido en esa banda, con un decimal. Los dos términos se
diferencian **solo** en qué espectro se sustituye: el n.º 1, ruido rosa
ponderado A, representativo de las actividades domésticas (habla, música,
radio, televisión), da $C$; el n.º 2, tráfico rodado urbano ponderado A, cuya
energía se concentra en baja frecuencia, da $C_\mathrm{tr}$. De modo que el
índice más el término ($R_\mathrm{w} + C$ para un índice de laboratorio, $R'_\mathrm{w} + C$ o
$D_\mathrm{nT,w} + C$ para las magnitudes de la
[guía de campo](/phonometry/es/buildings/insulation/insulation-field/), e igual
con $C_\mathrm{tr}$) es la diferencia de nivel ponderada A que la construcción
consigue frente a esa fuente, que es lo que hace que lo que merece la pena
especificar sea la suma y no el índice a secas. Para leerlos:

* $C$ se mantiene pequeño en la mayoría de construcciones (0 a −2 dB es lo
  típico): el espectro rosa se parece a la ponderación ya implícita en la
  curva de referencia.
* $C_\mathrm{tr}$ castiga el aislamiento débil en baja frecuencia. Una doble hoja
  ligera con su resonancia masa-aire-masa cerca de 100 Hz puede llevar un
  $C_\mathrm{tr}$ de −5 a −10 dB, mientras que una pared monolítica pesada con el
  mismo $R_\mathrm{w}$ pierde mucho menos: dos construcciones con la misma
  valoración pueden diferir de forma audible frente al tráfico.
* Diseña con el descriptor que corresponda al ruido, sobre la magnitud de
  campo que el requisito valora: $R'_\mathrm{w} + C_\mathrm{tr}$ para una fachada a una
  calle con tráfico, $D_\mathrm{nT,w} + C$ (o el índice a secas, donde la
  reglamentación lo diga) entre viviendas, los dos requisitos de ejemplo de
  ISO 717-1, 5.3.

*Dos construcciones, un mismo índice. Los dos espectros salen de los propios
modelos de panel de la biblioteca, el método de Sharp para la hoja de hormigón
y el modelo masa-aire-masa de doble pared para la ligera, y los dos se valoran
en $R_\mathrm{w} = 49$ dB, así que una especificación escrita solo sobre $R_\mathrm{w}$ las trata
como intercambiables. No lo son: la doble hoja entra en el rango valorado
todavía saliendo de su resonancia masa-aire-masa de 82 Hz y, frente al tráfico,
cede 6 dB más que el muro de hormigón. $R_\mathrm{w} + C_\mathrm{tr}$ es aquello sobre lo que
realmente se especifica una fachada a una calle con tráfico.*

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

```python

# `building` es el import del bloque de la curva de referencia de arriba.

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

# Hormigón denso de 150 mm: m' = 2300 x 0.15 = 345 kg/m2, fc = 125 Hz.
heavy = np.round(building.single_panel_transmission_loss(
    freqs, 345.0, critical_frequency=125.0).transmission_loss, 1)
# Doble hoja sobre montantes metálicos: 12 kg/m2 por hoja, cámara de 90 mm.
light_result = building.double_wall_transmission_loss(freqs, mass1=12.0,
                                                      mass2=12.0, gap=0.09)
light = np.round(light_result.transmission_loss, 1)

w_heavy = building.weighted_rating(heavy)
w_light = building.weighted_rating(light)
print(w_heavy.rating, w_heavy.c, w_heavy.ctr)   # 49 -2 -7
print(w_light.rating, w_light.c, w_light.ctr)   # 49 -5 -13
print(round(light_result.resonance_frequency, 1))            # 81.5 Hz

fig, (ax_spec, ax_bar) = plt.subplots(1, 2, figsize=(13.0, 5.8))
x = np.arange(16)
ax_spec.plot(x, w_heavy.shifted_reference, "--", label="referencia desplazada")
ax_spec.plot(x, heavy, "-o", label="hormigón denso de 150 mm")
ax_spec.plot(x, light, "-s", label="doble hoja, 12 kg/m2 + 90 mm")
ax_spec.set_xticks(x, [f"{f:g}" for f in freqs], rotation=45, fontsize=8)
ax_spec.set(xlabel="Frecuencia [Hz]",
            ylabel="Índice de reducción acústica R [dB]")
ax_spec.legend()

groups = ("Rw", "Rw + C", "Rw + Ctr")
xb = np.arange(3)
ax_bar.bar(xb - 0.19, [w_heavy.rating, w_heavy.rating + w_heavy.c,
                       w_heavy.rating + w_heavy.ctr], width=0.36,
           label="hormigón")
ax_bar.bar(xb + 0.19, [w_light.rating, w_light.rating + w_light.c,
                       w_light.rating + w_light.ctr], width=0.36,
           label="doble hoja")
ax_bar.set_xticks(xb, groups)
ax_bar.set_ylabel("Número global [dB]")
ax_bar.legend()
plt.show()
```

</details>

Cada figura de un índice de esta página muestra la curva donde se detuvo. La
regla que la puso ahí es iterativa, y las dos posiciones que deciden la
respuesta son justo las que una figura terminada ya ha descartado: el último
desplazamiento cuya suma desfavorable todavía se pasaba de 32,0 dB y el
desplazamiento siguiente a la respuesta, que es válido pero desaprovecha el
margen. El clip recorre esos pasos con los dos motores sobre los dos espectros
resueltos de esta página.

*Los dos recorridos se detienen donde manda la norma: en la mayor suma
desfavorable que no pasa de 32,0 dB. El paso anterior se rechaza por pasarse
del tope, y el siguiente es válido pero lee un decibelio menos sin motivo, que
es lo que excluye el «lo mayor posible» del apartado 4.4 de
ISO 717-1:2020 y del 4.3.1 de ISO 717-2:2020.*

*La referencia desplazada se ha detenido donde el área desfavorable sombreada
suma 31,8 dB: un paso hacia atrás se pasaría del tope, con 44,1 dB, y un paso
más hacia abajo desaprovecharía el margen, con 20,6 dB.
El índice se lee después sobre esa curva a 500 Hz, no sobre la medición: el
espectro medido toca ahí 26,6 dB, y $R_\mathrm{w}$ es 30 dB.*

```python
# `building`, `R` y `w` vienen del bloque de la curva de referencia de arriba.
print(w.rating, w.c, w.ctr)                          # 30 -2 -3  ->  Rw(C;Ctr) = 30(-2;-3)
print(w.unfavourable_sum)                            # 31.8  (tope 32.0 = 2.0 x 16)

w.plot()   # R medido frente a la referencia ISO 717-1 desplazada, desviaciones sombreadas (requiere matplotlib)
```

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

```python

from phonometry import building

# Índice de un solo número desde un espectro R medido de 16 bandas (ISO 717-1 Anexo C)
R = [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]
w = building.weighted_rating(R)

# En una línea — la curva medida frente a la referencia ISO 717-1 desplazada:
w.plot(language="es")
plt.show()

# A mano, con los campos de la curva por banda que ahora lleva el resultado:
fig, ax = plt.subplots()
ax.semilogx(w.band_centers, w.measured, "o-", label="R medido")
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("Índice de reducción acústica [dB]")
ax.set_title(f"Rw = {w.rating} dB  (C={w.c:+d}; Ctr={w.ctr:+d})")
ax.legend()
plt.show()
```

</details>

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

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `values_by_band` | array 1D | dB | 16 (tercios) o 5 (octavas) | $R$, $R'$, $D_\mathrm{nT}$ … medidos por banda |
| `bands` | str o `None` | — | `'third-octave'` / `'octave'` / `None` | `None` lo infiere del número de bandas |

`weighted_rating()` devuelve un `WeightedRatingResult` (`rating`, `c`, `ctr`,
`unfavourable_sum`, todos enteros salvo la suma), más los tres campos con los
que se dibujan las figuras de esta página: `band_centers`, `measured` y
`shifted_reference`, y `quantity`, que nombra lo que se ha valorado.

## Índices de ruido de impactos (ISO 717-2)

El índice de un solo número (ISO 717-2) desplaza el mismo estilo de curva de
referencia, pero una **desviación desfavorable se produce ahora donde la
medición *supera* la referencia** (el ruido de impactos es peor cuanto más
alto), el signo opuesto a ISO 717-1. El índice ($L_\mathrm{n,w}$, $L'_\mathrm{n,w}$,
$L'_\mathrm{nT,w}$) es la referencia desplazada leída a 500 Hz; para bandas de octava se reduce además
en 5 dB. El término de adaptación espectral $C_\mathrm{I} = L_\mathrm{n,sum} - 15 - L_\mathrm{n,w}$
(Fórmulas (A.1) a (A.3) de ISO 717-2:2020)
usa la suma energética sobre 100–2500 Hz (los primeros 15 tercios, excluyendo
3150 Hz) o 125–2000 Hz (octavas).

Los $-15$ dB son un desplazamiento de normalización, no un hecho físico: se
eligen para que $C_\mathrm{I}$ salga **en torno a cero** en un forjado macizo con un
revestimiento eficaz, ligeramente positivo en un forjado de viguetas de madera
cuyos picos de baja frecuencia dominan, y hasta $-15$ dB en un forjado de
hormigón desnudo o mal revestido (A.1). Leído así, el $C_\mathrm{I} = -11$ dB del
ejemplo de más abajo dice que el espectro medido es mucho más plano y está
mucho más cargado hacia la alta frecuencia que la curva de referencia, es
decir, una losa desnuda y no un forjado con revestimiento, así que el forjado
es mejor en las bajas frecuencias que excitan las pisadas de lo que sugiere por
sí solo $L'_\mathrm{nT,w} = 79$ dB. El corolario es una trampa de diseño: un
revestimiento blando actúa donde la curva de referencia es más exigente, así
que mejora el número único más de lo que mejora lo que oye el vecino. La suma
sin ponderar sobre la que se construye $C_\mathrm{I}$ existe precisamente porque se
correlaciona mejor con el ruido de pisadas ponderado A que la valoración por
curva de referencia, y por eso los requisitos se escriben a veces sobre
$L'_\mathrm{n,w} + C_\mathrm{I}$ en lugar de sobre $L'_\mathrm{n,w}$.

Para mediciones ampliadas hasta 50 Hz,
`weighted_impact_rating_extended` devuelve además el término de rango ampliado
$C_{\mathrm{I},50\text{–}2500}$ (NOTA de A.2.1) y, con `one_decimal=True`, el índice en
pasos de 0,1 dB usado en las declaraciones de incertidumbre (reproduce los
valores impresos $L_\mathrm{n,r,0,w} = 77{,}6$ dB y $C_\mathrm{I,r,0} = -10{,}3$ dB de
A.2.2).

*La misma regla de ajuste con el signo invertido: el área sombreada es donde la
medición se eleva **por encima** de la referencia, y la curva se desplaza hacia
arriba hasta que esa área alcanza 28,0 dB frente al mismo tope de 32,0 dB. Un
forjado valorado así es peor cuanto más alto es su número.*

```python

from phonometry import building

# 16 niveles de impactos en tercios de octava (100 Hz - 3150 Hz), dB, del
# ejemplo resuelto del Anexo C de ISO 717-2; medidos con T = T0, así que ya
# son los valores estandarizados L'nT.
l_nt = 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])

# Índice de impactos ponderado + término de adaptación espectral CI (ISO 717-2)
res_imp = building.weighted_impact_rating(l_nt)
print(res_imp.rating, res_imp.ci, res_imp.unfavourable_sum)   # 79 -11 28.0  ->  L'nT,w(CI)=79(-11)

# Los datos en banda de octava llevan la reducción extra de -5 dB (apartado 4.3.2)
octave = np.array([65.3, 64.5, 58.0, 55.8, 43.0])
print(building.weighted_impact_rating(octave).rating)  # 54

res_imp.plot()   # L'nT medido frente a la referencia ISO 717-2 desplazada, exceso sombreado (requiere matplotlib)
```

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

```python

from phonometry import building

# 16 niveles de impactos estandarizados L'nT en tercios de octava, dB
# (ejemplo resuelto del Anexo C de ISO 717-2, medidos con T = T0).
l_nt = 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])
# Índice de impactos ponderado + término de adaptación espectral CI (ISO 717-2)
res_imp = building.weighted_impact_rating(l_nt)

# En una línea — L'nT medido frente a la referencia ISO 717-2 desplazada (exceso sombreado):
res_imp.plot(language="es")
plt.show()

# A mano, con la curva por banda que ahora lleva el resultado (signo opuesto: la
# desviación desfavorable está donde el nivel MEDIDO supera la referencia).
# Aquí la entrada fue l_n_t, así que la magnitud valorada es el nivel de campo L'nT,w:
fig, ax = plt.subplots()
ax.semilogx(res_imp.band_centers, res_imp.measured, "o-", label="L'nT medido")
ax.semilogx(res_imp.band_centers, res_imp.shifted_reference, "s--", label="Referencia desplazada")
ax.fill_between(res_imp.band_centers, res_imp.shifted_reference, res_imp.measured,
                where=res_imp.measured > res_imp.shifted_reference, interpolate=True,
                alpha=0.3, label="Desviaciones desfavorables")
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel("Nivel de presión acústica de impactos [dB]")
ax.set_title(f"L'nT,w = {res_imp.rating} dB  (CI={res_imp.ci:+d})")
ax.legend()
plt.show()
```

</details>

Pasar el espectro estandarizado a `weighted_impact_rating` reproduce los
valores del Anexo C de ISO 717-2 (tercios $L'_\mathrm{nT,w} = 79$, $C_\mathrm{I} = -11$;
octavas 54, $C_\mathrm{I} = 0$).

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

| Parámetro | Tipo | Unidades | Rango / valor por defecto | Notas |
| :--- | :--- | :--- | :--- | :--- |
| `values_by_band` | array 1D | dB | 16 (tercios) o 5 (octavas) | $L_\mathrm{n}$, $L'_\mathrm{n}$ o $L'_\mathrm{nT}$ medidos por banda |
| `bands` | str o `None` | — | `'third-octave'` / `'octave'` / `None` | `None` lo infiere del número de bandas |

`weighted_impact_rating()` devuelve un `ImpactRatingResult` (`rating`,
`ci` enteros, `unfavourable_sum` en dB), con los mismos tres campos de dibujo
que el resultado aéreo: `band_centers`, `measured` y `shifted_reference`.

## Rangos de frecuencia ampliados e índices con un decimal

Cuando la medición cubre más que las 16 bandas básicas de 100–3150 Hz, el
Anexo B de ISO 717-1 define términos de adaptación adicionales con el rango
como subíndice ($C_{50\text{–}3150}$, $C_{50\text{–}5000}$,
$C_{100\text{–}5000}$ y sus homólogos $C_\mathrm{tr}$), calculados con los espectros de
la Tabla B.1 sobre el rango ampliado. `weighted_rating_extended` toma los
valores por banda *con sus frecuencias centrales* y devuelve el índice básico
más todos los términos ampliados que cubra la entrada (la variante de impactos
`weighted_impact_rating_extended` añade $C_{\mathrm{I},50\text{–}2500}$). Con
`one_decimal=True` la curva de referencia se desplaza en pasos de 0,1 dB y
todas las reducciones conservan un decimal: la variante que ISO 717 prescribe
«para la expresión de la incertidumbre» y que el Anexo B de ISO 12999-1 exige
al declarar la incertidumbre de un valor único.

```python
from phonometry import building

# Índice de un solo número desde un espectro R medido de 16 bandas (ISO 717-1 Anexo C)
R = [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]

freqs = [50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500,
         630, 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000]
r_ext = [18.7, 19.2, 20.0, *R, 26.8, 29.2]     # ISO 717-1 Anexo C, Tabla C.2
ext = building.weighted_rating_extended(r_ext, freqs)
print(ext.rating, ext.c, ext.ctr, ext.c_50_5000, ext.ctr_50_5000)
# 30 -2 -3 -2 -4   ->  Rw(C;Ctr;C50-5000;Ctr,50-5000) = 30(-2;-3;-2;-4)

one_dp = building.weighted_rating_extended(r_ext, freqs, one_decimal=True)
print(one_dp.rating)   # 30.0, el índice en pasos de 0,1 dB para incertidumbres

ext.plot()   # curva del rango ampliado frente a la referencia desplazada, términos del Anexo B en el título (requiere matplotlib)
```

*El índice se sigue evaluando sobre las 16 bandas básicas (100–3150 Hz);
las bandas ampliadas solo entran en los términos de adaptación del Anexo B,
de modo que la curva de referencia desplazada se detiene en los bordes del
rango básico mientras la curva medida continúa por el rango ampliado
sombreado.*

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

```python

from phonometry import building

# Índice de un solo número desde un espectro R medido de 16 bandas (ISO 717-1 Anexo C)
R = [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]
freqs = [50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500,
         630, 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000]
r_ext = [18.7, 19.2, 20.0, *R, 26.8, 29.2]     # ISO 717-1 Anexo C, Tabla C.2
ext = building.weighted_rating_extended(r_ext, freqs)

# Una línea: la curva del rango ampliado frente a la referencia básica desplazada:
ext.plot(language="es")
plt.show()

# A mano, desde las curvas por banda que porta el resultado (la curva completa
# del rango ampliado en ext, la referencia de las bandas básicas en ext.core):
fig, ax = plt.subplots()
ax.semilogx(ext.band_centers, ext.measured, "o-", label="R medido")
ax.semilogx(ext.core.band_centers, ext.core.shifted_reference, "s--",
            label="Referencia desplazada (bandas básicas)")
ax.fill_between(ext.core.band_centers, ext.core.measured,
                ext.core.shifted_reference,
                where=ext.core.measured < ext.core.shifted_reference,
                interpolate=True, alpha=0.3, label="Desviaciones desfavorables")
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel("Índice de reducción acústica [dB]")
ax.set_title(f"Rw = {ext.rating} dB  (C50-5000={ext.c_50_5000:+g}; "
             f"Ctr,50-5000={ext.ctr_50_5000:+g})")
ax.legend()
plt.show()
```

</details>

## Informe de ISO 717 (`.report()`)

Ambos resultados de valoración generan, mediante el método `report(path)`, una
ficha en PDF de una sola página con el formato de un informe de ensayo de
laboratorio acreditado: la línea de base normativa (norma de medición más la
parte de valoración de ISO 717), un bloque de encabezado de metadatos opcional,
la tabla de tercios de octava junto a la gráfica de la curva medida frente a la
referencia desplazada (el propio `.plot()` del resultado), el número único en
un recuadro, una fila de veredicto opcional y un pie con el descargo fijo.
`WeightedRatingResult.report()` etiqueta la ficha aérea de ISO 717-1
($R_\mathrm{w}\ (C\ ;\ C_\mathrm{tr})$, desviaciones donde la referencia supera a la medida);
`ImpactRatingResult.report()` etiqueta la ficha de impactos de ISO 717-2
($L_\mathrm{n,w}(C_\mathrm{I})$, con el signo contrario). `SoundReductionResult.report()` es
una utilidad que valora el $R(f)$ predicho y escribe su ficha en una sola
llamada; ese resultado sale de los modelos de panel EN 12354 de
[Aislamiento acústico de paneles](/phonometry/es/buildings/design/panel-sound-insulation/),
así que es el único punto de entrada de aquí cuyo espectro de partida nunca se
midió.

Los metadatos del informe se pasan como una dataclase congelada `ReportMetadata`
(todos los campos opcionales; solo se representan los suministrados y los campos
numéricos deben cumplir su rango físico específico, detallado en la tabla de más
abajo). Pasar `metadata=None` genera una ficha
de predicción ligera (solo el cuerpo, el resultado y el descargo). Cuando se
define `metadata.requirement` se añade una fila de veredicto: una valoración
aérea aprueba cuando iguala o supera el requisito y una de impactos cuando lo
iguala o queda por debajo (un nivel de impactos menor es mejor). Con
`verbose=True` la tabla de dos columnas `f | valor` se cambia por las columnas
del Anexo C de ISO 717 (frecuencia, valor medido, referencia desplazada,
desviación desfavorable).

La generación necesita reportlab, mantenido fuera de las dependencias de
ejecución como el extra opcional `phonometry[report]`
(`pip install phonometry[report]`); si falta reportlab se lanza un `ImportError`
claro con el comando de instalación, y la gráfica sigue necesitando matplotlib
(`phonometry[plot]`). Solo se admite `engine="reportlab"`; cualquier otro motor
lanza `ValueError`. La ficha se genera en inglés por defecto; pasa
`language="es"` para una ficha en español (cadenas fijas traducidas y coma como
separador decimal), p. ej.
`building.weighted_rating(R).report("Rw_fiche_es.pdf", language="es")`.

```python
from phonometry import building, ReportMetadata

# Valoración aérea a partir de un espectro R de 16 bandas (ISO 717-1)
R = [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]
metadata = ReportMetadata(
    specimen="Muro de hormigón armado de 200 mm",
    client="Cliente de Ensayos Acústicos S.L.",
    area=10.0, mass_per_area=460.0,
    source_volume=53.0, receiving_volume=51.0,
    temperature=21.5, relative_humidity=45.0, pressure=101.3,
    test_room="Sala de transmisión T1",
    measurement_standard="ISO 10140-2",
    test_date="2026-07-18",
    laboratory="Laboratorio de referencia Phonometry",
    operator="José Manuel Requena Plens",
    report_id="PHN-2026-0042",
    requirement=42.0,          # añade la fila de veredicto CUMPLE/NO CUMPLE
)
building.weighted_rating(R).report(
    "Rw_ficha.pdf", metadata=metadata
)                                                           # Rw (C; Ctr)

# Valoración de impactos a partir de un espectro L'nT de 16 bandas (ISO 717-2)
l_nt = [45.0, 47.0, 48.0, 49.0, 51.0, 52.0, 53.0, 54.0,
        55.0, 56.0, 57.0, 58.0, 55.0, 52.0, 49.0, 46.0]
building.weighted_impact_rating(l_nt).report("Lnw_ficha.pdf")  # Ln,w (CI)
```

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

### Metadatos del informe (`ReportMetadata`)

Todos los campos son opcionales y solo se renderizan los que se aportan, de modo
que el mismo objeto genera una ficha acreditada completa y una ficha ligera de
predicción. Los campos numéricos se validan al construir el objeto según su
rango físico.

| Campo | Tipo | Se renderiza como |
| --- | --- | --- |
| `specimen`, `client`, `mounted_by`, `manufacturer` | `str` | Identidad de cabecera del elemento ensayado y para quién / quién lo montó |
| `area`, `mass_per_area` | `float > 0` | Superficie del elemento de ensayo $S$ (m²) y masa por unidad de superficie medida (kg/m²) |
| `source_volume`, `receiving_volume` | `float > 0` | Volúmenes de las salas (m³) |
| `temperature`, `relative_humidity` | `float` | Clima representativo único: temperatura del aire (°C, cualquier signo), humedad relativa (0–100 %) |
| `pressure` | `float > 0` | Presión (estática) ambiente durante el ensayo (kPa) |
| `source_temperature`, `source_relative_humidity`, `receiving_temperature`, `receiving_relative_humidity` | `float` | Clima por recinto cuando el recinto emisor y el receptor se informan por separado (mismos rangos que arriba) |
| `test_room`, `mounting`, `measurement_standard`, `test_date` | `str` | Instalación, condición de montaje, norma de medición (forma la línea de base normativa) y fecha de ensayo |
| `laboratory`, `operator`, `report_id`, `notes` | `str` | Pie: institución, línea de firma del operador, número de informe y observaciones libres |
| `requirement` | `float` | Valor objetivo de un solo número; añade la fila de veredicto (el aéreo cumple si es mayor o igual, el de impactos si es menor o igual) |

## Qué cubre esta guía

El índice aéreo por curva de referencia de ISO 717-1:2020 (la regla de
desplazamiento de 1 dB con los topes de desviaciones desfavorables de 32,0 dB
/ 10,0 dB, leído a 500 Hz) con los términos de adaptación espectral $C$ y
$C_\mathrm{tr}$ del Anexo A, mediante `building.weighted_rating`; el índice de
impactos de ISO 717-2:2020 con el signo de desviación opuesto, la reducción de
−5 dB en octavas y el término $C_\mathrm{I}$, mediante
`building.weighted_impact_rating`; los términos de rango ampliado del Anexo B
/ A.2.1 y las variantes con un decimal en pasos de 0,1 dB mediante
`building.weighted_rating_extended` y
`building.weighted_impact_rating_extended`; y la ficha ISO 717 con `.report()`
y el contenedor compartido `ReportMetadata`. La conformidad se ancla en los
propios ejemplos resueltos del Anexo C de las normas.

Nada en esta página mide: cada función toma un espectro por bandas ya medido
(o predicho) de las guías de
[campo](/phonometry/es/buildings/insulation/insulation-field/),
[laboratorio](/phonometry/es/buildings/insulation/insulation-lab/),
[intensidad](/phonometry/es/buildings/insulation/insulation-intensity/),
[método de control](/phonometry/es/buildings/insulation/insulation-survey/) o
[flancos](/phonometry/es/buildings/insulation/flanking-lab/). El número único
de fachada del Anexo F de ISO 16283-3 y el $D_\mathrm{n,f,w}$ de flancos reutilizan
estos motores desde sus propias guías en lugar de duplicarlos. Un miembro de
la familia ISO 717 falta a propósito: el nivel máximo de impactos ponderado A
del **Anexo D de ISO 717-2:2020**, que valora la pelota de caucho y la máquina
de neumático. No desplaza curva alguna, es una suma energética de niveles de
banda ponderados A, así que no lo produce ninguno de los dos motores de esta
página y vive con las fuentes que valora, en [Fuentes de impacto pesadas y
blandas](/phonometry/es/buildings/insulation/heavy-impact-sources/).

## Véase también

- [Medición del aislamiento en campo (ISO 16283)](/phonometry/es/buildings/insulation/insulation-field/):
  los espectros aéreos, de impacto y de fachada que estos motores valoran en
  campo.
- [Medición del aislamiento en laboratorio](/phonometry/es/buildings/insulation/insulation-lab/):
  los $R$ y $L_\mathrm{n}$ de laboratorio tras $R_\mathrm{w}$ y $L_\mathrm{n,w}$.
- [Aislamiento acústico por intensidad (ISO 15186)](/phonometry/es/buildings/insulation/insulation-intensity/):
  los índices por intensidad valorados con el mismo motor aéreo.
- [Método de control del aislamiento (ISO 10052)](/phonometry/es/buildings/insulation/insulation-survey/):
  las magnitudes del método de control y sus índices automáticos.
- [Transmisión por flancos en laboratorio (ISO 10848)](/phonometry/es/buildings/insulation/flanking-lab/):
  los descriptores de flanco $D_\mathrm{n,f,w}$ y $L_\mathrm{n,f,w}$.
- [Mejora del aislamiento a impacto de suelos (ISO 16251-1)](/phonometry/es/buildings/design/impact-improvement/):
  la mejora ponderada $\Delta L_\mathrm{w}$ construida sobre el suelo de referencia de
  ISO 717-2.
- [Predicción del aislamiento acústico (EN 12354)](/phonometry/es/buildings/design/insulation-prediction/):
  el modelo de número único que consume estos índices.
- [Teoría](/phonometry/es/reference/theory/rooms-buildings/): la derivación
  de la curva de referencia tras los índices globales ponderados.
- Referencia de la API: [`building.measurement.insulation`](/phonometry/es/reference/api/building/insulation/).

## Respuestas rápidas

### ¿Cuál es la diferencia entre los términos de adaptación espectral C y Ctr?

Ambos vuelven a valorar la misma curva medida frente a los dos espectros de
fuente del Anexo A de ISO 717-1: $C$ frente a ruido rosa ponderado A
(actividades domésticas: habla, música, radio, televisión) y $C_\mathrm{tr}$
frente a tráfico rodado urbano ponderado A, cuya energía se concentra en
baja frecuencia. $C$ suele estar entre 0 y −2 dB, mientras que una doble
hoja ligera con resonancia masa-aire-masa cerca de 100 Hz puede llevar un
$C_\mathrm{tr}$ de −5 a −10 dB.
