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

A partir de la **resistividad al flujo** de un material poroso (la magnitud
que mide el [banco de flujo](/phonometry/es/materials/absorbers/airflow-resistance/)) los modelos
clásicos de fluido equivalente predicen su impedancia característica y su
número de onda complejos, y una pila de capas por **matrices de
transferencia** (mantas porosas, cámaras de aire, paneles perforados y
microperforados, membranas) predice el coeficiente de absorción de toda la
construcción antes de construir nada. Esta página cubre los tres modelos
porosos (Delany–Bazley, Miki, Johnson–Champoux–Allard), el modelo
multicapa, las capas resonantes de Maa y la integral de incidencia aleatoria
(Paris). Los tres modelos suponen que el esqueleto no se mueve nunca; la
página cubre además qué hacer cuando sí lo hace: la corrección de inercia de
esqueleto flexible por debajo de la frecuencia de desacoplo, y la capa
poroelástica de Biot completa, cuya onda del esqueleto produce una resonancia
de cuarto de onda que ningún fluido equivalente puede reproducir. Las
contrapartes de medida están en las guías del
[tubo de impedancia](/phonometry/es/materials/absorbers/impedance-tube/) y de la
[cámara reverberante](/phonometry/es/materials/absorbers/absorption-measurement/); la
valoración del espectro predicho vive en la
[sección ISO 11654](/phonometry/es/materials/absorbers/absorption-measurement/#3-valoración-ponderada-y-clase-de-absorción-iso-11654)
de esta última; y los parientes de metamaterial resonante de estas
construcciones, paneles ranurados de sonido lento que alcanzan la absorción
perfecta en el acoplamiento crítico, tienen su propia guía,
[Metaabsorbentes](/phonometry/es/materials/absorbers/metamaterial-absorbers/).

## 1. Modelos de fluido equivalente de un material poroso

Un material poroso de esqueleto rígido se comporta como un *fluido
equivalente* con una impedancia característica compleja $Z_\mathrm{c}$ y un número de
onda $k$ (convención temporal $e^{+j\omega t}$, de modo que un medio pasivo
tiene $\mathrm{Im}(k) < 0$).

**Delany–Bazley** (Mechel 2e secc. G.11; Bies 5e apéndice D, tabla D.1;
Hopkins ecs. 1.171–1.174) es la ley de potencias de un parámetro en la
variable del absorbente $X = \rho_0 f / \sigma$:

$$
\frac{Z_\mathrm{c}}{\rho_0 c_0} = 1 + C_1 X^{-C_2} - j\,C_3 X^{-C_4}, \qquad
\frac{k}{k_0} = 1 + C_5 X^{-C_6} - j\,C_7 X^{-C_8},
$$

con los coeficientes clásicos de lana de roca/fibra de vidrio
$(0{,}0571,\,0{,}754,\,0{,}087,\,0{,}732,\,0{,}0978,\,0{,}700,\,0{,}189,\,0{,}595)$
y un rango de ajuste declarado $0{,}01 < X < 1{,}0$ (porosidad cercana a
uno). La biblioteca incluye también los juegos de la tabla D.1 ajustados a
poliéster (`"garai_pompoli"`) y a espumas (`"dunn_davern"`, `"wu"`). Fuera
del rango de ajuste se emite un `PorousAbsorberWarning` y los valores
extrapolados se devuelven igualmente; el fallo clásico es una parte real
*negativa* de la impedancia de entrada de la capa a baja frecuencia (Mechel
secc. G.12).

**Miki** (1990) reajustó los mismos datos de Delany–Bazley bajo una
restricción de pasividad (positivo-real), de modo que el modelo se mantiene
físicamente bien comportado por debajo del rango de ajuste; es la elección
habitual cuando un modelo de un parámetro debe evaluarse en banda ancha. Miki
enuncia su propia ventana de validez en la variable $Y = f/\sigma$ del
artículo, $0{,}01 < Y < 1{,}0$: la ventana de Delany–Bazley dividida por
$\rho_0$, de modo que las dos difieren en un factor de alrededor de 1,2 y no
por un desliz de pluma. La biblioteca avisa sobre $X$ en `delany_bazley` y
sobre $Y$ en `miki`, cada uno frente a su propio rango publicado.

**Johnson–Champoux–Allard (JCA)** es el modelo semifenomenológico de cinco
parámetros (Cox & D'Antonio 3e ecs. 6.19–6.25): la resistividad al flujo
$\sigma$, la porosidad $\phi$, la tortuosidad $\alpha_\infty$ y las
longitudes características viscosa/térmica $\Lambda$, $\Lambda'$ dan la
densidad efectiva y el módulo de compresibilidad con los límites exactos
$j\omega\rho_\mathrm{e} \to \sigma$ en continua,
$\rho_\mathrm{e} \to (\alpha_\infty \rho_0/\phi)(1 + (1-j)\,\delta_v/\Lambda)$ a alta
frecuencia, y la transición isoterma-adiabática en $K_\mathrm{e}$.

```python

from phonometry import materials

f = np.geomspace(200.0, 4000.0, 200)
db = materials.delany_bazley(f, 20000.0)          # sigma en Pa s/m2
mk = materials.miki(f, 20000.0)
jca = materials.johnson_champoux_allard(
    f, 20000.0, porosity=0.98, tortuosity=1.0,
    viscous_length=8.7e-5, thermal_length=8.7e-5,
)
print(np.round(db.normalized_impedance[0], 3))    # (2.598-2.209j)
print(np.round(mk.normalized_impedance[0], 3))    # (2.286-1.965j)
print(np.round(jca.normalized_impedance[0], 3))   # (2.321-2.075j)

db.plot()   # componentes normalizadas de Zc y k frente a la frecuencia
```

*La presentación clásica de un modelo de fluido equivalente (Cox y D'Antonio
3.ª ed., figs. 6.19–6.20): a baja frecuencia dominan las fuerzas viscosas y
el material se ve rígido y con pérdidas (las cuatro componentes grandes); al
subir la frecuencia las componentes caen hacia los límites de aire libre
$Z_\mathrm{c} \to \rho_0 c_0$ y $k \to k_0$, de modo que una capa delgada solo
trabaja donde su espesor es una fracción apreciable de la longitud de onda
dentro del material.*

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

```python

from phonometry import materials

f = np.geomspace(100.0, 5000.0, 260)
mk = materials.miki(f, 20000.0)          # sigma = 20 kPa s/m^2

# Una línea: componentes normalizadas de Zc y k en una rejilla log-log.
mk.plot(language="es")
plt.show()

# A mano, desde los campos del resultado:
fig, ax = plt.subplots()
ax.loglog(f, mk.normalized_impedance.real, label="Re(Zc)/rho c")
ax.loglog(f, -mk.normalized_impedance.imag, "--", label="-Im(Zc)/rho c")
ax.loglog(f, mk.normalized_wavenumber.real, label="Re(k)/k0")
ax.loglog(f, -mk.normalized_wavenumber.imag, "--", label="-Im(k)/k0")
ax.set(xlabel="Frecuencia [Hz]", ylabel="Valor característico normalizado")
ax.legend()
plt.show()
```

</details>

Los tres modelos coinciden estrechamente dentro del rango de ajuste de
Delany–Bazley (Cox & D'Antonio, figs. 6.19–6.21, hacen la misma
comparación); JCA extiende la predicción con base física fuera de él. Un
`PorousMediumResult` construido con datos medidos (por ejemplo los $Z_\mathrm{c}$,
$k$ recuperados por la
[reducción de matriz de transferencia ASTM E2611](/phonometry/es/materials/absorbers/impedance-tube/))
se conecta al modelo de capas exactamente igual que uno modelado.

*Los tres modelos, y lo que cuesta salirse del rango de ajuste. Dentro de la
ventana $0{,}01 < X < 1$ las curvas son prácticamente el mismo material, que es
la razón de que los ajustes de un parámetro se sigan usando. Por debajo se
separan, y el panel derecho enseña la consecuencia en la magnitud que usa de
verdad quien diseña: para esta capa de 50 mm con respaldo rígido, Delany–Bazley
devuelve una resistencia **negativa** por debajo de 74,6 Hz, una capa pasiva que
genera energía. La restricción de pasividad de Miki la mantiene positiva, y JCA
es física en todo el rango por construcción. El aviso `PorousAbsorberWarning`
salta aquí; los valores extrapolados se devuelven igualmente, así que darse
cuenta es cosa de quien llama.*

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

```python
f_cmp = np.geomspace(20.0, 20000.0, 400)
for name, medium in (
    ("Delany-Bazley", materials.delany_bazley(f_cmp, 20000.0)),
    ("Miki", materials.miki(f_cmp, 20000.0)),
):
    zs = materials.layered_absorber(
        f_cmp, [materials.PorousLayer(0.05, medium)]
    ).normalized_impedance
    below = f_cmp[zs.real < 0.0]
    print(name, "Re(Zs) < 0 por debajo de",
          f"{below.max():.1f} Hz" if below.size else "nunca")
# Delany-Bazley Re(Zs) < 0 por debajo de 74.6 Hz
# Miki Re(Zs) < 0 nunca
```

</details>

### 1.1 De dónde salen los cinco números de JCA

Delany–Bazley y Miki necesitan un número medido. JCA necesita cinco, y quien
tenga una muestra real ha de sacar los otros cuatro de algún sitio.

**La resistividad al flujo $\sigma$** es la única que tiene una norma detrás:
ISO 9053-1 o -2, en la
[guía de resistencia al flujo de aire](/phonometry/es/materials/absorbers/airflow-resistance/).
Es además la primera que hay que volver a medir cuando un modelo y una medida
discrepan.

**La porosidad $\phi$** es la porosidad *abierta* (conectada): la relación
entre el volumen de aire y el volumen total, contando solo el aire que no queda
encerrado dentro del esqueleto, de modo que una burbuja cerrada de una espuma
pertenece al esqueleto y no a $\phi$ (Allard & Atalla 2e, secc. 2.5.1). Se mide
por métodos de desplazamiento de gas (Zwikker y Kosten 1949; Champoux et al.
1991) y, para la mayoría de los materiales fibrosos y las espumas de celda
abierta, «queda muy cerca de 1», que es la razón de que 0,95–0,99 sea una
conjetura de partida defendible y de que $\phi$ rara vez sea el parámetro que
importa.

**La tortuosidad $\alpha_\infty$** es una propiedad intrínseca de la
microgeometría: es aquello a lo que tiende la densidad efectiva, multiplicado
por $\rho_0$, cuando se anula el espesor de piel viscoso. Se puede evaluar a
partir de medidas de conductividad eléctrica sobre un esqueleto saturado con un
fluido conductor (secc. 4.9), o junto con las dos longitudes características
mediante transmisión ultrasónica (secc. 5.3.5). Vale 1 para poros rectos
normales a la superficie y crece con cualquier dispersión de la velocidad
microscópica.

**Las longitudes características $\Lambda$, $\Lambda'$** son las más difíciles
de obtener directamente: el método de referencia es la transmisión ultrasónica
en dos gases (helio y aire), y la espuma resuelta del propio libro, con
$\phi = 0{,}98$, sale con $\Lambda = 202$ µm, $\Lambda' = 367$ µm y
$\alpha_\infty = 1{,}05$ justo de esa medida (Leclaire et al. 1996, reproducida
como fig. 5.5). Fíjate en la relación: ahí $\Lambda'/\Lambda \approx 1{,}8$, ni
1 ni 3. Es una propiedad de la geometría del poro, así que trátala como algo
que hay que *encontrar*, no que suponer. Cuando no se dispone de un banco
ultrasónico, la vía práctica es un ajuste inverso contra una impedancia
superficial medida a incidencia normal, la magnitud que devuelve el
[tubo de impedancia](/phonometry/es/materials/absorbers/impedance-tube/); y cuando
ni siquiera eso está al alcance, el recurso en forma cerrada
$\Lambda = \Lambda' = \sqrt{8\alpha_\infty\eta/(\phi\sigma)}$ con
$\alpha_\infty = 1$ hace que JCA vuelva a caer sobre Delany–Bazley dentro de su
rango de ajuste.

El ajuste inverso son unas pocas líneas, y merece la pena ejecutarlo primero
contra una «medida» sintética para poder comprobar la recuperación:

```python
from scipy.optimize import least_squares

f_fit = np.geomspace(200.0, 1600.0, 40)      # la banda útil de un tubo de 100 mm

def surface_impedance(sigma, viscous):
    """Zs normalizada de una capa JCA de 50 mm con respaldo rígido."""
    medium = materials.johnson_champoux_allard(
        f_fit, sigma, porosity=0.98, tortuosity=1.05,
        viscous_length=viscous, thermal_length=2.5 * viscous,
    )
    layer = materials.layered_absorber(f_fit, [materials.PorousLayer(0.05, medium)])
    return layer.normalized_impedance

# Hace las veces del resultado de tubo: una probeta cuyos parámetros verdaderos
# conocemos.
measured = surface_impedance(22000.0, 9.0e-5)

def residual(p):                              # sigma en kPa s/m2, Lambda en um
    z = surface_impedance(p[0] * 1e3, p[1] * 1e-6)
    return np.concatenate([(z - measured).real, (z - measured).imag])

fit = least_squares(residual, x0=[10.0, 50.0],
                    bounds=([1.0, 10.0], [200.0, 500.0]))
print(round(fit.x[0] * 1e3), round(fit.x[1], 1))   # 22000 90.0 -- ambos recuperados
```

Van con él dos advertencias. Ajustar los cinco parámetros a la vez está
indeterminado frente a un solo espectro de impedancia: mantén $\phi$ en su valor
medido o cercano a la unidad, mantén $\alpha_\infty$ salvo que haya una razón
para moverlo, y deja que el ajuste encuentre $\sigma$ y las longitudes. Y cuando
una $\sigma$ ajustada sale lejos de la respuesta del banco de flujo, cree al
banco: un ajuste que ha absorbido un error de montaje dentro de los parámetros
del material predecirá mal cualquier otra construcción.

### Esqueletos flexibles: cuando el armazón se mueve (Allard & Atalla 11.3.4)

Todos los modelos anteriores suponen que el esqueleto no se mueve. Eso solo es
cierto por encima de la **frecuencia de desacoplo** de Zwikker y Kosten,

$$
F_\mathrm{d} = \frac{\sigma\,\phi^2}{2\pi\rho_1},
$$

con $\rho_1$ la densidad aparente del esqueleto (la densidad de la muestra tal
como se pesa, no la del material del que están hechas las fibras). Por debajo
de $F_\mathrm{d}$ el acoplamiento visco-inercial es lo bastante fuerte para que la onda
en los poros arrastre al esqueleto, y un esqueleto ligero (fibra de vidrio de
grado aeronáutico, fieltros, velos finos) aporta una inercia nada
despreciable. Despreciar la *rigidez* del esqueleto pero no su *masa* en la
formulación mixta presión-desplazamiento de Biot deja un fluido equivalente con
el mismo módulo de compresibilidad y una densidad efectiva corregida (Allard &
Atalla 2e, ecs. 11.53-11.55, según Panneton 2007):

$$
\tilde\rho_{\text{limp}} =
\frac{\rho_\mathrm{t}\,\tilde\rho_{\text{eq}} - \rho_0^2}
     {\rho_\mathrm{t} + \tilde\rho_{\text{eq}} - 2\rho_0},
\qquad \rho_\mathrm{t} = \rho_1 + \phi\rho_0,
$$

donde $\tilde\rho_{\text{eq}}$ es la densidad efectiva de esqueleto rígido de
cualquiera de los tres modelos anteriores y $\rho_\mathrm{t}$ es la densidad total
aparente del material. En qué se ancla esa forma, y con qué debilidad, lo
expone la nota de validación del final de este apartado. Tiene dos límites que
merece la pena conocer como física:

- **esqueleto pesado**: al crecer $\rho_1$ la corrección se anula y se
  recupera el resultado de esqueleto rígido;
- **baja frecuencia**: la densidad de esqueleto rígido diverge como
  $\sigma/(j\omega)$, mientras que la flexible converge al valor finito y real
  $\rho_\mathrm{t}$. Un esqueleto rígido prohíbe el movimiento de cuerpo rígido de la
  muestra; uno flexible lo permite, y por eso el modelo flexible es el
  adecuado para una probeta sin sujeción dentro de un tubo de impedancia.

`limp_frame` recibe un `PorousMediumResult` y devuelve otro, así que encaja
directamente en un `PorousLayer` de la pila.

*La misma capa fibrosa blanda de 50 mm con ambos modelos (Allard & Atalla,
tabla 11.2, el juego de datos de entrada de su fig. 11.2). Por encima de la
frecuencia de desacoplo las dos predicciones son indistinguibles, que es la
comprobación que el propio gráfico hace de la corrección; por debajo, la
densidad efectiva de esqueleto rígido se dispara y la flexible se asienta en
$\rho_\mathrm{t}/\rho_0 = 25,9$.*

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

```python

from phonometry import (
    PorousLayer, decoupling_frequency, johnson_champoux_allard,
    layered_absorber, limp_frame, limp_frame_applicable,
)

# Allard & Atalla, tabla 11.2: capa fibrosa blanda, 50 mm.
f = np.linspace(1.0, 2000.0, 800)
rigid = johnson_champoux_allard(
    f, 25e3, porosity=0.98, tortuosity=1.02,
    viscous_length=90e-6, thermal_length=180e-6,
)
limp = limp_frame(rigid, frame_density=30.0, porosity=0.98)

print(round(decoupling_frequency(25e3, porosity=0.98, frame_density=30.0), 1))
# 127.4
print(round(float(limp.effective_density[0].real), 1))     # 31.2 = rho_t
print(limp_frame_applicable(20e3), limp_frame_applicable(25e3))  # True False

limp.plot(language="es")   # Zc y k normalizados del medio corregido
plt.show()

# A mano, la vista de la fig. 11.2:
rho0 = rigid.air_density
fig, ax = plt.subplots()
for medium, style in ((rigid, "--"), (limp, "-")):
    ax.plot(f, medium.effective_density.real / rho0, style)
    ax.plot(f, medium.effective_density.imag / rho0, style)
ax.set(xlabel="Frecuencia [Hz]", ylabel="rho_e / rho_0", ylim=(-30, 30))
plt.show()
```

</details>

La corrección solo merece la pena donde el esqueleto es realmente flexible.
Beranek (1947) exigía $|K_c/K_\mathrm{f}| < 0,05$ entre el módulo de compresibilidad del
esqueleto en vacío y el del fluido de los poros; el estudio de interacción
esqueleto-estructura de Doutres et al. (2007) lo relajó a $0,2$, que para el
aire ($K_\mathrm{f} \approx P_0 = 101,3$ kPa) es la regla práctica de que el esqueleto
ha de ser más blando que unos 20 kPa. `limp_frame_applicable` aplica cualquiera
de los dos umbrales. Ninguno tiene en cuenta el montaje: una espuma fina y
ligera desacoplada de una estructura vibrante por una cámara de aire se
comporta como flexible muy por encima del límite, y un material adherido a una
estructura vibrante no debe tratarse como de esqueleto rígido en absoluto.

La consecuencia práctica, para la capa de 50 mm anterior con respaldo rígido,
es un coeficiente de absorción menor en los dos tercios inferiores de una
octava y algo mayor a ambos lados de 500 Hz:

```python

from phonometry import (
    PorousLayer, johnson_champoux_allard, layered_absorber, limp_frame,
)

bands = np.array([100, 125, 160, 200, 250, 315, 400, 500, 1000], dtype=float)
rigid = johnson_champoux_allard(
    bands, 25e3, porosity=0.98, tortuosity=1.02,
    viscous_length=90e-6, thermal_length=180e-6,
)
limp = limp_frame(rigid, frame_density=30.0, porosity=0.98)
for medium in (rigid, limp):
    print(layered_absorber(bands, [PorousLayer(0.05, medium)]).absorption.round(2))
# [0.07 0.11 0.17 0.24 0.32 0.43 0.54 0.64 0.88]   esqueleto rígido
# [0.04 0.08 0.15 0.24 0.36 0.48 0.61 0.71 0.91]   esqueleto flexible
```

**Nota honesta sobre la validación.** Allard & Atalla contiene exactamente una
tabla de valores calculados en todo el libro, y no es una impedancia
superficial: todas las parejas predicción-medida de los capítulos de materiales
porosos, la fig. 11.2 incluida, son figuras. Ninguna fuente publicada de las
comprobadas (el propio Allard & Atalla, Cox & D'Antonio, Mechel y la
bibliografía de Biot y de los ensayos interlaboratorio) tabula tampoco esta
magnitud. El anclaje es por tanto la propia ec. 11.55 impresa, transcrita
término a término frente a la página. Los dos límites exactos que el libro
enuncia en prosa (esqueleto pesado y $\omega \to 0$) también se comprueban,
pero valen menos de lo que parece: una variante de la ecuación con el signo
cambiado satisface ambos, y reproduce además la caída como $1/\rho_1$ del
residuo de esqueleto pesado, así que los límites no distinguen la forma impresa
de esa variante. La frecuencia de desacoplo evaluada sobre la lana de vidrio
completamente especificada de su tabla 6.1, donde la aritmética pura da
43,27 Hz, es independiente de todo esto.

### Esqueletos elásticos: la capa de Biot completa (Allard & Atalla 6 y 11)

El modelo flexible tira la rigidez del esqueleto a la basura. Consérvala y la
capa porosa deja de ser un fluido: la teoría de Biot trata el armazón como un
sólido elástico acoplado al fluido de los poros mediante un coeficiente de
acoplamiento potencial $Q$ y un coeficiente de acoplamiento inercial, y predice
**tres** ondas en un material isótropo en lugar de una. Dos son de compresión y
una de cizalla (Allard & Atalla 2e, cap. 6). Las relaciones tensión-deformación
son

$$
\sigma^s_{ij} = \left[(P - 2N)\theta^s + Q\theta^f\right]\delta_{ij}
  + 2N e^s_{ij}, \qquad
\sigma^f_{ij} = -\phi p\,\delta_{ij} = (Q\theta^s + R\theta^f)\delta_{ij},
$$

y para el caso habitual de un armazón cuyos granos sólidos son mucho más rígidos
que el armazón que forman ($K_\mathrm{s} \to \infty$, cierto en esqueletos de vidrio,
roca y polímero) los tres coeficientes elásticos salen del módulo de cizalla $N$, el
coeficiente de Poisson $\nu$ y el módulo de compresibilidad $K_\mathrm{f}$ del fluido de
los poros (ecs. 6.26-6.29):

$$
R = \phi K_\mathrm{f}, \qquad Q = (1-\phi)K_\mathrm{f}, \qquad
P = \tfrac{4}{3}N + K_\mathrm{b} + \frac{(1-\phi)^2}{\phi}K_\mathrm{f}, \qquad
K_\mathrm{b} = \frac{2N(1+\nu)}{3(1-2\nu)}.
$$

Con las densidades modificadas $\tilde\rho_{11}$, $\tilde\rho_{12}$,
$\tilde\rho_{22}$ de la ec. 6.56, los dos números de onda de compresión salen
como los autovalores de un problema 2x2 (ecs. 6.67-6.69) y el de cizalla de la
ec. 6.83. `biot_waves` devuelve los tres, junto con las razones $\mu$ entre el
desplazamiento del fluido y el del esqueleto, que indican en qué medio viaja
cada onda. La onda cuyo $|\mu|$ es grande es la onda **del aire**, la que un
fluido equivalente ya modela; la otra es la onda **del esqueleto**, que no tiene
ningún equivalente en un fluido.

*Las tres ondas que predice la teoría de Biot donde un fluido equivalente
predice una, para la lana de vidrio de la tabla 6.1 de Allard & Atalla. El
panel inferior es lo que las nombra: $|\mu_\mathrm{a}|$ nunca baja de 42, así que en la
onda del aire se mueve el fluido de los poros y el esqueleto apenas, y esa es la
onda que ya describen los modelos de fluido equivalente. $|\mu_\mathrm{b}|$ se queda en
1, así que en la onda del esqueleto el fluido y el esqueleto se mueven juntos, y
ningún fluido equivalente tiene siquiera esa rama. La línea punteada en 495 Hz
es donde las dos raíces de compresión del modelo intercambian su lugar; el
etiquetado sigue a $|\mu|$ y no al orden de los autovalores, así que las curvas
siguen siendo continuas al cruzarla.*

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

```python
# El BiotWavesResult de la lana de vidrio de la tabla 6.1. Su .plot() dibuja el
# panel superior; el inferior son dos de sus campos.
f_biot = np.linspace(50.0, 1500.0, 1451)
biot = materials.biot_waves(
    materials.johnson_champoux_allard(
        f_biot, 40e3, porosity=0.94, tortuosity=1.06,
        viscous_length=0.56e-4, thermal_length=1.1e-4,
    ),
    porosity=0.94, tortuosity=1.06, frame_density=130.0,
    shear_modulus=2.2e6 * (1 + 0.1j),
)
print(round(float(abs(biot.airborne_velocity_ratio).min()), 1))    # 42.4
print(round(float(abs(biot.frame_borne_velocity_ratio[0])), 3))    # 1.002
```

</details>

`biot_waves` recibe el fluido equivalente de esqueleto *rígido* de los poros,
normalmente un resultado de `johnson_champoux_allard`. Es deliberado: la inercia
del esqueleto es asunto del propio modelo de Biot, así que pasarle un medio de
`limp_frame` contaría esa inercia dos veces.

La consecuencia que le importa a quien diseña es una resonancia. Una capa pegada
a una pared rígida mantiene su esqueleto quieto en la pared y libre en la cara
frontal, de modo que la onda del esqueleto resuena a un cuarto de longitud de
onda dentro de la capa, en

$$
f_\mathrm{r} = \frac{1}{4l}\sqrt{\frac{\mathrm{Re}(K_c)}{\rho_1}}, \qquad
K_c = \frac{2(1-\nu)N}{1-2\nu}
$$

(ecs. 6.109-6.111), donde $K_c$ es el coeficiente elástico longitudinal del
esqueleto **en el vacío** y $\rho_1$ su densidad aparente.
`frame_quarter_wave_resonance` la evalúa. Nada en los modelos de esqueleto
rígido o flexible puede producir ese pico.

*La lana de vidrio de la tabla 6.1 de Allard & Atalla, 100 mm pegada a una pared
rígida, con ambos modelos. Lejos de la resonancia las dos son indistinguibles,
que es la comprobación que el propio gráfico hace de la capa de Biot; alrededor
de ella la predicción poroelástica desarrolla el valle y el pico de la parte
real y el máximo agudo de la parte imaginaria que el libro mide y dibuja en su
fig. 6.10.*

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

```python

from phonometry import (
    PoroelasticLayer, PorousLayer, biot_waves, frame_elastic_coefficient,
    frame_quarter_wave_resonance, johnson_champoux_allard, layered_absorber,
)

# Allard & Atalla, tabla 6.1: lana de vidrio "Domisol Coffrage", 100 mm, pegada.
f = np.linspace(200.0, 1500.0, 1301)
shear = 2.2e6 * (1 + 0.1j)          # 220 N/cm2, factor de pérdidas 0,1
med = johnson_champoux_allard(
    f, 40e3, porosity=0.94, tortuosity=1.06,
    viscous_length=0.56e-4, thermal_length=1.1e-4,
)

print(frame_elastic_coefficient(shear, 0.0))       # (4400000+440000j)
print(round(frame_quarter_wave_resonance(
    0.10, shear_modulus=shear, poisson_ratio=0.0, frame_density=130.0), 1))
# 459.9

waves = biot_waves(med, porosity=0.94, tortuosity=1.06,
                   frame_density=130.0, shear_modulus=shear)
print(round(float(abs(waves.airborne_velocity_ratio[800])), 1))     # 42.4
print(np.round(waves.frame_borne_velocity_ratio[-1], 3))  # (0.811+0.473j)

biot = layered_absorber(f, [PoroelasticLayer(0.10, med, 0.94, 1.06, 130.0, shear)])
rigid = layered_absorber(f, [PorousLayer(0.10, med)])

fig, ax = plt.subplots()
for res, style in ((rigid, "--"), (biot, "-")):
    ax.plot(f, res.normalized_impedance.real, style)
    ax.plot(f, res.normalized_impedance.imag, style)
ax.set(xlabel="Frecuencia [Hz]", ylabel="Zs / rho0 c0", ylim=(-3, 3))
plt.show()

waves.plot(language="es")   # los tres números de onda de Biot
plt.show()
```

</details>

Dentro de una pila, una `PoroelasticLayer` lleva las seis variables que la
teoría necesita, $[v_1^s, v_3^s, v_3^f, \sigma^s_{33}, \sigma^s_{13},
\sigma^f_{33}]$, de modo que `layered_absorber` pasa de la cadena de dos
variables al ensamblado por matriz global del apdo. 11.5 de Allard & Atalla: las
capas de fluido y las láminas conservan sus matrices 2x2, cada capa
poroelástica entra por las seis amplitudes de onda de sus propios bloques
$[\Gamma]$ y no por una matriz de transferencia, y ambas se unen mediante las
matrices de acoplamiento impresas del apdo. 11.4. Resolver directamente en las
amplitudes evita invertir $[\Gamma(0)]$, que es lo que hace tratable un
esqueleto muy blando o muy grueso. Dos capas poroelásticas contiguas se
acoplan como esqueletos **pegados** (su ec. 11.67); una lámina junto a una de
ellas se acopla como pantalla libre, desacoplada mecánicamente. El
`transfer_matrix` devuelto se rellena con `nan` en una pila así, porque para
ella no existe una matriz de cadena 2x2; la impedancia superficial, el factor de
reflexión y la absorción no se ven afectados.

Para la misma capa de 100 mm la resonancia mueve la absorción hasta 0,21 en su
punto más agudo; en los centros de tercio de octava el mayor cambio es el 0,12
de 500 Hz:

```python

from phonometry import (
    PoroelasticLayer, PorousLayer, johnson_champoux_allard, layered_absorber,
)

bands = np.array([250, 315, 400, 500, 630, 800, 1000], dtype=float)
med = johnson_champoux_allard(
    bands, 40e3, porosity=0.94, tortuosity=1.06,
    viscous_length=0.56e-4, thermal_length=1.1e-4,
)
shear = 2.2e6 * (1 + 0.1j)
for layer in (PorousLayer(0.10, med),
              PoroelasticLayer(0.10, med, 0.94, 1.06, 130.0, shear)):
    print(layered_absorber(bands, [layer]).absorption.round(2))
# [0.55 0.58 0.62 0.65 0.69 0.74 0.78]   esqueleto rígido
# [0.53 0.56 0.61 0.77 0.71 0.74 0.78]   Biot poroelástico
```

La capa compensa los cinco parámetros adicionales cuando el esqueleto es lo
bastante rígido y pesado como para resonar en la banda de interés (lana mineral
densa, espumas estructurales), cuando el material está pegado a una placa que lo
sacude directamente, o cuando una impedancia medida muestra un rasgo que ningún
fluido equivalente explica. Para una manta ligera y blanda al aire, `limp_frame`
es mejor opción.

**Nota honesta sobre la validación.** No existe ninguna tabla publicada de
$Z_\mathrm{s}(f)$ ni de $\alpha(f)$ para una capa de Biot completamente especificada, ni
aquí ni en ninguna otra fuente comprobada, así que este modelo no se puede
anclar dígito a dígito como sí se hace con los módulos basados en normas. Lo que
lo ancla, en orden decreciente de fuerza: el **límite de esqueleto rígido**, en
el que hacer el esqueleto infinitamente rígido y pesado debe reproducir el
fluido equivalente JCA, cuya conformidad *sí* está anclada en dígitos
publicados, y lo hace con un residuo que cae exactamente como la inversa de la
rigidez a lo largo de ocho décadas, con cuatro ángulos de incidencia y con y sin
respaldo rígido; el **límite flexible**, en el que llevar la rigidez a cero
reproduce `limp_frame`; la coincidencia a precisión de máquina entre las **dos
derivaciones independientes** que da el libro, la forma cerrada de la ec. 6.107
del cap. 6 y el ensamblado por matriz global del cap. 11; y los tres números
calculados que el libro sí imprime en prosa para la lana de vidrio de la tabla
6.1, los tres reproducidos: la onda del aire cambia de raíz en 495 Hz,
$|\mu_\mathrm{a}| > 40$ por encima de 50 Hz y $\mu_\mathrm{b}$ cae de 1,0 en 50 Hz a 0,82 en
1500 Hz. Este último lo reproduce $\mathrm{Re}(\mu_\mathrm{b})$, no $|\mu_\mathrm{b}|$, aunque
la frase impresa diga «el módulo del cociente»: el modelo da
$\mu_\mathrm{b}(1500) = 0,811 + 0,473j$, cuya parte real queda a un 1,1 % del valor
impreso mientras su módulo, 0,939, se aparta un 14,5 %. Queda registrado en
[Erratas](/phonometry/es/reference/errata/), junto con el barrido de parámetros
que no logra acercar $|\mu_\mathrm{b}|$ a 0,82. El pico de impedancia de la muestra más
delgada del libro está impreso como 860 Hz y sale en 863,5 Hz con la regla del
máximo de $\mathrm{Im}(Z_\mathrm{s})$. Todo lo demás, incluido el comportamiento en
incidencia oblicua más allá de su límite de esqueleto rígido, descansa en formas
cerradas y en identidades estructurales, no en dígitos publicados.

## 2. Predicción multicapa por matrices de transferencia

Cada capa fluida de espesor $d$ aporta la matriz de cadena (Cox & D'Antonio
ec. 2.29; equivalente a la recursión de impedancias de Bies ec. D.95 y al
esquema de Mechel secc. D.4)

$$
\begin{bmatrix} p \\ u \end{bmatrix}_{\text{frente}} =
\begin{bmatrix}
\cos(k_x d) & j Z_x \sin(k_x d) \\
j \sin(k_x d)/Z_x & \cos(k_x d)
\end{bmatrix}
\begin{bmatrix} p \\ u \end{bmatrix}_{\text{fondo}},
$$

con el número de onda en profundidad
$k_x = \sqrt{k^2 - k_0^2 \sin^2\theta}$ por la ley de Snell y
$Z_x = Z_\mathrm{c} k / k_x$. Las láminas resonantes delgadas entran como impedancias
en serie $[[1, z], [0, 1]]$. Cerrar la cadena con una pared rígida (o aire
libre, o cualquier impedancia) da la impedancia de superficie, el factor de
reflexión $R(\theta)$ y $\alpha(\theta) = 1 - |R|^2$. Una única capa porosa
sobre pared rígida se reduce a la forma cerrada de libro
$Z_\mathrm{s} = -j Z_\mathrm{c} \cot(k d)$ (Mechel secc. D.3, ec. 1).

Detrás de las matrices hay una sola imagen física: una capa porosa con respaldo
rígido es un fluido equivalente resumido en cinco números medibles. La capa de 50 mm
de abajo, evaluada con el modelo JCA de cinco parámetros al que pertenecen
esos números, absorbe el 91 % de una onda de 1 kHz en incidencia normal; el
código que sigue pasa la misma capa por el ajuste de Miki de un parámetro,
que queda algo más alto (0,937), una imagen honesta de la separación entre
ambos modelos.

```python

from phonometry import materials

f = np.geomspace(200.0, 4000.0, 300)
med = materials.miki(f, 20000.0)
res = materials.layered_absorber(f, [materials.PorousLayer(0.05, med)])
i = np.argmin(np.abs(f - 1000.0))
print(round(res.absorption[i], 3))               # 0.937 a 1 kHz

res.plot()   # alpha(f) con |R| superpuesto
```

**Separar la capa de la pared.** La jugada más habitual del diseño de
absorbentes no es más material, es una cámara, y la razón está en la condición
de contorno. Una capa porosa disipa a través de la velocidad de partícula de sus
poros, y un respaldo rígido fuerza esa velocidad a cero en la pared, así que una
capa delgada frente a la longitud de onda queda en la zona muerta y no hace casi
nada en baja frecuencia. Sepárala $d$ de la pared y quedará cerca del máximo de
velocidad a la frecuencia en la que la cámara es un cuarto de longitud de onda,
$c_0/4d$, que son 858 Hz para una cámara de 100 mm (la propia presencia de la
capa baja todavía más la ganancia útil). Merece la pena ver la aritmética:

```python
# La misma manta de 50 mm, pegada a la pared y separada de ella.
bands_gap = np.array([125.0, 250.0, 500.0, 1000.0])
med_gap = materials.miki(bands_gap, 20000.0)
flat = materials.layered_absorber(bands_gap, [materials.PorousLayer(0.05, med_gap)])
spaced = materials.layered_absorber(
    bands_gap, [materials.PorousLayer(0.05, med_gap), materials.AirLayer(0.10)]
)
thick = materials.layered_absorber(bands_gap, [materials.PorousLayer(0.15, med_gap)])
print(np.round(flat.absorption, 2))     # [0.09 0.26 0.62 0.94]  50 mm en la pared
print(np.round(spaced.absorption, 2))   # [0.44 0.78 0.9  0.77]  50 mm + cámara 100 mm
print(np.round(thick.absorption, 2))    # [0.52 0.71 0.8  0.89]  150 mm en la pared
```

A 250 Hz la capa de 50 mm sobre una cámara de 100 mm supera a 150 mm de manta
maciza, 0,78 frente a 0,71, con un tercio del material y los mismos 150 mm de
profundidad total. La jugada trae dos límites: la ganancia desaparece por encima
de la primera media onda de la cámara, donde la capa vuelve a caer en un nodo de
velocidad (se ve en la curva separada quedando por debajo de la pegada a 1 kHz),
y sobre una superficie grande hay que compartimentar la cámara o el campo se
propaga lateralmente por dentro en incidencia oblicua. Esta es la contraparte de
predicción de los
[montajes tipo E-*xxx* y G-*xxx*](/phonometry/es/materials/absorbers/absorption-measurement/#12-la-probeta-y-su-montaje-apartado-62-y-anexo-b)
de ISO 354, cuyo sufijo es exactamente esta $d$.

El modelo multicapa evalúa las magnitudes físicas mediante una recursión de
admitancias numéricamente robusta (inmune al desbordamiento
$e^{|\mathrm{Im}(k_x)| d}$ de las entradas matriciales en bruto en capas
extremadamente atenuantes) y aun así expone la matriz de cadena completa
(recíproca por construcción, $\det T = 1$) en `transfer_matrix`, lista para
la [maquinaria ASTM E2611](/phonometry/es/materials/absorbers/impedance-tube/)
(`TransferMatrix`).

*Cuatro construcciones, un mismo presupuesto de 50 mm: la capa porosa
funciona en banda ancha pero decae a baja frecuencia; los diseños
microperforado, perforado y de membrana cambian ancho de banda por un pico
resonante situado cada vez más abajo. Las líneas punteadas son las formas
cerradas de cavidad poco profunda; el modelo completo queda por debajo
porque la masa viscosa del tapón de aire y la profundidad finita de la
cámara no son despreciables.*

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

```python

from phonometry import materials as m

f = np.geomspace(50.0, 5000.0, 500)
med = m.miki(f, 20000.0)
med_light = m.miki(f, 10000.0)
designs = {
    "Poroso 50 mm": [m.PorousLayer(0.05, med)],
    "MPP + cámara": [m.MicroperforatedPlateLayer(0.5e-3, 0.15e-3, 0.008),
                     m.AirLayer(0.048)],
    "Perforado + poroso": [m.PerforatedPlateLayer(0.006, 0.0025, 0.05),
                           m.PorousLayer(0.025, med), m.AirLayer(0.019)],
    "Membrana + poroso": [m.MembraneLayer(2.0), m.AirLayer(0.01),
                          m.PorousLayer(0.038, med_light)],
}
fig, ax = plt.subplots()
for label, layers in designs.items():
    ax.semilogx(f, m.layered_absorber(f, layers).absorption, label=label)
ax.set(xlabel="Frecuencia [Hz]", ylabel="Coeficiente de absorción")
ax.legend()
plt.show()
```

</details>

Detrás de cada una de esas curvas hay una simple lista de capas, leída de
delante hacia atrás en el orden en que la onda incidente la encuentra.
`plot_absorber_stack` dibuja esa lista a escala antes de ejecutar ninguna
física, y un resultado resuelto retiene sus capas, así que
`materials.layered_absorber(f, layers).plot_geometry()` dibuja la misma
sección desde el propio resultado.

*La lista de capas tal y como la encuentra la onda: placa microperforada,
cámara de aire, capa porosa, respaldo rígido. Dibujar el apilado a escala
antes de calcular nada permite cazar de un vistazo el clásico despiste de
metros frente a milímetros en un espesor.*

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

```python

from phonometry import materials

f = np.linspace(200.0, 4000.0, 100)
layers = [
    materials.MicroperforatedPlateLayer(0.001, 0.0002, 0.01),
    materials.AirLayer(0.03),
    materials.PorousLayer(0.05, materials.miki(f, 20000.0)),
]

# La función libre dibuja cualquier lista de capas; un resultado resuelto
# retiene sus capas, así que esto dibuja la misma sección:
#   materials.layered_absorber(f, layers).plot_geometry()
materials.plot_absorber_stack(layers, language="es")
plt.show()
```

</details>

## 3. Láminas resonantes: perforado, microperforado, membrana

**Panel perforado.** Los tapones de aire de los orificios son la masa de un
resonador de Helmholtz: $m = (\rho_0/\varepsilon)\,[t + 2\delta a +
\sqrt{8\nu/\omega}\,(1 + t/2a)]$ con el área abierta $\varepsilon$, el
factor de corrección de extremo $\delta$ por extremo de orificio y la
resistencia viscotérmica
$r = (\rho_0/\varepsilon)\sqrt{8\nu\omega}\,(1 + t/2a)$ (Cox & D'Antonio
ecs. 7.6/7.12). La corrección de extremo por defecto es el ajuste de
interacción de la función de Fok
$\delta = 0{,}85\,(1 - 1{,}47\sqrt{\varepsilon} + 0{,}47\varepsilon^{3/2})$
(tabla 7.1), válido para cualquier área abierta. Para una cámara poco
profunda la resonancia es
$f_0 = (c_0/2\pi)\sqrt{\varepsilon/(t'\,d)}$ (ec. 7.4). En esas dos
expresiones, $t$ es el espesor de la placa, $a$ el **radio** del orificio,
$\varepsilon$ el área abierta (área de orificios sobre área de panel), $\nu$ la
viscosidad cinemática del aire, $t' = t + 2\delta a$ el espesor de placa con
corrección de extremo y $d$ la profundidad de la cámara tras el panel.

**Por qué un panel perforado necesita material poroso detrás.** La fórmula de
resonancia coloca el pico; la *resistencia* decide su altura y su anchura, y ahí
es donde un panel perforado corriente es flojo. Sus orificios miden milímetros,
así que la pérdida viscosa de cada tapón es una fracción pequeña de
$\rho_0 c_0$: sobre una cámara vacía la construcción es un resonador de Q alta
que absorbe en una banda estrecha y no hace casi nada fuera de ella. El arreglo
habitual es poner la resistencia que falta dentro de la cámara, una capa porosa
o un velo resistivo, lo que baja y ensancha el pico hacia la condición de
adaptación. Esa es exactamente la razón de que el diseño «perforado + poroso» de
la figura de arriba lleve un `PorousLayer` detrás de la placa, y de que el MPP
de más abajo pueda prescindir de él: sus orificios submilimétricos aportan ellos
mismos la resistencia. De ahí salen dos consecuencias de diseño: colocar la capa
porosa donde la velocidad de partícula es alta, es decir, contra la placa
perforada y no tumbada sobre el respaldo rígido, y apuntar a una resistencia
total al flujo del orden de $\rho_0 c_0$. Ese mismo enunciado leído como
adaptación de impedancia es la condición de acoplamiento crítico de la
[guía de metaabsorbentes](/phonometry/es/materials/absorbers/metamaterial-absorbers/).

### Las clases de lámina: parámetros

Las tres láminas toman argumentos posicionales, y la dimensión del orificio es
un **radio**, no un diámetro: la mitad del orificio taladrado. Equivocarse ahí
calcula la resonancia y la absorción de pico de un orificio del doble del
tamaño real.

| Clase | Parámetro | Unidades | Notas |
| :--- | :--- | :--- | :--- |
| `PerforatedPlateLayer` | `thickness` | m | Espesor de la placa $t$ |
| | `hole_radius` | m | **Radio** del orificio $a$, la mitad del diámetro taladrado |
| | `open_area` | — | Razón de perforación $\varepsilon$ = área de orificios / área de panel |
| | `end_correction` | — | $\delta$ por extremo de orificio; `None` usa el ajuste de interacción de Fok |
| `MicroperforatedPlateLayer` | `thickness` | m | Espesor de la placa $t$ |
| | `hole_radius` | m | **Radio** del orificio $a$ |
| | `open_area` | — | Razón de perforación $\varepsilon$ |
| | `end_correction` | — | Por defecto `0.85`, la reactancia de pistón de Maa |
| `MembraneLayer` | `surface_density` | kg/m² | Masa por unidad de superficie $m$ |
| | `resistance` | Pa·s/m | Resistencia al flujo añadida; por defecto `0.0` |

**Panel microperforado (MPP).** Con orificios submilimétricos la capa
límite viscosa llena el orificio y el panel absorbe *sin ningún material
poroso*. La biblioteca implementa la impedancia exacta de tubo corto de Maa
(Maa 1998, ec. 2),

$$
z_1 = j\omega\rho_0 t \left[ 1 -
\frac{2}{x\sqrt{-j}}\,\frac{J_1(x\sqrt{-j})}{J_0(x\sqrt{-j})} \right]^{-1},
\qquad x = a\sqrt{\rho_0 \omega/\eta},
$$

más las correcciones de extremo de la ec. 5 (resistencia superficial
$\tfrac{1}{2}\sqrt{2\omega\rho_0\eta}$ y reactancia de pistón $0{,}85\,d$ en
total), dividida por el área abierta. La constante de perforado $x$ (proporcional al
radio del orificio sobre el espesor de la capa límite viscosa) lo gobierna
todo: en la resonancia $\omega_0 m = \cot(\omega_0 D/c_0)$ la absorción
máxima es $4r/(1+r)^2$ y el ancho de banda de media absorción es
$f_2/f_1 = \pi/\mathrm{arccot}(1+r) - 1$ (Maa, ecs. 9–21, tabla I).

```python

from phonometry import materials

# Maa (1998), fig. 5: diámetro de orificio 0,2 mm (o sea hole_radius = 0,1 mm),
# placa de 0,2 mm de espesor, orificios cada 2,5 mm, cámara de 6 cm.
eps = (np.pi / 4.0) * (0.2 / 2.5) ** 2
f = np.linspace(100.0, 4000.0, 2000)
res = materials.layered_absorber(
    f, [materials.MicroperforatedPlateLayer(0.2e-3, 0.1e-3, eps),
        materials.AirLayer(0.06)],
)
i = np.argmax(res.absorption)
print(f"alpha máximo = {res.absorption[i]:.2f} a {f[i]:.0f} Hz")
# alpha máximo = 0.96 a 677 Hz
res.plot()   # alpha(f) con |R| superpuesto: el pico resonante del MPP
```

*El propio diseño de la fig. 5 de Maa, sin material poroso alguno: las
pérdidas viscosas de los orificios submilimétricos amortiguan la resonancia
panel-cámara en un pico de absorción ancho. El rasgo estrecho cerca de
2,9 kHz es la resonancia de media onda de la cámara, donde la cámara
presenta un nodo de presión al panel y la absorción se hunde antes de que la
siguiente resonancia la recupere.*

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

```python

from phonometry import materials

# Maa (1998), fig. 5: diámetro de orificio 0,2 mm (o sea hole_radius = 0,1 mm),
# placa de 0,2 mm de espesor, orificios cada 2,5 mm, cámara de 6 cm.
eps = (np.pi / 4.0) * (0.2 / 2.5) ** 2
f = np.linspace(100.0, 4000.0, 1200)
res = materials.layered_absorber(
    f, [materials.MicroperforatedPlateLayer(0.2e-3, 0.1e-3, eps),
        materials.AirLayer(0.06)],
)

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

# A mano, desde los campos del resultado:
fig, ax = plt.subplots()
ax.semilogx(f, res.absorption, label="Absorción alpha")
ax.semilogx(f, np.abs(res.reflection), "--", label="Factor de reflexión |R|")
ax.set(xlabel="Frecuencia [Hz]", ylabel="Coeficiente")
ax.legend()
plt.show()
```

</details>

**Membrana.** Una lámina impermeable flexible es la masa superficial
$z = j\omega m$ (Cox ec. 7.14; Bies ec. D.96); sobre una cámara resuena en
el clásico $f_0 \approx 60/\sqrt{m d}$ (adiabático;
$\approx 50/\sqrt{m d}$ cuando la cámara está rellena de poroso y es
isoterma, Cox ecs. 7.9/7.10). Las formas cerradas se exponen como
`helmholtz_resonance_frequency` y `membrane_resonance_frequency`; la
respuesta completa en frecuencia sale de la misma pila de capas.

### La impedancia de lámina en sí

Las clases de capa de arriba entregan su impedancia de transferencia al
modelo multicapa, y el modelo devuelve $\alpha(f)$, que es como se
*evalúa* una lámina resonante, no como se *diseña*. Toda relación de diseño de
esta sección está escrita en $r$ y $\omega m$, así que las mismas impedancias
están expuestas por separado: `perforated_plate_impedance`,
`microperforated_plate_impedance` y `membrane_impedance`, que devuelven $z$ en
Pa·s/m antes de normalizar, más `perforation_end_correction` para el factor de
Fok. Con ellas el argumento de diseño se cierra sobre sí mismo: la reactancia
cruza la $-\cot(\omega D/c_0)$ de la cámara en la resonancia, y la resistencia
*ahí* fija tanto la altura del pico $4r/(1+r)^2$ como el ancho de banda:

```python
# La geometría de la propia fig. 5 de Maa, leída como impedancia en su pico de
# 677,5 Hz.
rho_c = 1.205 * 343.0
f_peak = np.array([677.5])
z_mpp = materials.microperforated_plate_impedance(
    f_peak, thickness=0.2e-3, hole_radius=0.1e-3, open_area=eps
)
r_mpp = float(z_mpp.real[0]) / rho_c
print(round(r_mpp, 3), round(float(z_mpp.imag[0]) / rho_c, 3))   # 1.531 1.077
print(round(4 * r_mpp / (1 + r_mpp) ** 2, 3))    # 0.956 = el alpha del pico de arriba

# El mismo panel con orificios milimétricos: un orden de magnitud menos de
# resistencia, de ahí el pico estrecho que necesita respaldo poroso.
z_perf = materials.perforated_plate_impedance(
    f_peak, thickness=0.006, hole_radius=0.0025, open_area=0.05
)
print(round(float(z_perf.real[0]) / rho_c, 4))   # 0.0925, 16 veces menor

# Una membrana es reactancia pura salvo que se aporte una resistencia de fijación.
print(np.round(materials.membrane_impedance(f_peak, surface_density=2.0), 1))
# [0.+8513.6j]

# La interacción de Fok: los orificios apretados acortan el tapón efectivo.
print(round(materials.perforation_end_correction(0.05), 3))   # 0.575 frente a 0.85
```

*Toda la regla de diseño de esta sección en una imagen. La reactancia del panel
$x(f)$ y la de la cámara $-\cot(\omega D/c_0)$ se cruzan en 677 Hz: ese cruce es
la resonancia, y la coloca la geometría. Lo que ocurre *en* el cruce lo fija la
resistencia de ahí, $r = 1{,}53$, que da $4r/(1+r)^2 = 0{,}96$, el pico que
calcula la pila, recuperado a partir de dos números. Un panel con orificios
milimétricos tiene una $r$ dieciséis veces menor, así que su cruce sería igual
de agudo y mucho menos absorbente, que es todo el argumento a favor de los
orificios submilimétricos o del respaldo poroso.*

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

```python
f_sheet = np.geomspace(100.0, 4000.0, 400)
z_sheet = materials.microperforated_plate_impedance(
    f_sheet, thickness=0.2e-3, hole_radius=0.1e-3, open_area=eps
) / rho_c
cavity = -1.0 / np.tan(2.0 * np.pi * f_sheet * 0.06 / 343.0)
print(round(float(z_sheet.real[0]), 2), round(float(cavity[0]), 2))
```

</details>

### Construir lo que predice la pila

La pila de matrices de transferencia supone una construcción infinita,
lateralmente uniforme y de reacción local. Para que esa hipótesis sobreviva en
obra tienen que cumplirse cinco cosas.

1. **Compartimenta o rellena la cámara que hay tras una lámina resonante.** El
   modelo unidimensional y la hipótesis de reacción local necesitan los dos
   celdas pequeñas frente a la longitud de onda a la frecuencia de diseño. Una
   cámara sin compartimentar tras una lámina perforada deja que el campo se
   propague lateralmente, lo que convierte un diseño de reacción local en uno de
   reacción volumétrica y suele ensanchar y bajar el pico.
2. **Sella el perímetro contra el soporte**, o la cámara queda ventilada y la
   resonancia para la que se sintonizó no existe.
3. **Comprueba el área abierta contra la lámina que realmente compraste.** La
   $\varepsilon$ del modelo es la relación geométrica
   $(\pi/4)(d_\text{orificio}/b)^2$ para orificios de diámetro
   $d_\text{orificio}$ a un paso $b$. Las rebabas, la pintura y los orificios
   submilimétricos parcialmente obturados mueven directamente la resistencia del
   MPP, y la resistencia es de lo que depende la altura del pico.
4. **Monta la membrana flexible y sin tensión.** Sujetarla y rigidizarla añade
   una fuerza recuperadora que el modelo $z = j\omega m$ no tiene, y empuja
   $f_0$ por encima de la estimación $60/\sqrt{m d}$.
5. **No des el respaldo por supuesto.** La pila dibujada termina en una pared
   rígida; una construcción sobre un soporte elástico necesita que esa
   impedancia de respaldo se pase explícitamente con `termination=` en lugar de
   dejarla en `"rigid"`.

## 4. Incidencia oblicua y aleatoria

`layered_absorber(..., angle=theta)` evalúa la pila completa de reacción
volumétrica a cualquier ángulo polar; las láminas son de reacción local
(independientes del ángulo) y las capas fluidas refractan según la ley de
Snell; para un MPP sobre cámara esto reproduce exactamente la forma cerrada
oblicua de Maa (ec. 23). El coeficiente de incidencia aleatoria es la
integral de Paris (Mechel secc. D.5, ec. 9)

$$
\alpha_\mathrm{dif} = \frac{2}{\sin^2\theta_\mathrm{lim}} \int_0^{\theta_\mathrm{lim}}
\alpha(\theta)\,\cos\theta\,\sin\theta\,\mathrm{d}\theta,
$$

evaluada por cuadratura de Gauss–Legendre en `diffuse_field_absorption`
(``angle_limit`` por defecto 90°; se usan truncamientos a 75–87°). Ese
truncamiento no es decoración y merece una regla de decisión. El integrando
pondera sobre todo los ángulos oblicuos, y es justo cerca de la incidencia
rasante donde la teoría del plano infinito deja de describir un ensayo real:
una probeta finita y montada no se comporta como una capa ilimitada a 85°, y un
campo difuso sobre una muestra de 10 a 12 m² sencillamente no entrega la
energía rasante que supone la integral completa, así que el resultado sin
truncar tiende a quedar por debajo de los valores medidos. Lo que hace la
práctica se sigue de ahí: truncar en torno a 78° cuando la intención es
compararse con una medición en cámara reverberante, y mantener 90° cuando la
intención es el coeficiente teórico de incidencia aleatoria de una superficie
infinita. Un $\alpha_\mathrm{dif}$ truncado es una magnitud de ingeniería ajustada y
no una magnitud física, así que el límite debe citarse junto al número: el
fragmento de abajo imprime el tamaño de la decisión. Para una
superficie de *reacción local* con impedancia normalizada conocida la
integral tiene la forma cerrada de Mechel ec. 10, expuesta como
`statistical_absorption`; su máximo sobre todas las impedancias pasivas es
el **0,951** publicado (en $z \approx 1{,}57$).

```python

from phonometry import materials

f = np.array([250.0, 500.0, 1000.0, 2000.0])
med = materials.miki(f, 20000.0)
layers = [materials.PorousLayer(0.05, med)]
normal = materials.layered_absorber(f, layers)
diffuse = materials.diffuse_field_absorption(f, layers)
print(np.round(normal.absorption, 2))    # [0.26 0.62 0.94 0.95]
print(np.round(diffuse.absorption, 2))   # [0.37 0.68 0.9  0.95]
diffuse.plot()   # alpha_dif(f); superpón normal.absorption para comparar

print(round(float(materials.statistical_absorption(1.567 + 0j)), 3))  # 0.951

# Cuánto vale el truncamiento, sobre la misma capa.
truncated = materials.diffuse_field_absorption(f, layers, angle_limit=np.radians(78.0))
print(np.round(truncated.absorption - diffuse.absorption, 3))
# [-0.001  0.01   0.019  0.018]  unas centésimas, y van en el sentido correcto
```

*Por qué la cámara reverberante lee más alto que el tubo: la integral de
Paris pondera los ángulos oblicuos, cuyas ondas recorren un camino más largo
dentro de la capa, así que $\alpha_\mathrm{dif}$ supera al $\alpha(0°)$ de
incidencia normal justo donde la capa es delgada frente a la longitud de
onda. Es la contraparte de modelo de la discusión tubo frente a cámara
reverberante de
[Medida y clasificación de la absorción sonora](/phonometry/es/materials/absorbers/absorption-measurement/).*

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

```python

from phonometry import materials

f = np.geomspace(125.0, 4000.0, 200)
layers = [materials.PorousLayer(0.05, materials.miki(f, 20000.0))]
normal = materials.layered_absorber(f, layers)
diffuse = materials.diffuse_field_absorption(f, layers)

# Una línea, y después la superposición de incidencia normal en los mismos ejes:
ax = diffuse.plot(language="es")
ax.plot(f, normal.absorption, "--", label="Incidencia normal alpha(0)")
ax.legend()
plt.show()
```

</details>

**No compares esto con el $\alpha_\mathrm{s}$ de una hoja de características.** La integral de
Paris se evalúa sobre una capa *infinita y lateralmente uniforme*. Una medición
ISO 354 se hace sobre una probeta montada de 10 a 12 m² cuyos bordes difractan
energía hacia dentro, que es la razón de que el $\alpha_\mathrm{s}$ medido supere 1 de
forma rutinaria y de que el mismo producto salga distinto en dos salas. Espera
que el valor medido corra por encima del $\alpha_\mathrm{dif}$ predicho en torno a 0,1
a 0,2 en las bandas medias, y más cuanto menor sea la probeta y mayor su
relación perímetro-superficie. El corolario para el ajuste de modelos es la
mitad importante: ajusta los parámetros del material contra una medida de tubo,
o contra la predicción difusa de un modelo en el que confíes, y nunca contra el
$\alpha_\mathrm{s}$ de una hoja de características, porque el excedente de tamaño finito se
absorbería dentro de una resistividad al flujo equivocada y se propagaría
después a todas las construcciones que predigas con ella. Para lo que la
predicción *sí* sirve es para comparar construcciones, para dimensionar un
tratamiento antes de que exista y para alimentar un cálculo de sala que espera
entrada de incidencia aleatoria; una especificación escrita contra un
$\alpha_\mathrm{s}$ medido sigue teniendo que cerrarse con una medida.

*El integrando que consume el promedio de Paris, y las dos maneras de
promediarlo. Izquierda: $\alpha(\theta)$ de la misma capa de 50 mm a cuatro
frecuencias, cada curva continua de reacción volumétrica
(`layered_absorber(..., angle=theta)`, en la que las capas fluidas refractan)
acompañada por la curva de reacción local obtenida de la misma impedancia
superficial a incidencia normal. Las dos coinciden en incidencia normal por
construcción, se separan en el intervalo de 40° a 75° donde el integrando de
Paris lleva la mayor parte de su peso (el modelo volumétrico absorbe más, porque
la onda refracta y viaja más lejos dentro de la capa) y vuelven a converger
cuando ambas se desploman hacia cero en rasante. La elección del modelo de
reacción es, por tanto, una elección sobre la parte de la integral que más
importa. Derecha: los dos resultados integrados a lo largo de la frecuencia, con
el máximo de 0,951 de la forma cerrada de reacción local dibujado como un techo
que ninguna impedancia pasiva puede superar.*

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

```python
# alpha(theta) a una frecuencia, de las dos maneras.
theta = np.radians(np.linspace(0.0, 88.0, 60))
f_one = np.array([1000.0])
layers_one = [materials.PorousLayer(0.05, materials.miki(f_one, 20000.0))]
bulk = [float(materials.layered_absorber(f_one, layers_one, angle=float(t)).absorption[0])
        for t in theta]
z_normal = materials.layered_absorber(f_one, layers_one).normalized_impedance[0]
local = [1.0 - abs((z_normal * np.cos(t) - 1.0) / (z_normal * np.cos(t) + 1.0)) ** 2
         for t in theta]
print(round(bulk[0], 3), round(bulk[-1], 3))     # 0.937 0.161
print(round(local[0], 3), round(local[-1], 3))   # 0.937 0.138
```

</details>

Las capas clásicas de arriba absorben con volumen o con una cavidad de
cuarto de onda. Sus parientes de metamaterial resonante, paneles rígidos de
ranuras submilimétricas cargadas con resonadores de Helmholtz que
ralentizan el sonido y alcanzan la absorción perfecta ($\alpha = 1$) en el
acoplamiento crítico con paneles de solo $\lambda/38$ de profundidad, se
mudaron a su propia guía:
[Metaabsorbentes](/phonometry/es/materials/absorbers/metamaterial-absorbers/) cubre el
modelo de matrices de transferencia, el diseño por
acoplamiento crítico y la comprobación cruzada FDTD de la celda mallada.

## Notas prácticas

**Rangos de ajuste.** Delany–Bazley avisa (y extrapola) fuera de
$0{,}01 < X < 1$ y Miki fuera de $0{,}01 < f/\sigma < 1$; los valores por
debajo del rango deben tratarse como cualitativos. JCA necesita cuatro parámetros más pero se comporta
físicamente en todo el rango; con
$\Lambda = \Lambda' = \sqrt{8\alpha_\infty\eta/(\phi\sigma)}$ y
$\alpha_\infty = 1$ sigue a Delany–Bazley dentro del rango de ajuste.

**Esqueleto rígido o flexible.** Todos los modelos de fluido equivalente
anteriores suponen un esqueleto inmóvil, lo que solo se cumple por encima de la
frecuencia de desacoplo $F_\mathrm{d} = \sigma\phi^2/2\pi\rho_1$. Por debajo, un
esqueleto ligero se mueve con el fluido de los poros, y `limp_frame` añade su
inercia (Allard & Atalla, ecs. 11.53-11.55). Úsalo con fieltros, velos y fibra
de vidrio ligera, con cualquier material medido sin sujeción en un tubo de
impedancia y siempre que el esqueleto en vacío sea más blando que unos 20 kPa
(`limp_frame_applicable`); no lo uses, ni tampoco el modelo rígido, con un
material adherido a una estructura vibrante. Cuando el esqueleto es lo bastante
rígido y pesado como para resonar en la banda de interés no vale ningún fluido
equivalente: usa una `PoroelasticLayer` y la teoría de Biot completa.

**Reacción local frente a volumétrica.** El modelo de capas es de
reacción volumétrica (el sonido refracta y viaja dentro de las capas).
`statistical_absorption` supone reacción local, una buena aproximación para
resistividades altas, cámaras compartimentadas o revestimientos resonantes
delgados; para capas porosas gruesas y ligeras integra el modelo volumétrico
con `diffuse_field_absorption` (Mechel secc. D.6).

**Dónde se comprobaron los números.** Ningún estándar rige estos modelos
de predicción; son métodos de libro y de revista implementados en sala
limpia desde las fuentes de las referencias de más abajo. Los modelos están
fijados dígito a
dígito a las tablas de coeficientes impresas (Bies tabla D.1, Miki
ecs. 30–34), el modelo multicapa a las formas cerradas anteriores y a la
recuperación por `TransferMatrix` de la
[página del tubo de
impedancia](/phonometry/es/materials/absorbers/impedance-tube/), el MPP a
la propia aproximación de Maa (acuerdo declarado de ~6 % con la ec. 2
exacta), a su ejemplo de diseño y a su tabla I, y la integral de Paris a su
forma cerrada de reacción local. Las erratas encontradas en las fuentes
durante este trabajo están registradas en el
[registro de erratas](https://github.com/jmrplens/phonometry/blob/main/docs/ERRATA.md).

## Qué cubre esta guía

Los métodos de libro y de revista de Mechel, Bies, Cox y D'Antonio, Miki
(1990), Maa (1998) y Johnson, Koplik y Dashen (1987), implementados en sala
limpia como se describe arriba, junto con la teoría de Biot de los capítulos 6
y 11 de Allard y Atalla. Esto cubre los modelos de fluido equivalente porosos
(`delany_bazley`, `miki`, `johnson_champoux_allard`, `limp_frame`), la capa
poroelástica (`biot_waves`, `biot_surface_impedance`, `PoroelasticLayer`), el
modelo multicapa por matrices de transferencia (`layered_absorber` con
`AirLayer`, `PorousLayer`, `PoroelasticLayer`, `PerforatedPlateLayer`,
`MicroperforatedPlateLayer` y `MembraneLayer`) y los coeficientes de
incidencia aleatoria por la integral de Paris (`diffuse_field_absorption`,
`statistical_absorption`). Las impedancias de transferencia de lámina que
consumen las clases de capa también están expuestas por separado, que es como
se diseña una lámina resonante en vez de solo evaluarla:
`perforated_plate_impedance`, `microperforated_plate_impedance`,
`membrane_impedance` y `perforation_end_correction`.

Aquí no se mide nada: los cinco parámetros de JCA, el módulo de cizalla y el
coeficiente de Poisson del esqueleto y la geometría de la lámina son todos
entradas, y la sección 1.1 dice de dónde salen sin implementar ninguno de esos
métodos de caracterización (solo se muestra el ajuste inverso contra una
impedancia medida, y eso es `scipy.optimize`, no esta biblioteca). Las reglas
de construcción del final de la sección 3 son práctica de ingeniería sin norma
detrás, y la diferencia de tamaño finito entre un $\alpha_\mathrm{dif}$ predicho y un
$\alpha_\mathrm{s}$ medido se enuncia pero no se modela: nada de aquí reproduce el
efecto de borde. El libro de Cox y D'Antonio trata tanto difusores como
absorbentes, pero esta guía solo implementa la mitad de absorbentes. La
predicción del difusor de rejilla de fase de Schroeder vive en un módulo
aparte (`materials.diffusers.design`), documentada en [Difusores y sus
coeficientes](/phonometry/es/materials/diffusers/diffusers/) y, para los
paneles en sublongitud de onda profunda cargados con resonadores, en
[Metadifusores](/phonometry/es/materials/diffusers/metadiffusers/). El
absorbente de ranura con resonador de Helmholtz de acoplamiento crítico
(`slit_helmholtz_absorber`, `critical_coupling_design`) es el tema de
[Metaabsorbentes](/phonometry/es/materials/absorbers/metamaterial-absorbers/).

## Véase también

- [Resistencia al flujo de aire](/phonometry/es/materials/absorbers/airflow-resistance/),
  [Tubo de impedancia](/phonometry/es/materials/absorbers/impedance-tube/) y
  [Medida y clasificación de la absorción sonora](/phonometry/es/materials/absorbers/absorption-measurement/):
  las normas de medida con las que conectan estos modelos de predicción, a
  saber, ISO 9053-1/-2 (resistividad al flujo), ISO 10534-1/-2 y ASTM E2611
  (tubo de impedancia) e ISO 354 / ISO 11654 (absorción de incidencia
  aleatoria y su valoración).
- [Metaabsorbentes](/phonometry/es/materials/absorbers/metamaterial-absorbers/): los
  paneles ranurados de sonido lento y la condición de acoplamiento crítico
  que llevan la absorción perfecta al régimen de sublongitud de onda
  profunda.
- Teoría: [Caracterización de materiales acústicos](/phonometry/es/reference/theory/materials-surfaces/#caracterización-de-materiales-acústicos-iso-11654-iso-9053-12-iso-10534-12-astm-e2611): las magnitudes de caracterización que estos modelos empíricos y fenomenológicos toman como entrada.
