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

Caracterizar un absorbente o una partición es un ejercicio de laboratorio con
tres instrumentos distintos detrás. La **cámara reverberante** entrega un espectro
de coeficientes de absorción acústica que ISO 11654 condensa en un único número
valorado $\alpha_w$ con una clase por letra. El **banco de flujo** (estacionario
u oscilante) mide cuánto cuesta empujar aire a través de una muestra porosa, la
resistencia al flujo de aire que gobierna su comportamiento a baja frecuencia
(ISO 9053-1/-2). Y el **tubo de impedancia** recupera, a incidencia normal, la
impedancia superficial compleja completa, el factor de reflexión y la absorción
de una muestra pequeña, y, con cuatro micrófonos, su pérdida por transmisión
(ISO 10534-1/-2, ASTM E2611). Esta página cubre las tres.

## 1. Valoración de la absorción acústica (ISO 11654)

ISO 354 mide el coeficiente de absorción acústica $\alpha_s$ de un material en
bandas de tercio de octava en una cámara reverberante. ISO 11654:1997 convierte
ese espectro en una valoración de número único comparable entre productos.

**Coeficiente de absorción práctico (cláusula 4.1).** Los datos de tercio de
octava se agrupan primero en bandas de octava, cada una la media aritmética de
sus tres tercios:

$$
\alpha_{p,i} = \tfrac{1}{3}\big(\alpha_{i1} + \alpha_{i2} + \alpha_{i3}\big),
$$

evaluado al segundo decimal y luego redondeado en pasos de $0{,}05$ (la NOTA de la
cláusula 4.1 fija el redondeo, p. ej. $0{,}92 \to 0{,}90$); las medias redondeadas
por encima de $1{,}00$ se fijan en $1{,}00$. Las cinco bandas de valoración son 250,
500, 1000, 2000 y 4000 Hz.

**Absorción ponderada (cláusula 4.2).** Una curva de referencia fija
$\{250{:}\,0{,}80,\ 500{:}\,1{,}00,\ 1000{:}\,1{,}00,\ 2000{:}\,1{,}00,\ 4000{:}\,0{,}90\}$
se desplaza hacia abajo, hacia el $\alpha_p$ medido, en pasos de $0{,}05$ hasta que
la suma de las desviaciones **desfavorables** (tomadas solo donde la medida
queda por debajo de la curva desplazada, con magnitud
$(\text{curva} - \text{medida})$) no supera $0{,}10$. El coeficiente ponderado
$\alpha_w$ es el valor de la curva desplazada leído a 500 Hz.

**Indicadores de forma (cláusula 4.3).** Cuando un coeficiente práctico supera la
curva desplazada en $0{,}25$ o más, se añade un indicador de forma: `L` a 250 Hz,
`M` a 500 o 1000 Hz, `H` a 2000 o 4000 Hz (p. ej. `0.60(M)`).

**Clase de absorción (Tabla B.1).** Por último, $\alpha_w$ se asigna a una clase:
A (0,90–1,00), B (0,80–0,85), C (0,60–0,75), D (0,30–0,55), E (0,15–0,25) o "no
clasificado" (0,00–0,10). Como $\alpha_w$ es siempre un múltiplo de $0{,}05$, estos
rangos particionan la rejilla de forma exacta.

*El ejemplo resuelto del Anexo A.2: la curva de referencia se desplaza hacia
abajo 0,40 hasta que las desviaciones desfavorables suman 0,05 (≤ 0,10), dando
$\alpha_w = 0{,}60$; el pico de 500 Hz sobrepasa la curva desplazada en ≥ 0,25,
añadiendo el indicador `M`, de modo que la valoración es $0{,}60(\text{M})$, clase
C.*

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

```python

from phonometry import materials

# Coeficientes prácticos del Anexo A.2 de ISO 11654 a 250/500/1000/2000/4000 Hz
result = materials.weighted_absorption([0.35, 1.00, 0.65, 0.60, 0.55])
result.plot(language="es")   # curva práctica frente a la referencia desplazada
plt.show()
```

</details>

```python
from phonometry import materials

# Coeficientes prácticos del Anexo A.2 de ISO 11654 a 250/500/1000/2000/4000 Hz
alpha_p = [0.35, 1.00, 0.65, 0.60, 0.55]

result = materials.weighted_absorption(alpha_p)
print(result.rating_label)          # 0.60(M)
print(result.alpha_w)               # 0.6
print(result.absorption_class)      # C
print(round(result.unfavourable_sum, 2))  # 0.05
result.plot()   # la figura de arriba: curva práctica frente a la referencia desplazada

# Un alpha_w a secas también se asigna directamente a su clase (Tabla B.1)
print(materials.absorption_class(0.85))       # B
```

`weighted_absorption` acepta los cinco valores de $\alpha_p$ por banda de octava
(como una secuencia o un mapeo `{frecuencia: valor}`); pasa antes los quince
valores de $\alpha_s$ de tercio de octava a `practical_absorption_coefficient`
si partes de datos brutos de ISO 354. Para conservar los $\alpha_s$ de tercio de
octava en el resultado (de modo que la ficha pueda imprimir la tabla completa que
lleva todo certificado ISO 354 acreditado), valora en un solo paso con
`weighted_absorption_from_third_octave(alpha_s)`, que forma $\alpha_p$, lo valora
y retiene el $\alpha_s$ de entrada y sus frecuencias centrales
(`third_octave_alpha_s`, `third_octave_bands`). El resultado lleva la curva de
referencia desplazada y las desviaciones por banda, y su `.plot()` genera la
figura de arriba.

```python
from phonometry import materials

# Quince alpha_s de tercio de octava (200 Hz a 5000 Hz), como los da un informe ISO 354
alpha_s = [0.30, 0.35, 0.40, 1.00, 1.00, 1.00, 0.62, 0.66, 0.67,
           0.58, 0.60, 0.62, 0.53, 0.55, 0.57]
result = materials.weighted_absorption_from_third_octave(alpha_s)
print(result.rating_label)          # 0.60(M)
print(result.third_octave_alpha_s)  # el alpha_s de entrada, retenido para la ficha
```

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

`AbsorptionRatingResult.report(path)` renderiza una ficha PDF de una página con
el formato de un informe de ensayo de absorción acreditado (una medición en
cámara reverberante según ISO 354, valorada según ISO 11654): la línea de base
normativa, un bloque opcional de metadatos de cabecera, la tabla de $\alpha_p$
por banda de octava junto a la curva práctica frente a la referencia desplazada
(el propio `.plot()` del resultado), el número único $\alpha_w$ en caja con su
clase de absorción y el desplazamiento aplicado, una fila opcional de veredicto
y un pie con el descargo fijo. Cuando la valoración se construyó con
`weighted_absorption_from_third_octave`, la tabla de la izquierda pasa a ser la
tabla completa de $\alpha_s$ de tercio de octava de ISO 354 con el $\alpha_p$ de
octava en las filas correspondientes, tal como la imprimen los certificados
acreditados. Usa el mismo contenedor `ReportMetadata` y el
mismo motor de renderizado que la [ficha de aislamiento de ISO 717](/phonometry/es/guides/insulation-field/#informe-de-iso-717-report);
pasar `metadata=None` produce una ficha ligera de predicción, y un `requirement`
aportado se lee como el $\alpha_w$ mínimo para el veredicto CUMPLE/NO CUMPLE.
Con `verbose=True` la tabla cambia a las columnas de evaluación de ISO 11654
(coeficiente práctico, referencia desplazada, desviación desfavorable). El
renderizado necesita reportlab (`pip install phonometry[report]`); solo se
admite `engine="reportlab"`. 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. `result.report("alpha_w_fiche_es.pdf", language="es")`.

```python
from phonometry import materials, ReportMetadata

# Valora desde los quince alpha_s de tercio de octava para que la ficha imprima la
# tabla completa de ISO 354; materials.weighted_absorption([...]) también sirve desde alpha_p.
alpha_s = [0.30, 0.35, 0.40, 1.00, 1.00, 1.00, 0.62, 0.66, 0.67,
           0.58, 0.60, 0.62, 0.53, 0.55, 0.57]
result = materials.weighted_absorption_from_third_octave(alpha_s)
result.report(
    "ficha_alpha_w.pdf",
    metadata=ReportMetadata(
        specimen="Absorbente poroso de 50 mm sobre cámara de aire de 100 mm",
        area=10.8, mounting="Tipo A (contra pared rígida)",
        measurement_standard="ISO 354",
        temperature=21.4, relative_humidity=54.0,
        laboratory="Laboratorio de referencia Phonometry",
        requirement=0.55,          # añade la fila de veredicto CUMPLE/NO CUMPLE
    ),
)                                  # alpha_w (forma) + clase de absorción
```

La ficha de ejemplo se regenera con `make reports` y se conserva renderizada en
el repositorio; pulsa la vista previa para abrir el PDF.

### Medición ISO 354 (`measure_sound_absorption`)

La medición en cámara reverberante propiamente dicha es
`measure_sound_absorption`. Toma el tiempo de reverberación en tercios de
octava de la sala vacía ($T_1$) y de la sala con la probeta instalada ($T_2$),
el volumen de la sala $V$ y el área de la probeta $S$, y devuelve un
`SoundAbsorptionMeasurement` inmutable. Las áreas de absorción equivalente
salen de la ecuación de Sabine (ISO 354:2003 Ec. (5)/(7)),
$A = 55.3\,V/(c\,T) - 4\,V\,m$, con la velocidad del sonido de la Ec. (6),
$c = 331 + 0.6\,t$; el coeficiente de absorción acústica es
$\alpha_s = (A_2 - A_1)/S$ (Ec. (8)/(9)). El coeficiente puede superar 1,0 por
efectos de borde y difracción (apartado 3.7 NOTA 2) y nunca se recorta. La
atenuación del aire entra solo por el coeficiente por banda $m$ (por defecto 0,
la referencia sin atenuación); pasa `attenuation_from_alpha` de un valor de
ISO 9613-1 cuando haga falta.

La ISO 354 es una caracterización: produce el espectro de $\alpha_s$, no un
número único. El coeficiente ponderado $\alpha_w$ es una magnitud de la
ISO 11654; pasa el $\alpha_s$ medido a `weighted_absorption_from_third_octave`
(arriba) para obtenerlo.

```python

from phonometry import materials

freqs = np.array([100, 125, 160, 200, 250, 315, 400, 500, 630, 800,
                  1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000], float)
t_empty = np.array([9.0, 9.0, 8.8, 8.6, 8.4, 8.2, 8.0, 7.8, 7.5, 7.2,
                    6.9, 6.6, 6.2, 5.8, 5.4, 5.0, 4.6, 4.2])
t_specimen = np.array([8.4, 8.2, 7.7, 7.2, 6.5, 5.7, 4.9, 4.2, 3.6, 3.15,
                       2.85, 2.65, 2.55, 2.5, 2.55, 2.6, 2.7, 2.85])

m = materials.measure_sound_absorption(
    freqs, t_empty, t_specimen, volume=200.0, area=10.8, temperature=20.0
)
print(m.alpha_s[7])   # alpha_s a 500 Hz: 0,328...
m.plot()              # alpha_s frente a la frecuencia en tercios de octava
```

*La inversión de Sabine de los dos tiempos de caída: la probeta porosa apenas
cambia las caídas largas de baja frecuencia ($\alpha_s \to 0$), muerde más
donde su espesor se acerca a un cuarto de longitud de onda y se suaviza a alta
frecuencia, la firma típica de un absorbente poroso delgado (Cox y D'Antonio
3.ª ed., cap. 5).*

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

```python

from phonometry import materials

freqs = np.array([100, 125, 160, 200, 250, 315, 400, 500, 630, 800,
                  1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000], float)
t_empty = np.array([9.0, 9.0, 8.8, 8.6, 8.4, 8.2, 8.0, 7.8, 7.5, 7.2,
                    6.9, 6.6, 6.2, 5.8, 5.4, 5.0, 4.6, 4.2])
t_specimen = np.array([8.4, 8.2, 7.7, 7.2, 6.5, 5.7, 4.9, 4.2, 3.6, 3.15,
                       2.85, 2.65, 2.55, 2.5, 2.55, 2.6, 2.7, 2.85])
m = materials.measure_sound_absorption(
    freqs, t_empty, t_specimen, volume=200.0, area=10.8, temperature=20.0
)

# Una línea: el espectro de alpha_s sobre el eje de bandas de tercio de octava.
m.plot(language="es")
plt.show()

# A mano, desde los campos del resultado:
fig, ax = plt.subplots()
ax.plot(np.arange(freqs.size), m.alpha_s, "o-")
ax.set_xticks(np.arange(freqs.size))
ax.set_xticklabels([f"{f:g}" if f < 1000 else f"{f/1000:g}k" for f in freqs],
                   rotation=45)
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel("Coeficiente de absorción acústica alpha_s")
plt.show()
```

</details>

### Informe ISO 354 (`.report()`)

`SoundAbsorptionMeasurement.report(path)` genera una ficha PDF de una página con
el formato de un informe de ensayo de absorción acreditado en cámara
reverberante (ISO 354:2003): la línea de base normativa, una cabecera de
metadatos, la tabla de $\alpha_s$ en tercios de octava junto a la curva de
$\alpha_s$ (el propio `.plot()` del resultado), un titular de caracterización en
caja y un pie con el descargo fijo. La ISO 354 no tiene veredicto de
cumplimiento ni número único, así que la ficha no incluye ninguno. Con
`verbose=True` la tabla añade los tiempos de reverberación $T_1$/$T_2$ y las
áreas de absorción equivalente $A_1$/$A_2$.

Usa el mismo contenedor `ReportMetadata` y el mismo motor que las demás fichas.
El área de la probeta $S$, el volumen de la sala $V$, la velocidad del sonido
$c$, la temperatura y la humedad se toman del resultado de la medición (guiaron
la inversión de Sabine); los campos descriptivos de `ReportMetadata` que
aplican aquí son `client`, `manufacturer`, `specimen`, `mounting`, `test_room`,
`test_date`, `pressure`, `measurement_standard`, `laboratory`, `operator`,
`report_id` y `notes`. El campo `requirement` se ignora (la ISO 354 no tiene
veredicto). La generación necesita reportlab (`pip install phonometry[report]`);
solo se admite `engine="reportlab"`. La ficha se genera en inglés por defecto;
pasa `language="es"` para una ficha en español (cadenas fijas traducidas y coma
decimal).

```python
from phonometry import materials, ReportMetadata

m = materials.measure_sound_absorption(
    freqs, t_empty, t_specimen, volume=200.0, area=10.8,
    temperature=20.0, humidity=54.0,
)
m.report(
    "alpha_s_fiche.pdf",
    metadata=ReportMetadata(
        specimen="50 mm porous absorber over a 100 mm air gap",
        mounting="Type A (against a rigid wall)",
        measurement_standard="ISO 354",
        test_room="Reverberation room R1",
        laboratory="Phonometry Reference Laboratory",
    ),
)                                  # alpha_s en tercios de octava, 100 Hz a 5000 Hz
```

## 2. Resistencia al flujo de aire (ISO 9053-1/-2)

La resistencia al flujo de aire cuantifica con qué fuerza un material poroso se
opone a un flujo estacionario o lentamente oscilante. Ambas partes comparten las
mismas tres magnitudes y unidades (ISO 9053-1:2018, cláusula 3):

$$
R = \frac{\Delta p}{q_v}\ \left[\text{Pa·s/m}^3\right], \qquad
R_s = R\,A\ \left[\text{Pa·s/m}\right], \qquad
\sigma = \frac{R_s}{d}\ \left[\text{Pa·s/m}^2\right],
$$

con $\Delta p$ la diferencia de presión a través de la probeta, $q_v$ el flujo
volumétrico, $A$ la sección transversal y $d$ el espesor. Nótese que la
resistencia específica al flujo de aire $R_s$ está en **Pa·s/m** (no Pa·s/m²); la
resistividad al flujo de aire $\sigma$ es $R_s$ por metro de espesor.

**Método estático (ISO 9053-1:2018).** Un flujo laminar estacionario se aumenta
por escalones y la diferencia de presión se traza frente a la velocidad lineal
$u = q_v/A$. Se ajusta una regresión de al menos segundo orden **forzada a pasar
por el origen**, $\Delta p = a\,u + b\,u^2$, y $\Delta p$ y $R_s$ se leen a la
velocidad de referencia $u = 0{,}5\ \text{mm/s}$ (cláusula 7.5); la velocidad más
alta no debe superar los 15 mm/s. Como $R_s = \Delta p/u = a + b\,u$, el término
lineal $a$ es la resistencia específica al flujo de aire a velocidad nula.

*La caída de presión, ligeramente superlineal, se ajusta pasando por el origen;
la resistencia específica al flujo de aire es el ajuste leído a 0,5 mm/s.*

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

```python

from phonometry import materials

area = np.pi * 0.05**2                      # celda de 100 mm de diámetro [m^2]
u = np.array([0.5, 1, 2, 4, 8, 12]) * 1e-3  # velocidad lineal [m/s]
dp = 1.6e4 * u + 4.0e5 * u**2               # caída de presión medida [Pa]
r = materials.static_airflow_resistance(u, dp, area=area, thickness=0.05)

u_fit = np.linspace(0.0, 13e-3, 200)
dp_fit = r.linear_coefficient * u_fit + r.quadratic_coefficient * u_fit**2
fig, ax = plt.subplots()
ax.plot(u_fit * 1e3, dp_fit, label="Ajuste por el origen  dp = a u + b u^2")
ax.plot(u * 1e3, dp, "o", label="Caída de presión medida")
ax.plot(r.evaluation_velocity * 1e3, r.pressure_drop, "D",
        label="Evaluación a 0.5 mm/s")
ax.set_xlabel("Velocidad lineal del flujo u [mm/s]")
ax.set_ylabel("Caída de presión dp [Pa]")
ax.set_title(f"R_s = {r.specific_resistance:.0f} Pa·s/m")
ax.legend()
plt.show()
```

</details>

```python

from phonometry import materials

area = np.pi * 0.05**2            # celda de 100 mm de diámetro [m^2]
u = np.array([0.5, 1, 2, 4, 8, 12]) * 1e-3      # velocidad lineal [m/s]
dp = 1.6e4 * u + 4.0e5 * u**2                    # caída de presión medida [Pa]

r = materials.static_airflow_resistance(u, dp, area=area, thickness=0.05)
print(round(r.specific_resistance))   # 16200   R_s [Pa*s/m]
print(round(r.resistivity))           # 324000  sigma [Pa*s/m^2]
print(round(r.linear_coefficient))    # 16000   a = R_s cuando u -> 0
r.plot()   # la figura de arriba: dp(u) ajustada con el punto de evaluación
```

### Informe de ISO 9053-1 (`.report()`)

`StaticAirflowResult.report(path)` genera una ficha PDF de una página con el
formato de un informe de ensayo de resistencia al flujo de aire acreditado
(ISO 9053-1:2018, método estático): una línea de norma de base, un bloque de
cabecera de metadatos opcional, un cuerpo de dos paneles con una tabla de
resultados (la velocidad de evaluación, la diferencia de presión ajustada, la
resistencia al flujo de aire $R$, la resistencia específica al flujo de aire
$R_s$, la resistividad al flujo de aire $\sigma$ cuando hay espesor disponible,
y los coeficientes del ajuste por el origen $a$ y $b$) junto a la curva ajustada
$\Delta p(u)$ (el propio `.plot()` del resultado), la resistencia específica al
flujo de aire $R_s$ en un recuadro con $R$ y $\sigma$ al lado, y un pie con el
descargo de responsabilidad fijo. La ISO 9053-1 es una caracterización del
material, por lo que la ficha no lleva veredicto de conformidad.

Usa el mismo contenedor `ReportMetadata` y el mismo motor de renderizado que las
demás fichas. Los campos descriptivos que aplican aquí son `client`,
`manufacturer`, `specimen`, `thickness` (el espesor de la probeta $d$, en metros,
mostrado en milímetros), `test_room`, `test_date`, `temperature`,
`relative_humidity`, `measurement_standard`, `laboratory`, `operator`,
`report_id` y `notes`. El campo `requirement` se ignora (la ISO 9053-1 no tiene
veredicto). La ficha incrusta la curva ajustada, por lo que la generación
necesita tanto reportlab como matplotlib
(`pip install "phonometry[report,plot]"`); solo se admite `engine="reportlab"`.
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).

```python
from phonometry import materials, ReportMetadata

r = materials.static_airflow_resistance(u, dp, area=area, thickness=0.05)
r.report(
    "airflow_fiche.pdf",
    metadata=ReportMetadata(
        specimen="50 mm porous absorber (open-cell)",
        thickness=0.050,
        measurement_standard="ISO 9053-1",
        test_room="Static airflow rig, 100 mm cell",
        laboratory="Phonometry Reference Laboratory",
    ),
)                                  # R_s, R y sigma a u = 0.5 mm/s
```

**Método alterno (ISO 9053-2:2020).** Un pistón que oscila a 1–4 Hz acciona un
flujo alterno hacia una cavidad terminada por la probeta o por un tapón
hermético; la resistencia se obtiene de la diferencia de nivel de presión acústica
entre las dos terminaciones (Fórmula (2)):

$$
R = \frac{\kappa'\,P_S}{2\pi f\,V}\cdot\frac{h_t}{h_s}\cdot
    10^{(L_{p,s} - L_{p,t})/20},
$$

donde $\kappa'$ es la razón **efectiva** de calores específicos. La conducción de
calor entre el aire oscilante y las paredes de la cavidad hace que la compresión
no sea plenamente adiabática; el Anexo A normativo corrige $\kappa$ a la baja
hasta

$$
\kappa' = \frac{\kappa}{\sqrt{1 + (\kappa-1)\tfrac{S}{V}b
          + \tfrac{1}{2}\big((\kappa-1)\tfrac{S}{V}b\big)^2}},
\qquad b = \sqrt{\frac{2 c_0 l_h}{\omega}},\quad
l_h = \frac{k_a}{\rho_0 c_0 C_P},
$$

con $S$ y $V$ la superficie y el volumen de la cavidad y $b$ el espesor de la
capa límite térmica. Para la cavidad de ejemplo del Anexo A.3 esto da
$\kappa' = 1{,}370$, cerca de un 2 % por debajo del adiabático 1,4008.

```python
from phonometry import materials

# Cavidad del Anexo A.3: cilindro cerrado de 100 mm x 100 mm, pistón a 2 Hz
kp = materials.effective_kappa(cavity_surface=0.0471, cavity_volume=7.854e-4, frequency=2.0)
print(round(kp, 3))               # 1.37   razón efectiva de calores específicos

R = materials.alternating_airflow_resistance(
    level_specimen=74.0, level_termination=90.0,
    piston_stroke_specimen=14e-3, piston_stroke_termination=1.4e-3,
    frequency=2.0, cavity_volume=7.854e-4, kappa_prime=kp,
)
print(round(R))                   # 222956  resistencia al flujo de aire R [Pa*s/m^3]
```

Pasa el resultado de `effective_kappa` a `alternating_airflow_resistance` para
una cifra conforme al Anexo A; en caso contrario, su argumento `kappa_prime`
adopta por defecto el adiabático sin corregir 1,4. La llamada avisa (mediante
`AirflowResistanceWarning`) cuando la frecuencia del pistón sale de 1–4 Hz o
fallan los criterios de validez de las Fórmulas (3)/(4).

## 3. Tubo de impedancia (ISO 10534-1/-2, ASTM E2611)

El tubo de impedancia mide una muestra pequeña a **incidencia normal**. Dos
normas comparten la geometría pero difieren en método y convención de signo, así
que la biblioteca mantiene sus ayudantes separados y nunca los mezcla.

**Rango de frecuencia de trabajo (ISO 10534-2, cláusula 4).** Todo lo que
informa el tubo supone que el campo interior es una única onda plana, y la
geometría fija los dos extremos de la banda útil. Por encima del corte del
primer modo transversal el campo deja de ser plano: un tubo circular de
diámetro $d$ exige $f\,d < 0{,}58\,c_0$ (Ec. (2); $f\,d < 0{,}50\,c_0$ para un
tubo rectangular, Ec. (3)). La separación de micrófonos $s$ debe además
mantenerse lejos de la singularidad de media longitud de onda del método de la
función de transferencia, $f\,s < 0{,}45\,c_0$ (Ec. (4)). En el extremo bajo
aparece el problema opuesto: una separación mucho menor que la longitud de
onda apenas deja diferencia de fase entre micrófonos que medir, así que la
pauta de la cláusula 4.2 mantiene la separación por encima del 5 % de la
longitud de onda:

$$
\frac{c_0}{20\,s} \;<\; f \;<\;
\min\!\left(0{,}58\,\frac{c_0}{d},\ 0{,}45\,\frac{c_0}{s}\right).
$$

Ningún tubo cubre por sí solo el rango de la acústica de edificios. Un tubo de
100 mm con separación de 100 mm trabaja aproximadamente de 170 Hz a 1,5 kHz;
llegar a las bandas de 5 kHz exige un tubo pequeño (29 mm) con separación
corta, que a su vez no ve las bandas bajas. Los laboratorios emparejan por eso
un tubo grande y uno pequeño (o un tubo con dos separaciones) y empalman los
espectros; ambos deben coincidir en las bandas de solape, y una discrepancia
ahí apunta al corte o al montaje de la muestra, no a la física.

```python
from phonometry import materials

# Un tubo de 100 mm con separación de 100 mm y uno de 29 mm con 20 mm.
f_l, f_u = materials.plane_wave_frequency_range(0.100, 343.2, diameter=0.100)
print(round(f_l, 1), round(f_u, 1))     # 171.6 1544.4
f_l, f_u = materials.plane_wave_frequency_range(0.020, 343.2, diameter=0.029)
print(round(f_l, 1), round(f_u, 1))     # 858.0 6864.0
```

Esos límites se ven mejor sobre el propio equipo.
`plot_impedance_tube_geometry` dibuja un tubo a escala con su banda de onda
plana ya calculada, y un resultado medido de `two_microphone_impedance` al
que se le dio su geometría (`spacing`, `x1`, `diameter`) redibuja su propio
montaje con `result.plot_geometry()`.

*Todo lo que cuentan las desigualdades del rango de trabajo, en una vista
lateral a escala: el diámetro de 100 mm fija el extremo superior de
1991 Hz, la separación de 50 mm fija el extremo inferior de 343 Hz, y los
micrófonos quedan a $s$ = 50 mm con el más lejano a $x_1$ = 150 mm de la
cara de la probeta.*

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

```python

from phonometry import materials

materials.plot_impedance_tube_geometry(spacing=0.05, x1=0.15,
                                       diameter=0.10, language="es")
plt.show()

# Un resultado medido que retiene su geometría dibuja su propio tubo:
#   res = materials.two_microphone_impedance(
#       h12, frequency=f, spacing=0.05, x1=0.15, diameter=0.10, ...)
#   res.plot_geometry()
```

</details>

El mismo ayudante cubre tubos cuadrados y rectangulares: con `shape="square"`
o `shape="rectangular"` el factor de la Ec. (3) sustituye al circular, con
$d$ el lado mayor. La rama de cuatro micrófonos mantiene sus propios límites
en `plane_wave_frequency_range_astm`: ASTM E2611 conserva la constante
circular sin redondear ($f\,d < 0{,}586\,c$, 6.2.4.1), el mismo
$f\,d < 0{,}500\,c$ rectangular (6.2.5), una cota de separación algo más
estricta $f\,s < 0{,}40\,c$ (6.5.4) y un extremo bajo más laxo en el 1 % de
la longitud de onda (6.2.3). Pasar `diameter=` (y `shape=`) a
`two_microphone_impedance`, `wave_decomposition` o los solucionadores
`transfer_matrix_*` convierte la comprobación correspondiente en un aviso, y
para la estimación de atenuación del anexo A en tubo rectangular
`hydraulic_diameter(width, height)` proporciona el diámetro $4A/P$ que espera
`tube_attenuation_constant`.

**Método de la razón de onda estacionaria (ISO 10534-1).** Una sonda recorre la
onda estacionaria y lee la diferencia de nivel $\Delta L = L_\text{max} -
L_\text{min}$ entre un máximo de presión y el mínimo adyacente. La razón de onda
estacionaria, la magnitud de reflexión y la absorción se obtienen en forma
cerrada:

$$
s = 10^{\Delta L/20}, \qquad |r| = \frac{s-1}{s+1}, \qquad
\alpha = 1 - |r|^2.
$$

*Una diferencia de nivel pequeña significa un absorbente casi perfecto; una
diferencia de nivel de 9,54 dB da $s = 3$, $|r| = 0{,}5$ y $\alpha = 0{,}75$.*

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

```python

from phonometry import materials

level_diff = np.linspace(0.5, 40.0, 300)    # L_max - L_min [dB]
swr = materials.standing_wave_ratio_from_level(level_diff)
fig, ax = plt.subplots()
ax.plot(level_diff, materials.standing_wave_absorption(swr),
        label="Coeficiente de absorción alpha")
ax.plot(level_diff, materials.standing_wave_reflection_magnitude(swr), "--",
        label="Magnitud del factor de reflexión |r|")
ax.set_xlabel("Diferencia de nivel de onda estacionaria L_max - L_min [dB]")
ax.set_ylabel("alpha, |r|")
ax.legend()
plt.show()
```

</details>

```python
from phonometry import materials

s = float(materials.standing_wave_ratio_from_level(9.542))   # diferencia de nivel [dB] -> SWR
print(round(s, 2))                                  # 3.0
print(round(float(materials.standing_wave_absorption(s)), 2)) # 0.75
```

**Método de la función de transferencia (ISO 10534-2).** Dos micrófonos fijos
miden la función de transferencia compleja $H_{12}$; de ella se obtienen el
factor de reflexión en la cara de la muestra, la absorción y la impedancia
superficial normalizada (ecs. (17)–(19)):

$$
r = \frac{H_{12} - H_I}{H_R - H_{12}}\,e^{\,2 j k_0 x_1}, \qquad
\alpha = 1 - |r|^2, \qquad \frac{Z}{\rho c_0} = \frac{1+r}{1-r},
$$

con $H_I = e^{-j k_0 s}$, $H_R = e^{+j k_0 s}$, la separación de micrófonos $s$ y
$x_1$ la distancia de la muestra al micrófono más lejano.

```python

from phonometry import materials

f = np.array([500.0, 1000.0, 1800.0])
x1, spacing, c0 = 0.12, 0.03, 343.2
k0 = materials.tube_wavenumber(f, c0)

# Una función de transferencia H12 medida (aquí sintetizada a partir de r = 0.3 - 0.4j)
target = 0.3 - 0.4j
x2 = x1 - spacing
h12 = (np.exp(1j*k0*x2) + target*np.exp(-1j*k0*x2)) / \
      (np.exp(1j*k0*x1) + target*np.exp(-1j*k0*x1))

r = materials.reflection_factor(h12, spacing=spacing, x1=x1, wavenumber=k0)
print(np.round(materials.absorption_from_reflection(r), 3))     # [0.75 0.75 0.75]
print(np.round(materials.normalized_surface_impedance(r), 2))   # Z / rho c0
# [1.15-1.23j 1.15-1.23j 1.15-1.23j]
```

El `two_microphone_impedance` de alto nivel envuelve esta cadena y devuelve un
`ImpedanceTubeResult` con la absorción, el factor de reflexión, la impedancia
superficial y la impedancia normalizada, aplicando la comprobación del rango de
frecuencias de onda plana y la atenuación opcional del tubo; corrige antes
cualquier desajuste de micrófonos con `apply_mic_calibration`. Su `.plot()`
dibuja el espectro de absorción $\alpha(f)$ con el módulo del factor de
reflexión $|r|$ superpuesto.

*Un absorbente poroso de 50 mm medido en la banda de trabajo de un tubo de
100 mm: la absorción sube a medida que el espesor de la capa crece frente a
la longitud de onda, y $|r|$ cae como su imagen especular
($\alpha = 1 - |r|^2$).*

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

```python

from phonometry import materials

# Un absorbente poroso de 50 mm (Miki, sigma = 20 kPa s/m^2) en un tubo de
# 100 mm con separación de 100 mm (banda de trabajo ~170 Hz a 1,5 kHz): el
# modelo de capa da el factor de reflexión verdadero, del que sale la H12.
f = np.linspace(200.0, 1500.0, 260)
med = materials.miki(f, 20000.0)
layer = materials.layered_absorber(f, [materials.PorousLayer(0.05, med)])
spacing, x1, c0 = 0.10, 0.20, 343.2
k0 = materials.tube_wavenumber(f, c0)
x2 = x1 - spacing
r_true = layer.reflection
h12 = (np.exp(1j*k0*x2) + r_true*np.exp(-1j*k0*x2)) / \
      (np.exp(1j*k0*x1) + r_true*np.exp(-1j*k0*x1))
result = materials.two_microphone_impedance(
    h12, frequency=f, spacing=spacing, x1=x1, speed_of_sound=c0,
    characteristic_impedance=407.0, diameter=0.10,
)

# Una línea: alpha(f) con |r| superpuesto.
result.plot(language="es")
plt.show()

# A mano, desde los campos del resultado:
fig, ax = plt.subplots()
ax.plot(f, result.absorption, label="Absorción alpha")
ax.plot(f, np.abs(result.reflection), "--", label="Factor de reflexión |r|")
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel("Coeficiente")
ax.legend()
plt.show()
```

</details>

### Informe ISO 10534-2 (`.report()`)

`ImpedanceTubeResult.report(path)` genera una ficha PDF de una página con el
formato de un informe de ensayo en tubo de impedancia a incidencia normal
acreditado (ISO 10534-2:2001): la línea de base normativa, una cabecera de
metadatos, la tabla por frecuencia (el coeficiente de absorción $\alpha$ y las
partes real e imaginaria de la impedancia superficial normalizada
$z = Z/\rho c_0$) junto a la curva de $\alpha(f)$ (el propio `.plot()` del
resultado, en un eje de frecuencia logarítmico continuo), un titular de
caracterización en caja y un pie con el descargo fijo. La ISO 10534-2 es una
caracterización, así que la ficha no incluye veredicto de cumplimiento ni número
único; el coeficiente a incidencia normal no es comparable con el $\alpha_s$ /
$\alpha_w$ a incidencia aleatoria de la ISO 354 / ISO 11654. Con `verbose=True`
se añade la columna del módulo del factor de reflexión $|r|$.

Usa el mismo contenedor `ReportMetadata` y el mismo motor que las demás fichas.
El rango de frecuencias medido se toma del resultado; los campos descriptivos y
geométricos de `ReportMetadata` que aplican aquí son `client`, `manufacturer`,
`specimen`, `tube_diameter`, `tube_shape`, `mic_spacing`, `mounting`, `test_room`,
`test_date`, `temperature`, `pressure`, `measurement_standard`, `laboratory`,
`operator`, `report_id` y `notes` (`tube_diameter` y `mic_spacing` se dan en
metros y se imprimen en milímetros). El campo `requirement` se ignora (la
ISO 10534-2 no tiene veredicto). La generación necesita reportlab
(`pip install phonometry[report]`); solo se admite `engine="reportlab"`. La
ficha se genera en inglés por defecto; pasa `language="es"` para una ficha en
español (cadenas fijas traducidas y coma decimal).

```python
from phonometry import materials, ReportMetadata

result = materials.two_microphone_impedance(
    h12, frequency=freqs, spacing=0.05, x1=0.10,
    speed_of_sound=c0, characteristic_impedance=rho_c, diameter=0.10,
)
result.report(
    "alpha_fiche.pdf",
    metadata=ReportMetadata(
        specimen="Capa resistiva sobre cavidad de aire de 86 mm con respaldo rígido",
        tube_diameter=0.10,            # m (se imprime como 100 mm)
        mic_spacing=0.05,              # m (se imprime como 50 mm)
        measurement_standard="ISO 10534-2",
        laboratory="Phonometry Reference Laboratory",
    ),
)                  # alpha e impedancia a incidencia normal en la banda del tubo
```

**Pérdida por transmisión (ASTM E2611).** Con cuatro micrófonos (dos aguas
arriba, dos aguas abajo de la muestra) una medición de dos cargas (o de una
carga) recupera la matriz de transferencia de la muestra, cuyos elementos dan la
pérdida por transmisión a incidencia normal, la reflexión y el número de onda:

$$
\mathrm{TL} = 20\log_{10}\left|\frac{T_{11} + T_{12}/\rho c
             + \rho c\,T_{21} + T_{22}}{2}\right|.
$$

A escala tiene este aspecto. Una `TransferMatrix` recuperada por los
solucionadores de dos cargas o de una carga retiene `l1`, `s1`, `l2`, `s2` y
el espesor de la probeta, así que `tm.plot_geometry()` redibuja el tubo en
el que se midió.

*Dónde se sitúan de verdad los cuatro micrófonos del método de la matriz de
transferencia alrededor de una probeta de 50 mm en un tubo de 100 mm:
$s_1 = s_2$ = 50 mm, $l_1$ = 100 mm, $l_2$ = 200 mm, y la terminación
intercambiable que aporta la segunda carga. El rango de trabajo ASTM para
esta geometría es de 69 a 2011 Hz.*

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

```python

from phonometry import materials

materials.plot_transmission_tube_geometry(
    l1=0.10, s1=0.05, l2=0.20, s2=0.05, thickness=0.05, diameter=0.10,
    language="es")
plt.show()

# Una TransferMatrix de transfer_matrix_two_load / _one_load retiene su
# geometría, así que tm.plot_geometry() redibuja el tubo en el que se midió.
```

</details>

```python

from phonometry import materials

# Una capa de aire es una matriz de transferencia conocida; TL = 0 dB (no se pierde nada)
f = np.array([500.0, 1000.0, 2000.0])
k0 = 2*np.pi*f / 343.2
rho_c = 1.186 * 343.2
tm = materials.air_layer_transfer_matrix(thickness=0.05, wavenumber=k0,
                               characteristic_impedance=rho_c)
print(np.round(tm.transmission_loss(rho_c), 6))   # [0. 0. 0.]
```

`transfer_matrix_two_load` / `transfer_matrix_one_load` construyen la
`TransferMatrix` a partir de las funciones de transferencia de los cuatro
micrófonos `(H1, H2, H3, H4)` medidas en cada carga; sus métodos
(`transmission_loss`, `reflection_hard_backed`,
`absorption_hard_backed`, `characteristic_impedance_material`,
`material_wavenumber`) leen entonces las magnitudes de ASTM E2611, y su
`.plot()` dibuja la pérdida de transmisión con la absorción con respaldo
rígido superpuesta (una matriz construida por los solucionadores retiene
$\rho c$ y, si se aporta, el vector de frecuencias, de modo que solo una
matriz construida a mano los necesita como argumentos). La matriz no tiene por qué venir de una
medición: el
[solucionador multicapa](/phonometry/es/guides/porous-absorbers/) expone la
matriz de cadena de cualquier apilado modelado en el mismo convenio, de modo
que una probeta predicha se lee exactamente igual que una medida.

```python

from phonometry import materials

# La matriz de cadena de una capa porosa de 50 mm modelada, leída de vuelta
# por la maquinaria de ASTM E2611: TL y absorción con respaldo rígido de la
# misma probeta.
f = np.linspace(200.0, 1600.0, 300)
med = materials.miki(f, 20000.0)
layer = materials.layered_absorber(f, [materials.PorousLayer(0.05, med)])
chain = layer.transfer_matrix                       # forma (2, 2, len(f))
tm = materials.TransferMatrix(t11=chain[0, 0], t12=chain[0, 1],
                              t21=chain[1, 0], t22=chain[1, 1])
print(np.round(float(tm.transmission_loss(407.0)[-1]), 1))   # 9.7 dB a 1,6 kHz
tm.plot(f, 407.0)   # TL(f) con la absorción con respaldo rígido superpuesta
```

*Los mismos cuatro polos responden dos preguntas distintas: cuánto sonido
deja pasar la capa exenta (la pérdida de transmisión, Ec. (26)) y cuánto
absorbe la misma capa con respaldo rígido (Ec. (28)).*

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

```python

from phonometry import materials

f = np.linspace(200.0, 1600.0, 300)
med = materials.miki(f, 20000.0)
layer = materials.layered_absorber(f, [materials.PorousLayer(0.05, med)])
chain = layer.transfer_matrix                       # forma (2, 2, len(f))
tm = materials.TransferMatrix(t11=chain[0, 0], t12=chain[0, 1],
                              t21=chain[1, 0], t22=chain[1, 1])

# Una línea: TL(f) en el eje izquierdo, absorción con respaldo rígido a la derecha.
tm.plot(f, 407.0, language="es")
plt.show()

# A mano, desde los métodos de la matriz:
fig, ax = plt.subplots()
ax.plot(f, tm.transmission_loss(407.0), label="Pérdida de transmisión TL_n")
twin = ax.twinx()
twin.plot(f, tm.absorption_hard_backed(407.0), "--", color="gray",
          label="Absorción con respaldo rígido alpha")
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel("Pérdida de transmisión TL_n [dB]")
twin.set_ylabel("Absorción con respaldo rígido alpha")
plt.show()
```

</details>

**Errores de montaje.** La mayoría de los malos datos de tubo se fabrican en
el portamuestras, mucho antes del procesado de señal. Los fallos recurrentes:

- **Holguras perimetrales.** Una probeta cortada ligeramente pequeña deja una
  lámina de aire junto a la pared del tubo. El sonido se cortocircuita
  alrededor y por detrás de la muestra, y la propia holgura resuena, de modo
  que la absorción medida gana una joroba espuria de baja a media frecuencia.
  Corte con ajuste deslizante ceñido y selle el borde (una película fina de
  vaselina es el remedio clásico) sin cargar la cara frontal.
- **Compresión.** Una probeta cortada grande y embutida a la fuerza es más
  densa que el producto que debe representar: la resistividad al flujo sube,
  un esqueleto flexible se rigidiza, y la curva de absorción se desplaza y se
  aplana. El resultado es repetible y erróneo.
- **Cavidad trasera oculta.** Si la probeta no asienta a ras del respaldo
  rígido, la capa de aire involuntaria actúa como cavidad de cuarto de
  longitud de onda y desplaza el pico de absorción hacia abajo en frecuencia,
  favoreciendo al material. Las cámaras de aire traseras son montajes
  perfectamente legítimos, pero solo cuando son deliberadas, dimensionadas y
  declaradas con el resultado.
- **Cara no plana.** Una cara frontal abombada, inclinada o desgarrada
  dispersa hacia modos transversales por debajo del corte nominal y rompe la
  hipótesis de incidencia normal sobre la que descansan las ecuaciones. Corte
  con herramienta afilada; no rasgue los materiales fibrosos a medida.
- **Una probeta no es el material.** Los productos porosos son inhomogéneos a
  la escala de una muestra de tubo. Mida varios cortes y promedie; la
  dispersión entre probetas es varianza del producto que merece declararse,
  no ruido de medida que esconder.

## ¿Tubo o cámara reverberante?

El tubo y la cámara reverberante entregan ambos un número llamado "coeficiente
de absorción", y los dos se confunden de forma rutinaria. Son magnitudes
físicas distintas, medidas bajo campos sonoros distintos, y no coinciden, a
veces ni de lejos.

El tubo mide un coeficiente a **incidencia normal**: una onda plana, un
ángulo, una probeta de unos centímetros y un factor de reflexión complejo que
conserva módulo y fase. ISO 354 mide el coeficiente de **incidencia
aleatoria** $\alpha_s$: un campo difuso que golpea una muestra de 10 a 12 m²
desde todas las direcciones a la vez, recuperado del cambio del tiempo de
caída de la cámara mediante la fórmula de Sabine, un promedio de energía sin
fase alguna. Como el campo difuso encuentra más caminos hacia el interior del
absorbente que la única onda a incidencia normal (las ondas oblicuas recorren
más camino dentro de la capa), $\alpha_s$ suele salir más alto. Para una
superficie de reacción local ambos se conectan mediante el promedio angular
de Paris, que define el coeficiente de absorción estadístico

$$
\alpha_{st} = \int_0^{\pi/2} \alpha(\theta)\,\sin 2\theta\,\mathrm{d}\theta,
$$

una integral que pondera sobre todo los ángulos oblicuos; evaluarla exige el
$\alpha(\theta)$ dependiente del ángulo a partir de la impedancia superficial
medida, no solo el propio coeficiente a incidencia normal.

**Por qué los valores de ISO 354 superan 1.** Un cociente de energía absorbida
sobre incidente no puede superar la unidad y, sin embargo, los informes de
cámara reverberante con $\alpha_s = 1{,}05$ a $1{,}20$ para absorbentes
porosos gruesos son rutinarios y correctos según el método. La fórmula de
Sabine convierte el cambio del tiempo de caída en un área de absorción
equivalente $A$, y $\alpha_s = A/S$ divide por el área *geométrica* de la
muestra $S$. La difracción en los bordes de la muestra permite a la probeta
drenar energía de un campo sonoro más ancho que su huella (el efecto de
borde), de modo que el área equivalente puede superar la geométrica. Esos
valores no son errores, pero tampoco son portables: dependen del tamaño y del
perímetro de la muestra, que es exactamente la razón por la que ISO 354 fija
ambos. La valoración de ISO 11654 simplemente trunca: los coeficientes
prácticos por encima de $1{,}00$ se fijan en $1{,}00$ (sección 1). Las
entradas de predicción no reciben ese recorte silencioso en esta biblioteca:
cada
[estimador del tiempo de reverberación](/phonometry/es/guides/reverberation-prediction/)
aplica su propio dominio matemático, de modo que Sabine y Eyring aceptan los
valores de ISO 354 iguales o superiores a uno tal cual (Eyring siempre que la
absorción media quede por debajo de uno), mientras que Millington-Sette los
rechaza (su logaritmo por superficie diverge en uno) y cualquier ajuste por
debajo de uno queda en manos de quien llama. El presupuesto de área de
absorción equivalente de
[EN 12354-6](/phonometry/es/guides/enclosed-space-absorption/) también acepta
los coeficientes tal cual se suministran.

**Cuál usar.** Responden a preguntas distintas. El valor de cámara
reverberante es el que alimenta la predicción en campo difuso: las
estimaciones de reverberación de Sabine, las áreas de absorción equivalentes
de [EN 12354-6](/phonometry/es/guides/enclosed-space-absorption/) y la
valoración $\alpha_w$ con su clase, todas las cuales esperan incidencia
aleatoria sobre una muestra finita y montada (los tipos de montaje del Anexo B
de ISO 354 existen porque el montaje es parte del resultado). El valor de tubo
es la herramienta de laboratorio y desarrollo: necesita solo unos centímetros
cuadrados de material, resuelve módulo *y* fase, y su impedancia superficial
fija los parámetros de los modelos de material poroso de la tradición de
Allard y Atalla, con la resistividad al flujo de la sección 2 como primera
entrada; el modelo ajustado predice después la capa a cualquier ángulo,
espesor o respaldo. Lo que el número del tubo *no* es, es un sustituto directo
de $\alpha_s$: alimentar coeficientes a incidencia normal en un presupuesto de
Sabine o de EN 12354-6 subestima sistemáticamente la absorción instalada.

## 4. Incertidumbre de medida de la absorción (ISO 12999-2)

Un coeficiente de absorción valorado significa poco sin su incertidumbre. La
ISO 12999-2:2020 da la incertidumbre típica $u$ de las magnitudes que produce una
medida en cámara reverberante (ISO 354) y sus valoraciones (ISO 11654, EN 1793-1),
estimada a partir de ensayos interlaboratorio según ISO 5725. Es la compañera,
en absorción acústica, de la incertidumbre de aislamiento de la ISO 12999-1
([Medición del aislamiento en campo e índices](/phonometry/es/guides/insulation-field/)).

**Bandas de tercio de octava (cláusula 5).** Para el coeficiente de absorción, la
desviación típica de reproducibilidad es $\sigma_R = m\,\alpha_s + n$ (fórmula (1)),
y para el área de absorción equivalente $\sigma_R = m\,A_T + n\,S$ con
$S = 10\ \text{m}^2$ (fórmula (2)), donde $m$ y $n$ son las constantes dependientes
de la frecuencia de la Tabla 1 (63–5000 Hz). El valor de repetibilidad es
$\sigma_r = 0{,}6\,\sigma_R$ (fórmula (3)).

**Coeficiente práctico (cláusula 6).** Para el coeficiente práctico de ISO 11654,
$\sigma_R = m\,\alpha_p + n$ en bandas de octava con las constantes de la Tabla 2
(250–4000 Hz); de nuevo $\sigma_r = 0{,}6\,\sigma_R$.

**Números únicos (cláusula 7).** El coeficiente ponderado $\alpha_w$ tiene una
incertidumbre típica constante ($\sigma_R = 0{,}035$, $\sigma_r = 0{,}020$); la
valoración de número único $DL_{\alpha,\text{NRD}}$ de EN 1793-1 escala con el
valor ($\sigma_R = 0{,}10\,DL_\alpha$, $\sigma_r = 0{,}02\,DL_\alpha$).

**Notificación (cláusula 8).** La incertidumbre expandida es $U = k\,u$
(fórmula (10)) con el factor de cobertura $k$ de la Tabla 3 ($k = 2{,}0$ al 95 %,
gaussiano). El $U$ notificado se redondea a dos decimales para los coeficientes de
absorción y a un decimal para el área equivalente y $DL_{\alpha,\text{NRD}}$.

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

```python

from phonometry import materials

# Ejemplo resuelto de la Tabla 4 de ISO 12999-2: alpha_s por tercio de octava.
freqs = [63, 80, 100, 125, 160, 200, 250, 315, 400, 500,
         630, 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000]
alpha_s = [0.33, 0.35, 0.39, 0.38, 0.37, 0.36, 0.36, 0.36, 0.43, 0.49,
           0.58, 0.63, 0.68, 0.71, 0.73, 0.75, 0.77, 0.79, 0.81, 0.81]
result = materials.sound_absorption_coefficient_uncertainty(alpha_s, freqs, confidence=0.95)
result.plot(language="es")   # alpha_s con la banda +/-U (k = 2) de reproducibilidad
plt.show()
```
</details>

```python
from phonometry import materials

# Incertidumbre de reproducibilidad de alpha_s a 1000 Hz (Tabla 1: m=0,040, n=0,015).
r = materials.sound_absorption_coefficient_uncertainty([0.68], [1000], confidence=0.95)
print(round(float(r.standard_uncertainty[0]), 4))            # 0.0422 (sigma_R)
print(float(r.reported_expanded_uncertainty[0]))             # 0.08  (U, k=2)
r.plot()   # la figura de arriba: alpha_s con su banda +/-U (k = 2)

# Valoraciones de número único (ejemplos resueltos de la cláusula 7).
print(float(materials.weighted_coefficient_uncertainty(0.70).reported_expanded_uncertainty[0]))  # 0.07
print(float(materials.single_number_rating_uncertainty(8.1).reported_expanded_uncertainty[0]))   # 1.6
```

## Qué cubre esta guía

**Cubierto.** La valoración ponderada de absorción de ISO 11654:1997: el
coeficiente práctico de la cláusula 4.1, el desplazamiento de la curva de
referencia de la cláusula 4.2, los indicadores de forma de la cláusula 4.3 y
la clase de absorción de la Tabla B.1. Los construyen `weighted_absorption` y
`weighted_absorption_from_third_octave`. La inversión de Sabine de ISO
354:2003 (Ecs. (5)-(9)) en `measure_sound_absorption`. Las dos partes de ISO
9053: el método estático de la cláusula 7.5 (`static_airflow_resistance`) y
el método alterno con la relación efectiva de calores específicos del Anexo A
(`effective_kappa`, `alternating_airflow_resistance`). El trío del tubo de
impedancia: el método de la razón de onda estacionaria de ISO 10534-1
(`standing_wave_ratio_from_level` y sus acompañantes), el método de la
función de transferencia de ISO 10534-2 con su comprobación de rango de
frecuencias de la cláusula 4 (`two_microphone_impedance`,
`plane_wave_frequency_range`), y el método de matriz de transferencia de
cuatro micrófonos de ASTM E2611 (`transfer_matrix_two_load`,
`transfer_matrix_one_load`, `TransferMatrix`). Las fórmulas de incertidumbre
de medida de ISO 12999-2:2020 (cláusulas 5-8) para los coeficientes de
tercio de octava y prácticos y para las valoraciones de número único, en
`sound_absorption_coefficient_uncertainty`,
`weighted_coefficient_uncertainty` y `single_number_rating_uncertainty`.

**No cubierto.** El coeficiente de absorción estadístico (a incidencia
aleatoria) $\alpha_{st}$ del promedio angular de Paris se describe pero no se
calcula: necesita el $\alpha(\theta)$ dependiente del ángulo a partir de la
impedancia superficial, que nada aquí deriva. Dos ediciones citadas solo como
revisiones posteriores no están implementadas: ISO 10534-2:2023 (el código
sigue el método de la función de transferencia de 1998/2001) y ASTM E2611-24
(el código sigue E2611-19). ISO 10534-1:1996 está implementada como su
adopción europea BS EN ISO 10534-1:2001, no leída directamente del texto ISO
de 1996. La fórmula de incertidumbre de ISO 12999-2 para la valoración de
número único de EN 1793-1 $DL_{\alpha,\text{NRD}}$ está implementada, pero el
propio método de medida in situ de EN 1793-1 (dispositivos reductores de
ruido de tráfico rodado) no lo está.

## Véase también

- Referencia de la API: [`materials.impedance_tube`](/phonometry/es/reference/api/materials/impedance-tube/), [`materials.airflow_resistance`](/phonometry/es/reference/api/materials/airflow-resistance/) y [`materials.absorption_uncertainty`](/phonometry/es/reference/api/materials/absorption-uncertainty/).
