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

El tubo de impedancia es el laboratorio de materiales reducido a un banco: un
conducto rígido de unos pocos centímetros por el que un altavoz lanza una
única onda plana contra una muestra pequeña, y todo lo que la muestra le hace
a esa onda se lee desde micrófonos en la pared del tubo. Como hay una sola
onda y un solo ángulo, el tubo recupera lo que una cámara reverberante no
puede: el factor de reflexión y la impedancia superficial **complejos** a
incidencia normal, módulo y fase, de una probeta del tamaño de la tapa de una
taza de café. Tres normas comparten el hardware y difieren en el método, y la
biblioteca mantiene sus funciones auxiliares separadas y nunca los mezcla: el método de
la **razón de onda estacionaria** de ISO 10534-1, el método de la **función
de transferencia** con dos micrófonos de ISO 10534-2 y el método de la
**matriz de transferencia** con cuatro micrófonos de ASTM E2611, que añade la
pérdida por transmisión. La sección final ejecuta el instrumento completo,
muestra incluida, dentro del
[simulación FDTD](/phonometry/es/simulation/fdtd-simulation/) y recupera la respuesta
analítica con las mismas cadenas de reducción.

## 1. El rango de frecuencia de trabajo

Todo lo que informa el tubo (ISO 10534-2, apartado 4) 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 del apartado 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
```

*Qué tubo ve qué bandas. Cada barra es una geometría, y cada extremo lleva
rotulada la restricción que lo limita: el extremo bajo es siempre el suelo de
resolución de fase $c_0/(20 s)$, mientras que el extremo alto es el corte
$0{,}58\,c_0/d$ para un tubo de separación amplia y la singularidad de
separación $0{,}45\,c_0/s$ en cuanto los micrófonos se alejan. El tubo de
100 mm con separación de 100 mm cubre las bandas de tercio de octava de 200 Hz
a 1250 Hz, y el de 29 mm con separación de 20 mm las bandas de 1 kHz a 5 kHz,
así que la pareja empalma en el solape de 1 kHz a 1,25 kHz; y ni siquiera
juntos llegan a las bandas de 100 Hz, 125 Hz y 160 Hz, que es la razón de que
los datos de absorción en baja frecuencia vengan de la cámara reverberante y no
de un tubo. La barra ASTM es el mismo equipo bajo las constantes de E2611: más
ancha por abajo (un suelo del 1 % de la longitud de onda en lugar del 5 %) y
más estrecha por arriba (una cota de separación de $0{,}40\,c$ en lugar de
$0{,}45\,c$).*

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

```python
for spacing, diameter in ((0.100, 0.100), (0.050, 0.100), (0.020, 0.029)):
    iso = materials.plane_wave_frequency_range(spacing, 343.2, diameter=diameter)
    astm = materials.plane_wave_frequency_range_astm(spacing, 343.2, diameter=diameter)
    print(f"tubo de {diameter * 1e3:.0f} mm, s = {spacing * 1e3:.0f} mm:",
          f"ISO {iso[0]:.0f}-{iso[1]:.0f} Hz, ASTM {astm[0]:.0f}-{astm[1]:.0f} Hz")
```

</details>

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>

### 1.1 Dónde pueden ir los micrófonos

El rango de trabajo lo fijan $d$ y $s$; *en qué punto del tubo* se coloca la
pareja es otro conjunto de restricciones, y el apartado 4.3 fija sus dos
extremos.

**Lejos de la fuente.** El altavoz radia modos transversales además de la onda
plana. Por debajo del primer corte se extinguen en unos tres diámetros de tubo,
así que se recomienda que el micrófono más cercano esté al menos a tres
diámetros de la fuente y, en todo caso, nunca a menos de uno: 300 mm y 100 mm
respectivamente en el tubo de 100 mm de la figura de arriba.

**Lejos de la probeta.** La probeta también distorsiona el campo cerca de su
cara, y el mínimo depende de qué aspecto tenga: medio diámetro para una muestra
*no estructurada*, un diámetro para una *semiestructurada lateralmente* y dos
diámetros para una *fuertemente asimétrica*. En un tubo de 100 mm eso son
50 mm, 100 mm y 200 mm, así que el $x_1$ = 150 mm de la figura de arriba es
holgado para una muestra porosa simple, suficiente para una lámina perforada y
demasiado corto para una probeta muy estructurada, como una matriz de
resonadores. Nada de esto se hace cumplir: `reflection_factor` solo rechaza
$x_1 \le 0$, así que un $x_1$ elegido a ojo puede caer dentro del campo cercano
evanescente de una muestra perforada y aun así devolver un espectro de aspecto
perfectamente plausible.

**Con qué exactitud hay que conocer las distancias.** Posiciones fijas de
micrófono a ±0,2 mm o mejor, y las de traslación a ±0,5 mm (apartado 4.5); la
posición del plano de referencia respecto al micrófono 1 declarada a ±0,5 mm
(apartado 7.1); y el diámetro del micrófono por debajo del 20 % de la
separación, y pequeño frente a $c_0/f_\mathrm{u}$, para que la cápsula promedie un trozo
despreciable de la onda (apartado 4.4). El plano de referencia, $x = 0$, es
normalmente la superficie de la probeta, pero una probeta perfilada o
estructurada lateralmente tiene su plano de referencia situado a cierta
distancia *por delante* de ella, y $x_1$ se mide hasta ese plano, no hasta el
portamuestras.

La misma función auxiliar 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 las funciones
`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`.

El tubo completo, muestra incluida, también se puede simular: la sección 5
ejecuta esta misma medición de forma virtual dentro de la simulación FDTD y
recupera la absorción analítica de la muestra modelada a través de la misma
cadena de reducción.

## 2. 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 (escrita $s$ en ISO 10534-1, la misma
letra que la parte 2 usa para la separación de micrófonos de la sección 1; las
dos nunca aparecen en la misma ecuación, y el código las mantiene separadas como
`swr` y `spacing`) se obtiene en forma cerrada junto con la magnitud de
reflexión y la absorción:

$$
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
```

El método de la razón es anterior al analizador FFT y sobrevive porque es
autosuficiente. El aparato es un **micrófono de sonda** sobre un carro
graduado: un tubito que se desliza por el eje, muestreando el campo interior
punto a punto mientras el altavoz mantiene un único tono puro. En cada
frecuencia el operador (o el motor paso a paso) localiza un máximo de presión
y el mínimo adyacente, lee la diferencia de nivel y pasa al siguiente tono.
Lento, pero no hay nada que calibrar contra nada: un solo micrófono mide los
dos niveles, así que su sensibilidad se cancela exactamente, y no hay
desajuste de fase entre canales porque solo hay un canal. Por eso el método
de onda estacionaria sigue siendo el método de arbitraje cuando dos tubos de
función de transferencia discrepan.

Las formas cerradas de arriba usan solo la *diferencia* de nivel; las
*posiciones* de los mínimos llevan el resto de la información. Con $x$ medido
desde la cara de la muestra hacia la fuente, el campo interior de una onda
con factor de reflexión $r = |r|\,e^{j\Phi}$ es

$$
p(x) = A\left(e^{jkx} + |r|\,e^{j\Phi}e^{-jkx}\right), \qquad
|p|^2 = A^2\left(1 + |r|^2 + 2|r|\cos(2kx - \Phi)\right),
$$

de modo que los mínimos de presión caen donde el coseno vale $-1$, en

$$
2k\,x_{\min,n} - \Phi = (2n - 1)\,\pi, \qquad
\Phi = \frac{4\pi\,x_{\min,1}}{\lambda} - \pi ,
$$

con $x_{\min,1}$ el mínimo más próximo a la muestra. Un mínimo a un cuarto de
longitud de onda de la cara significa $\Phi = 0$ (una muestra con respaldo
rígido en resonancia); un mínimo justo en la cara significa $\Phi = -\pi$
(una pared rígida). El módulo de la razón, la fase de la posición: juntos dan
el mismo $r$ complejo, y por tanto la misma impedancia normalizada
$Z/\rho c_0 = (1+r)/(1-r)$, que el método de la función de transferencia de
la sección 3 calcula de una vez a partir de $H_{12}$.

*Lo que recorre de verdad el carro, dibujado como el nivel que muestra el
analizador a 500 Hz en un tubo de 100 mm. La pared rígida ($|r| = 1$) tiene sus
mínimos en presión nula y el primero en la cara, $\Phi = -\pi$; la muestra
resuelta ($|r| = 0{,}5$) da $\Delta L$ = 9,54 dB entre el máximo y el mínimo
adyacente, con el primero en $x_{\min,1}$ = 12 cm, y la regla del cuarto de
longitud de onda convierte esa distancia en $\Phi = -54{,}1°$; el caso casi
anecoico ($|r| = 0{,}1$) modula solo 1,74 dB, que es la razón de que el método
pierda precisión justo donde un absorbente es bueno. La curva punteada es la
misma muestra de $|r| = 0{,}5$ con la atenuación de tubo de la Ec. (A.18):
cuanto más lejos de la cara, más se ha atenuado la onda reflejada, así que los
valles se rellenan; los tres primeros mínimos leen −5,99, −5,92 y −5,85 dB. Esa
deriva es pequeña aquí porque la Ec. (A.18) es una cota inferior; la
extrapolación aproximada de ISO 10534-1 (Anexo A.2.1.4) se ofrece mientras la
diferencia entre el primer y el segundo mínimo se mantenga por debajo de 2 dB,
y por encima de eso la atenuación hay que medirla con el tubo vacío. En
cualquier caso, es la razón de que el operador lea el mínimo *más próximo* a la
muestra.*

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

```python
# El campo interior de la sección 2, para tres factores de reflexión.
c0 = 343.2
x = np.linspace(0.0, 1.0, 800)
k = 2 * np.pi * 500.0 / c0
for magnitude, phi in ((1.0, -np.pi), (0.5, np.radians(-54.1)), (0.1, 0.0)):
    envelope = np.sqrt(1 + magnitude**2 + 2 * magnitude * np.cos(2 * k * x - phi))
    print(round(float(envelope.min()), 3), round(float(envelope.max()), 3))

# La variante atenuada usa la constante de cota inferior de la Ec. (A.18).
print(round(float(materials.tube_attenuation_constant(500.0, c0, 0.10)), 4))
```

</details>

El módulo y la posición son las dos mitades de la lectura, y la biblioteca las
toma juntas: `standing_wave_reflection(swr, x_min1, wavelength)` devuelve la $r$
compleja (Ecs. (17)-(23)) y `standing_wave_normalized_impedance`, la relación
$Z/\rho c_0$ (Ecs. (24)-(26)). Las dos aceptan arrays, así que un recorrido con
motor paso a paso que registre $(\Delta L, x_{\min,1})$ por tono se reduce a dos
llamadas:

```python

from phonometry import materials

# Un recorrido de tres tonos: la diferencia de nivel y la distancia del primer
# mínimo leídas en cada frecuencia, que es todo lo que produce el método.
f = np.array([500.0, 1000.0, 2000.0])
c0 = 343.2
level_difference = np.array([9.542, 6.021, 3.522])   # L_max - L_min [dB]
x_min1 = np.array([0.120, 0.061, 0.030])             # primer mínimo [m]

swr = materials.standing_wave_ratio_from_level(level_difference)
lam = c0 / f
r = materials.standing_wave_reflection(swr, x_min1, lam)
z = materials.standing_wave_normalized_impedance(swr, x_min1, lam)
print(np.round(np.abs(r), 2))                  # [0.5  0.33 0.2 ]
print(np.round(np.degrees(np.angle(r)), 1))    # [-54.1 -52.  -54.1]
print(np.round(z, 2))                          # Z / rho c0
```

Dos cautelas prácticas del propio texto de la norma. Los mínimos lejos de la
muestra son menos profundos de lo que dice la teoría de arriba, porque las
ondas viajeras se atenúan a lo largo del tubo (pérdidas viscosas y térmicas
en la pared); ISO 10534-1 hace que el operador lea el mínimo **más próximo**
a la muestra y, para trabajo de precisión, extrapole los niveles de los
mínimos hasta la cara de la muestra. Y el método se apoya en la pureza del
tono: cualquier distorsión armónica de un altavoz muy exigido pone energía en
frecuencias cuyos mínimos caen en otro sitio, rellenando en parte el valle
que se está midiendo, así que el analizador debe ser de banda estrecha en
torno a la frecuencia de excitación y no un sonómetro de banda ancha.

## 3. 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_\mathrm{I}}{H_\mathrm{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_\mathrm{I} = e^{-j k_0 s}$, $H_\mathrm{R} = e^{+j k_0 s}$, la separación de micrófonos $s$
(otra vez el sentido que la letra tiene en la parte 2) y $x_1$ la distancia del
plano de referencia al micrófono más lejano.

**Qué cuesta un error en $x_1$, y qué no.** $x_1$ entra solo a través de
$e^{\,2 j k_0 x_1}$, una rotación de fase pura. Deja por tanto $|r|$, y con él
el espectro de absorción, completamente intacto, mientras rota las partes real
e imaginaria de la impedancia superficial. A 1,5 kHz en aire, un error de 2 mm
en $x_1$ rota la fase de reflexión unos 6°, suficiente para mover de forma
apreciable una resistividad al flujo ajustada a partir de esa impedancia. Las
consecuencias prácticas son dos: medir $x_1$ hasta el *plano de referencia* (la
cara de la probeta, o el plano por delante de una probeta perfilada) y no hasta
el portamuestras, porque una probeta que no queda donde debía se lleva $x_1$
consigo; y leer un $\alpha$ de aspecto sano junto a una impedancia inverosímil
(una parte real negativa, por ejemplo) como un fallo de $x_1$ o de desajuste, y
no como un resultado del material.

```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]
print(np.round(materials.normalized_surface_admittance(r), 2))  # su recíproca,
# [0.41+0.43j 0.41+0.43j 0.41+0.43j]     lo que pide una condición de impedancia
```

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. Su `.plot()`
dibuja el espectro de absorción $\alpha(f)$ con el módulo del factor de
reflexión $|r|$ superpuesto, y `normalized_surface_admittance(r)` da la magnitud
recíproca que consume una condición de contorno de reacción local: una pared
FDTD o BEM, o la propia simulación de la biblioteca.

### 3.1 Corregir el desajuste entre canales (apartado 7.5)

Un canal es un micrófono más su preamplificador más su entrada de analizador, y
no hay dos iguales. El apartado 7.5 de ISO 10534-2 no recomienda corregir eso:
lo **exige**, «se debe utilizar uno de los procedimientos siguientes». El Anexo
E.1.2 es aún más tajante (con dos micrófonos, el desajuste de fase «es
inevitable y se debe compensar»), y E.1.3 añade que las amplitudes deberían
estar de entrada dentro de 0,3 dB una de otra. La corrección es una división
compleja que se aplica justo donde $|r|$ es pequeño y la fase de $H_{12}$ lleva
toda la respuesta, y por eso el síntoma de saltársela es un vagabundeo
dependiente de la frecuencia y no un desplazamiento constante: el fragmento de
abajo deja sin corregir un desajuste de 0,5 dB / 1° sobre una probeta cuya
absorción verdadera es 0,75 y obtiene 0,73, 0,78 y 0,72 en tres bandas
contiguas. Sobre un absorbente casi perfecto, ese mismo desajuste empuja el
espectro contra el techo de $\alpha = 1$, que es de donde sale la firma clásica
del tubo sin corregir: una absorción justo por encima de 1 o justo por debajo
de 0.

Los dos procedimientos permitidos usan la misma medición, hecha dos veces:

1. Colocar una probeta absorbente en el tubo y medir $H_{12}^{I}$ en la
   configuración estándar.
2. **Intercambiar físicamente los dos cartuchos de micrófono**, de modo que A
   ocupe la posición exacta que ocupaba B y viceversa, *sin* mover los cables
   del preamplificador ni del analizador. Medir $H_{12}^{II}$.
3. Formar $H_\mathrm{c} = \sqrt{H_{12}^{I}/H_{12}^{II}}$ (Ec. (10)) y dividir por él la
   función de transferencia de trabajo.

La diferencia entre los dos procedimientos es solo con qué frecuencia se hace el
paso 2. El apartado 7.5.1 repite el intercambio para *cada* probeta, lo que
conviene con pocas muestras; el apartado 7.5.2 determina $H_\mathrm{c}$ una vez contra
una probeta de calibración y lo conserva para toda la serie, lo que conviene en
una tirada de producción, tras lo cual los micrófonos deben quedarse donde
están. La técnica de un solo micrófono del Anexo B no necesita corrección
alguna, porque solo hay un canal: lo paga con tiempo de medición, y es el mismo
argumento que hace del método de onda estacionaria de la sección 2 el método de
arbitraje.

```python
# Una pareja de canales desajustada en 0,5 dB y 1 grado, y su eliminación. Las
# dos configuraciones difieren exactamente en ese factor, que es lo que
# recupera la Ec. (10).
mismatch = 10 ** (0.5 / 20) * np.exp(1j * np.radians(1.0))
h12_i = h12 * mismatch            # configuración estándar
h12_ii = h12 / mismatch           # micrófonos intercambiados físicamente

hc = materials.mic_calibration_factor(h12_i, h12_ii)
print(round(float(np.abs(hc[0])), 4), round(float(np.degrees(np.angle(hc[0]))), 2))
# 1.0593 1.0 -- el propio desajuste, recuperado
h12_corrected = materials.apply_mic_calibration(h12_i, hc)
print(float(np.abs(h12_corrected - h12).max()) < 1e-12)   # True

# Lo que habrían afirmado los datos sin corregir, sobre una muestra de alpha = 0.75:
bad = materials.reflection_factor(h12_i, spacing=spacing, x1=x1, wavenumber=k0)
print(np.round(materials.absorption_from_reflection(bad), 3))   # [0.732 0.775 0.718]
```

### 3.2 El resto del instrumento

La cadena de reducción de arriba son unas pocas líneas; las condiciones que
hacen fiables sus entradas son la mayor parte de ISO 10534-2. En el orden en que
importan:

- **El aire, medido y no supuesto (apartado 7.2).** $c_0$ y $\rho c_0$ no son
  constantes del método, son lecturas. La temperatura del aire del tubo debe
  medirse y mantenerse a ±1 K con un transductor exacto a ±0,5 K, y la presión
  atmosférica a ±0,5 kPa (apartado 4.12); la Ec. (5) convierte la primera en
  $c_0$ y la Ec. (7) la pareja en $\rho$. La biblioteca expone las dos:
  `speed_of_sound_iso(temperature)` toma kelvin, y
  `air_density_iso(temperature, atmospheric_pressure)` toma kelvin y
  kilopascales; el fragmento de la ficha de abajo las alimenta directamente a
  `two_microphone_impedance` en lugar de usar literales. Ojo: las funciones
  auxiliares de ASTM E2611 de la sección 4 toman grados Celsius, y las dos no
  son intercambiables.
- **Excitación (apartados 4.10 y 7.3).** Una señal estacionaria con densidad
  espectral plana en el rango de interés: aleatoria, pseudoaleatoria,
  pseudoaleatoria periódica o chirp. El nivel debe quedar al menos 10 dB por
  encima del fondo en *todas* las frecuencias de interés, y toda frecuencia cuya
  respuesta esté 60 dB por debajo del máximo se rechaza sin más. El número de
  promedios espectrales sale de la exactitud que se quiera en $H_{12}$; un
  producto ancho de banda por tiempo de 50 a 100 es el objetivo habitual
  (Anexo E.2), y el registro debe ser mucho más largo que $2x_1/c_0$ o el
  solapamiento temporal lo corrompe (Ec. (E.1)).
- **Calentamiento (apartado 5).** Al menos 10 minutos de altavoz en marcha antes
  de la primera medición, para que la temperatura del aire del tubo haya dejado
  de derivar.
- **El extremo de fuente (apartados 4.9 y 4.11).** La membrana del altavoz cubre
  al menos dos tercios de la sección del tubo, va en una caja aislante frente a
  la transmisión aérea por flancos hacia los micrófonos, y está aislada
  elásticamente del tubo: la excitación estructural de la pared del tubo es una
  imitación clásica de la absorción. Al menos 200 mm de revestimiento absorbente
  eficaz cerca del altavoz amortiguan las resonancias de la columna de aire.
- **El extremo de la probeta (apartado 4.7).** La placa trasera es rígida y está
  firmemente fijada, y se recomienda una placa metálica de al menos 20 mm,
  porque es la terminación rígida sobre la que descansan la mayoría de las
  mediciones. Un portamuestras independiente debe ajustar al diámetro del tubo
  con ±0,2 % y sellarse con vaselina en vez de con una junta elástica.
- **El analizador (apartado 4.8).** Más de 65 dB de rango dinámico, y errores de
  función de transferencia por no linealidad, resolución, inestabilidad y
  temperatura por debajo de 0,2 dB.

Todo lo que el informe de ISO 10534-2 necesita sobre la geometría ya está en el
bloque de metadatos de la ficha (diámetro y forma del tubo, separación de
micrófonos, montaje, temperatura y presión), de modo que ese bloque se lee como
una lista de comprobación del informe y no como decoración.

**La atenuación del tubo, y cuándo activarla.** La onda plana del tubo no está
libre de pérdidas: las capas límite viscosa y térmica de la pared atenúan la
onda incidente y la reflejada a lo largo de la distancia $x_1$, y una atenuación
que no se contabiliza se lee como absorción de la muestra.
`tube_attenuation_constant` es la estimación de la Ec. (A.18),
$k_0'' = 1{,}94\times10^{-2}\sqrt{f}/(c_0 d)$, y su escalado dice dónde importa:
crece como $\sqrt{f}$ y cae como $1/d$, así que un tubo de 29 mm sufre unas tres
veces y media la pérdida de uno de 100 mm a la misma frecuencia, y acercar la
pareja de micrófonos a la probeta la reduce directamente. Importa sobre todo con
un absorbente casi perfecto, donde la onda reflejada ya es débil. Vienen con ella
dos cautelas. El apartado A.2.1.5 dice sin rodeos que esta estimación ignora las
paredes porosas o sucias y cualquier objeto dentro del tubo, así que es un
**límite inferior**: una discrepancia grande es señal de limpiar o volver a
cualificar el tubo, no un número del que fiarse. Y la norma prefiere la vía
medida: determinar la atenuación con el tubo vacío en frecuencias medias y altas
(Ecs. (A.13)/(A.14), tras cada modificación del tubo) y extrapolar hacia abajo.

*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_\mathrm{s}$ /
$\alpha_\mathrm{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 y, para la
figura que incrusta la ficha, 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 decimal).

El bloque de abajo es la probeta de la ficha que va debajo: una capa resistiva
de resistencia al flujo normalizada $\theta = 1$ sobre una cavidad de aire de
86 mm con respaldo rígido, cuya impedancia superficial
$z = \theta - \mathrm{j}\cot(k_0 L)$ se conoce en forma cerrada, así que el
$\alpha$ impreso se puede comprobar a mano: 1,00 en la resonancia de cuarto de
onda de 1 kHz, donde la lámina adaptada da $z = 1$ y $r = 0$; 0,80 a 500 Hz,
donde $k_0 L = \pi/4$ y $z = 1 - \mathrm{j}$.

```python

from phonometry import materials, ReportMetadata

# Tubo de 100 mm, s = 50 mm, micrófono lejano en x1 = 100 mm, 20 degC / 101 kPa.
c0 = float(materials.speed_of_sound_iso(293.15))                    # 343.29 m/s
rho_c = materials.characteristic_impedance(
    float(materials.air_density_iso(293.15, 101.0)), c0)            # 405.6 Pa.s/m
diameter, spacing, x1 = 0.100, 0.050, 0.100
theta, cavity = 1.0, c0 / (4.0 * 1000.0)     # cuarto de onda a 1 kHz: 86 mm
freqs = np.array([400, 500, 630, 800, 1000, 1250, 1600], dtype=float)

# La función de transferencia que mediría el tubo, sintetizada desde la r conocida.
k0 = materials.tube_wavenumber(freqs, c0)
z = theta - 1j / np.tan(2 * np.pi * freqs / c0 * cavity)
r_known = (z - 1.0) / (z + 1.0)
x2 = x1 - spacing
h12_fiche = (np.exp(1j*k0*x2) + r_known*np.exp(-1j*k0*x2)) / \
            (np.exp(1j*k0*x1) + r_known*np.exp(-1j*k0*x1))

fiche = materials.two_microphone_impedance(
    h12_fiche, frequency=freqs, spacing=spacing, x1=x1,
    speed_of_sound=c0, characteristic_impedance=rho_c, diameter=diameter,
)
print(np.round(fiche.absorption, 2))    # [0.68 0.8  0.9  0.97 1.   0.96 0.68]

fiche.report(
    "alpha_fiche.pdf",
    metadata=ReportMetadata(
        specimen="Capa resistiva sobre cavidad de aire de 86 mm con respaldo rígido",
        tube_diameter=diameter,        # m (se imprime como 100 mm)
        mic_spacing=spacing,           # m (se imprime como 50 mm)
        measurement_standard="ISO 10534-2",
        laboratory="Laboratorio de referencia Phonometry",
    ),
)                  # alpha e impedancia a incidencia normal en la banda del tubo
```

## 4. 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|.
$$

**Qué es una «carga», y por qué hay dos.** Una carga es una terminación aguas
abajo. La matriz tiene cuatro incógnitas, y una medición de las cuatro funciones
de transferencia de micrófono aporta solo dos ecuaciones independientes, así que
el método general cambia la terminación y repite la medición completa: el
apartado 8.5.4.1 de E2611 resuelve los dos conjuntos a la vez (Ec. (22)). En la
práctica el tubo termina en una terminación débilmente anecoica (una cuña o
pirámide de lana de vidrio de unos 30 cm), y el apartado 6.2.8 pide que sea
*fácilmente extraíble* precisamente para que un extremo abierto o cerrado pueda
aportar la segunda carga. Las cuatro funciones de transferencia de cada carga se
refieren a un mismo canal común, y cada una de ellas lleva la misma corrección
de desajuste por configuración conmutada de la sección 3 (apartado 8.5.3): el
método de cuatro micrófonos no se libra de ese requisito, lo multiplica. El
extremo de fuente va sellado y aislado del tubo (apartado 6.4.2), igual que en
la parte 2.

**El método de una carga no es el método general con menos pasos.** El
apartado 8.5.4.2 cierra el sistema, en cambio, *suponiendo* que la probeta es
geométricamente simétrica, «que presenta las mismas propiedades físicas al campo
sonoro por ambos lados», de modo que la reciprocidad da $T_{11} = T_{22}$ y
$T_{11}T_{22} - T_{12}T_{21} = 1$ (Ec. (23)), y basta con una terminación,
preferiblemente la anecoica. Eso vale para una capa homogénea y falla en
cualquier composición asimétrica: una lámina por una cara, una densidad en
gradiente, una membrana montada, un apilado de capas desiguales, que es la mayor
parte de lo que la gente mete de verdad en un tubo de transmisión.
`transfer_matrix_one_load` no detecta la asimetría, ni puede: avisa del rango de
onda plana y de un denominador mal condicionado, y por lo demás devuelve una
matriz plausible y equivocada, y con ella una pérdida por transmisión
equivocada. La regla es sencilla: si la probeta tiene un delante y un detrás,
usa dos cargas. Si crees que es simétrica, ejecuta los dos métodos y
compara. Nada de esto afecta a la vía de absorción con respaldo rígido de la
sección 3, que solo necesita la impedancia superficial.

A escala tiene este aspecto. Una `TransferMatrix` recuperada por los
métodos 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 esas reducciones 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
[modelo multicapa](/phonometry/es/materials/absorbers/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)).*

**Un TL de tubo no es un índice de reducción sonora.** La ficha de la sección 3
avisa de que el $\alpha$ a incidencia normal no es el $\alpha_\mathrm{s}$ a incidencia
aleatoria; el mismo aviso vale del lado de la transmisión, y ahí se pasa por
alto más a menudo. Lo que mide el tubo es la pérdida por transmisión de una
probeta de unos pocos centímetros, para una onda plana a un ángulo, con los
bordes de la probeta empotrados por la pared del tubo. Lo que es el
[índice de reducción sonora $R$](/phonometry/es/buildings/insulation/insulation-lab/)
es una magnitud de campo difuso medida sobre un elemento a tamaño real con su
montaje real, y lleva consigo las ondas de flexión del propio elemento, sus
condiciones de borde y su caída de aislamiento en la coincidencia, nada de lo cual existe dentro
de un tubo. Espera que el valor a incidencia normal quede *por encima* de una
estimación a incidencia de campo para una capa gobernada por la masa, y espera
que el tubo se pierda por completo los valles de resonancia y de coincidencia de
un panel real. Usa el TL de tubo para comparar materiales y para ajustar y
verificar un modelo de matriz de transferencia; predice después la construcción
con el modelo, o con
[EN 12354](/phonometry/es/buildings/design/insulation-prediction/), y nunca
llevando el número del tubo a un cálculo de partición.

<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.
  Corta con ajuste deslizante ceñido y sella 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. Corta
  con herramienta afilada; no rasgues 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. Mide varios cortes y promedia; la
  dispersión entre probetas es varianza del producto que merece declararse,
  no ruido de medida que esconder.

## 5. El tubo virtual: la simulación medida por las normas

Un dominio de tres filas con paredes rígidas del
[simulación FDTD 2D](/phonometry/es/simulation/fdtd-simulation/) es un tubo de onda
plana, y con el mapa de `damping` por celda una muestra porosa se convierte
en un fluido equivalente (mapas de densidad, velocidad y pérdidas). Eso cierra un
círculo notable: las historias de las sondas FDTD pueden reducirse con las
propias cadenas ISO 10534-2 y ASTM E2611 de la biblioteca como si fueran
medidas, y los espectros recuperados coinciden con la respuesta analítica
exacta de la misma capa con pérdidas dentro de 0,035 en absorción y 0,1 dB
en pérdida de transmisión (las comprobaciones cruzadas de `tests/simulation` lo
ejecutan en cada commit).

```python

from phonometry.materials import two_microphone_impedance
from phonometry.simulation import FDTD2D

c0, rho0, dx = 343.0, 1.2, 0.005
nx, d_cells = 280, 20                     # tubo de 1,4 m, muestra de 10 cm
c = np.full((3, nx), c0); rho = np.full((3, nx), rho0)
sigma = np.zeros((3, nx))
c[:, -d_cells:] = 0.6 * c0                # la muestra: más lenta,
rho[:, -d_cells:] = 3.0 * rho0            # más densa y con pérdidas
sigma[:, -d_cells:] = 600.0
sim = FDTD2D(c, dx, rho=rho, damping=sigma,
             edge_impedance={"left": rho0 * c0})   # extremo fuente anecoico
sim.add_plane_wave("right", center=0.35, width=0.05)
mics = (219, 229)                         # la pareja de micrófonos ISO
records = np.zeros((2, 9000))
for n in range(records.shape[1]):
    sim.step()
    records[:, n] = sim.p[1, mics]
spec = np.fft.rfft(records, axis=1)
freqs = np.fft.rfftfreq(records.shape[1], sim.dt)
band = (freqs > 300.0) & (freqs < 1200.0)
result = two_microphone_impedance(
    spec[1, band] / spec[0, band], frequency=freqs[band],
    spacing=0.05, x1=(nx - d_cells) * dx - (mics[0] + 0.5) * dx,
    speed_of_sound=c0, characteristic_impedance=rho0 * c0)
result.plot(language="es")   # la absorción que "midió" el tubo virtual
```

Los dos clips de abajo ejecutan exactamente este experimento. En el tubo de
impedancia un tono plano sostenido construye la onda estacionaria que leen
los dos micrófonos: contra el extremo rígido los mínimos son profundos,
delante de la muestra quedan someros. En el tubo de transmisión un paquete
con portadora cruza un conducto anecoico: el tubo vacío lo deja pasar
intacto, la capa con pérdidas lo divide en una reflexión y una transmisión
atenuada que resuelven los cuatro micrófonos ASTM.

## Qué cubre esta guía

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`,
`standing_wave_reflection_magnitude`, `standing_wave_absorption`, y la mitad
de posición de la lectura en `standing_wave_reflection` y
`standing_wave_normalized_impedance`). El método de la función de
transferencia de ISO 10534-2 con su comprobación de rango de frecuencias del
apartado 4 (`two_microphone_impedance`, `plane_wave_frequency_range`,
`reflection_factor`, `absorption_from_reflection`,
`normalized_surface_impedance`, `normalized_surface_admittance`, las
propiedades del aire del apartado 7.2 `speed_of_sound_iso` y
`air_density_iso`, la pareja de desajuste del apartado 7.5
`mic_calibration_factor` y `apply_mic_calibration`, y
`tube_attenuation_constant`). El método de matriz de transferencia con cuatro
micrófonos de ASTM E2611 (`transfer_matrix_two_load`,
`transfer_matrix_one_load`, `TransferMatrix`,
`plane_wave_frequency_range_astm`, `hydraulic_diameter`), con los dibujos a
escala de ambos tubos. Los tubos FDTD virtuales de la sección 5, cuyos
espectros recuperados se contrastan con la respuesta analítica en cada commit.

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; sus refinamientos de sonda (extrapolar los
niveles de los mínimos hasta la cara de la muestra, correcciones por el cuerpo
de la sonda) se describen en la sección 2 pero no están automatizados. Tampoco
lo están los apartados de equipo y procedimiento de las secciones 1.1 y 3.2:
las distancias de campo cercano del apartado 4.3, las tolerancias de posición
del apartado 4.5, el suelo de relación señal-ruido del apartado 7.3 y el
calentamiento del apartado 5 se enuncian para el operador, y nada de la
biblioteca comprueba que se haya cumplido ninguno de ellos.
`tube_attenuation_constant` implementa solo la estimación de la Ec. (A.18),
que la propia norma llama límite inferior; la determinación medida de las Ecs.
(A.13)/(A.14) con el tubo vacío no está implementada. El $\alpha_\mathrm{s}$ de
incidencia aleatoria de la cámara reverberante es otra magnitud con su propia
guía: [Medida y clasificación de la absorción
sonora](/phonometry/es/materials/absorbers/absorption-measurement/).

## Véase también

- [Medida y clasificación de la absorción sonora](/phonometry/es/materials/absorbers/absorption-measurement/):
  el coeficiente de incidencia aleatoria de la cámara reverberante, su
  valoración ISO 11654 y cuándo el tubo o la cámara es el instrumento
  adecuado.
- [Resistencia al flujo de aire](/phonometry/es/materials/absorbers/airflow-resistance/):
  la resistividad al flujo de ISO 9053 que ancla los modelos contra los que
  se ajusta una medida de tubo.
- [Absorbentes porosos y multicapa](/phonometry/es/materials/absorbers/porous-absorbers/):
  los modelos de fluido equivalente y el modelo multicapa cuya matriz de
  cadena se lee con la misma maquinaria ASTM E2611 que una probeta medida.
- [Simulación FDTD](/phonometry/es/simulation/fdtd-simulation/): el esquema 2D
  detrás de los tubos virtuales de la sección 5.
- [Calibración](/phonometry/es/signals/metrology/calibration/): la calibración de
  micrófonos previa a la función de transferencia con dos micrófonos.
- Referencia de la API: [`materials.absorbers.impedance_tube`](/phonometry/es/reference/api/materials/impedance-tube/).
- 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): la derivación por función de transferencia de ISO 10534-2 y la extensión con cuatro micrófonos de ASTM E2611.
