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

Tres medidas pasivas dominan el control de ruido aplicado: los **silenciadores**
en un conducto, las atenuaciones pasivas y el ruido autogenerado de una
instalación **HVAC**, y el **cerramiento de máquina**. `phonometry.noise_control`
cubre las tres con la teoría de ingeniería de Bies, Hansen y Howard. Los
silenciadores se construyen sobre el método unidimensional de cuatro polos
(matrices de transferencia), que encadena elementos acústicos reutilizables; los
métodos HVAC son las tablas ASHRAE y las formas cerradas de codos, reflexión de
extremo, plenums y ruido de flujo; y el modelo de cerramiento combina una pérdida
de transmisión del panel aportada por el usuario con la acumulación reverberante
en el interior. El [pistón](/phonometry/es/guides/electroacoustics/) radiante del
dominio de electroacústica es el modelo de radiador complementario.

## 1. Silenciadores reactivos (método de cuatro polos)

Un silenciador reactivo atenúa *reflejando* el sonido con discontinuidades de
impedancia. Cada elemento acústico es una matriz de transferencia 2x2 que
relaciona la presión `p` y la velocidad de volumen `Su` en sus dos extremos, y un
silenciador compuesto es el producto ordenado de las matrices de sus elementos
(Bies §8.9). Un conducto recto de longitud `L` y área `S` es

$$
\begin{bmatrix} \cos kL & j\,\tfrac{\rho c}{S}\sin kL \\[2pt]
j\,\tfrac{S}{\rho c}\sin kL & \cos kL \end{bmatrix},
\qquad k = \omega/c,
$$

y una rama lateral de impedancia $Z_b$ es la derivación
$\left[\begin{smallmatrix} 1 & 0 \\ 1/Z_b & 1 \end{smallmatrix}\right]$. La
**pérdida de transmisión** se obtiene de la matriz compuesta $T$ con las
impedancias de los puertos $Z_1 = \rho c/S_\text{in}$ y $Z_n = \rho c/S_\text{out}$
(Munjal Ec. (3.27); Bies Ec. (8.141) imprime invertidos los pesos de impedancia
de $T_{11}$ y $T_{22}$ de esta fórmula y no cumple el límite de expansión
brusca, véase el
[registro de erratas](https://github.com/jmrplens/phonometry/blob/main/docs/ERRATA.md))

$$
\mathrm{TL} = 10\log_{10}\!\left[\frac{Z_n}{Z_1}\,\tfrac{1}{4}\left|\,T_{11}
+ \tfrac{T_{12}}{Z_n} + Z_1\,T_{21} + \tfrac{Z_1}{Z_n}\,T_{22}\right|^2\right],
$$

que para áreas de entrada y salida iguales $S$ se reduce a (Bies Ec. (8.148))

$$
\mathrm{TL} = 20\log_{10}\!\left(\tfrac{1}{2}\left|\,T_{11}
+ \tfrac{T_{12}}{Z_c} + Z_c\,T_{21} + T_{22}\right|\right),
\qquad Z_c = \frac{\rho c}{S},
$$

y la **pérdida de inserción** para una impedancia de fuente $Z_s$ y una de
radiación $Z_r$ es la atenuación adicional frente a una conexión directa.

### Cámara de expansión

El silenciador más simple, una cámara de área $S_\text{exp}$ y longitud $L$ entre
tubos de área $S_\text{duct}$, tiene la pérdida de transmisión en forma cerrada
(Bies Ec. (8.111)) con la relación de áreas $m = S_\text{exp}/S_\text{duct}$

$$
\mathrm{TL} = 10\log_{10}\!\left[1 + \tfrac{1}{4}\left(m - \tfrac{1}{m}\right)^2
\sin^2 kL\right],
$$

con máximos en $10\log_{10}[1 + \tfrac14(m-1/m)^2]$ cuando $kL = \pi/2, 3\pi/2, \dots$
y caídas a $0$ en $kL = n\pi$, donde la cámara mide media longitud de onda y es
transparente. El producto de cuatro polos lo reproduce exactamente.

```python

from phonometry import expansion_chamber

freqs = np.linspace(20.0, 2000.0, 2000)
res = expansion_chamber(freqs, length=0.3, chamber_area=0.04, pipe_area=0.01)
print(round(res.transmission_loss.max(), 2))   # máximo 6.55 dB (m = 4)
# Las caídas en f = n c / 2L son exactamente 0 dB (sin disipación).
print(round(float(res.transmission_loss[np.argmin(res.transmission_loss)]), 6))
```

La línea única `res.plot()` dibuja la pérdida de transmisión de la cámara (y
su pérdida de inserción cuando se dan las impedancias de fuente y radiación).
La figura de abajo barre en cambio la relación de áreas: un desajuste $m$ mayor
eleva todos los máximos, pero las caídas permanecen en 0 dB y los máximos
permanecen en las mismas frecuencias, fijadas solo por la longitud de la
cámara.

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

```python

from phonometry import expansion_chamber

freqs = np.linspace(20.0, 2000.0, 2000)

# Una línea para una cámara: TL vs frecuencia (con la pérdida de inserción si
# se dan las impedancias de fuente y radiación).
expansion_chamber(freqs, 0.3, 0.04, 0.01,
                  source_impedance=4e4, radiation_impedance=5e3).plot(language="es")
plt.show()

# A mano: la familia de relaciones de áreas de la figura de concepto.
fig, ax = plt.subplots()
for m in (2.0, 4.0, 8.0, 16.0):
    res = expansion_chamber(freqs, 0.3, m * 0.01, 0.01)
    ax.plot(freqs, res.transmission_loss, label=f"m = {int(m)}")
ax.set_xlabel("Frecuencia [Hz]"); ax.set_ylabel("Pérdida de transmisión [dB]")
ax.legend()
plt.show()
```

</details>

### Resonadores laterales y de tubo extendido

Un **resonador de Helmholtz** (área de cuello $S_n$, longitud efectiva $l_e$,
volumen de cavidad $V$) y un **tubo de cuarto de onda** cerrado (longitud $l_e$)
cortocircuitan el conducto en su frecuencia de sintonía, dando un pico agudo de
pérdida de transmisión: $f_0 = \tfrac{c}{2\pi}\sqrt{S_n/(l_e V)}$ (Bies Ec. (8.46))
y $f = c/4l_e$ (Ec. (8.44)). Una **cámara de tubo extendido** aloja ramas de
cuarto de onda dentro de una cámara de expansión para rellenar sus caídas.

```python

from phonometry import (
    helmholtz_resonator, quarter_wave_resonator, extended_tube_chamber,
)

f = np.linspace(20.0, 600.0, 4000)

hr = helmholtz_resonator(f, duct_area=0.01, neck_area=1e-4,
                         neck_length=0.02, cavity_volume=1e-3)
print(round(float(hr.resonances[0]), 1))       # frecuencia de sintonía, Hz
hr.plot()   # pico de TL en la frecuencia de sintonía (necesita matplotlib)

qw = quarter_wave_resonator(f, duct_area=0.01, length=1.516, branch_area=2e-3,
                            speed_of_sound=343.24)
print(round(float(qw.resonances[0]), 1))        # 56.6 Hz (Bies Ejemplo 8.1)

# Una extensión de entrada de L/4 rellena la primera caída de la cámara.
et = extended_tube_chamber(f, length=0.4, chamber_area=0.04, pipe_area=0.01,
                           inlet_extension=0.1)
```

*Cada rama lateral cortocircuita el conducto en su propia frecuencia de
sintonía y es casi transparente en el resto: el pico estrecho es la razón de
que los resonadores se sintonicen a una frecuencia de encendido o al tono de
paso de álabes de un ventilador en lugar de usarse en banda ancha.*

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

```python

from phonometry import helmholtz_resonator, quarter_wave_resonator

f = np.linspace(20.0, 600.0, 4000)
hr = helmholtz_resonator(f, duct_area=0.01, neck_area=1e-4,
                         neck_length=0.02, cavity_volume=1e-3)
qw = quarter_wave_resonator(f, duct_area=0.01, length=0.3, branch_area=2e-3)

# Una línea para un dispositivo: TL vs frecuencia con la resonancia marcada.
hr.plot(language="es")
plt.show()

# A mano: las dos ramas laterales en los mismos ejes.
fig, ax = plt.subplots()
ax.plot(f, hr.transmission_loss, label="Resonador de Helmholtz")
ax.plot(f, qw.transmission_loss, "--", label="Tubo de cuarto de onda")
for fr in (hr.resonances[0], qw.resonances[0]):
    ax.axvline(float(fr), ls=":", color="#2ca02c")
ax.set_xlabel("Frecuencia [Hz]"); ax.set_ylabel("Pérdida de transmisión [dB]")
ax.set_ylim(0.0, 50.0)
ax.legend()
plt.show()
```

</details>

Cada uno devuelve un `ReactiveSilencerResult` con `transmission_loss`,
`insertion_loss` (cuando se dan las impedancias), la matriz compuesta
`transfer_matrix` y `.plot()`. Las configuraciones avanzadas encadenan elementos
directamente con `duct_matrix`, `shunt_matrix`, `cascade`, `transmission_loss` e
`insertion_loss`.

## 2. Atenuación y ruido de flujo en conductos HVAC

Una instalación de ventilación atenúa el ruido del ventilador en los codos, en
el extremo abierto del conducto y en los plenums, y regenera ruido allí donde el
flujo se perturba. `phonometry.noise_control.hvac` reúne los métodos del
Capítulo 8 de Bies.

```python
from phonometry.noise_control import hvac

bands = [63.0, 125.0, 250.0, 500.0, 1000.0, 2000.0]

# Reflexión de baja frecuencia en el extremo abierto (ASHRAE Tabla 8.14).
er = hvac.end_reflection_loss(bands, diameter=0.30, termination="flush")

# Pérdida de inserción de un codo cuadrado a 90 grados con revestimiento (Tabla 8.11).
el = hvac.elbow_insertion_loss(bands, width=0.3, bend_type="square", lined=True)
er.plot()   # la atenuación por banda (o la Lw regenerada) en una línea (necesita matplotlib)

# TL de plenum por el método de Wells (forma cerrada).
tl = hvac.plenum_attenuation(exit_area=0.1, line_of_sight=1.0,
                             wall_area=20.0, mean_absorption=0.2)
print(round(tl, 1))                              # dB

# Ruido autogenerado (de flujo) de un conducto recto (VDI 2081).
fn = hvac.flow_noise_straight_duct(bands, flow_velocity=10.0, area=0.04)
```

*El extremo abierto de un conducto refleja energía de baja frecuencia de vuelta
a la instalación — gratis, antes de cualquier silenciador: cuanto más pequeño
es el conducto frente a la longitud de onda, mayor es la pérdida, lo que
explica que los cuellos de difusor pequeños domen el retumbe de baja frecuencia
del ventilador, y por qué la corrección no debe contarse dos veces cuando los
datos del fabricante del difusor ya la incluyen.*

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

```python

from phonometry.noise_control import hvac

bands = [63.0, 125.0, 250.0, 500.0, 1000.0, 2000.0]

# Una línea para un conducto: el HvacSpectrumResult del extremo enrasado de 300 mm.
er = hvac.end_reflection_loss(bands, diameter=0.30, termination="flush")
er.plot(language="es")
plt.show()

# A mano: la familia sobre diámetros de conducto de la figura de concepto.
fig, ax = plt.subplots()
for diameter in (0.15, 0.30, 0.60):
    er = hvac.end_reflection_loss(bands, diameter=diameter, termination="flush")
    ax.semilogx(er.frequencies, er.values, "o-",
                label=f"D = {int(diameter * 1000)} mm")
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel("Pérdida por reflexión del extremo [dB]")
ax.legend(title="Diámetro del conducto")
plt.show()
```

</details>

Los métodos de reflexión de extremo y de codos interpolan las tablas ASHRAE
(pasan exactamente por los nodos tabulados); los métodos de plenum (Wells) y de
ruido de flujo (VDI 2081) son formas cerradas. `end_reflection_loss`,
`elbow_insertion_loss`, `flow_noise_straight_duct` y `flow_noise_bend` devuelven
un `HvacSpectrumResult` (atenuación o nivel de potencia acústica regenerada) con
`.plot()`; `plenum_attenuation` devuelve la pérdida de transmisión directamente.
Los conductos rectangulares usan el diámetro equivalente $D = \sqrt{4S/\pi}$.

:::note
Bies 5.ª ed. da la reflexión de extremo solo como la consulta de la Tabla 8.14
de ASHRAE; no hay forma cerrada en esa edición. Este módulo reproduce e
interpola la tabla.
:::

## 3. Cerramientos de máquina

Un cerramiento sellado reduce el ruido radiado en la pérdida de transmisión del
panel $R$, menos una penalización $C$ por la acumulación reverberante en la
cavidad pequeña y dura (Bies Ecs. (7.103), (7.111)):

$$
\mathrm{IL} = R - C,\qquad C = 10\log_{10}\!\left(0.3 + \frac{S_E}{R_i}\right),
$$

con el área externa $S_E$ y la **constante de sala** interior
$R_i = S_i \alpha_i/(1-\alpha_i)$ (la misma
[`room_constant`](/phonometry/es/guides/room-image-sources/) del campo estacionario
de sala). Un interior duro desperdicia gran parte de $R$; revestirlo lleva $C$
hacia su límite inferior $10\log_{10}0.3 = -5.2$ dB.

**La pérdida de transmisión del panel $R$ la aportas tú** como un array por banda
(medido, o predicho por un modelo de panel), o como una función de la frecuencia.
Este módulo nunca predice $R$; combina un $R$ dado con la absorción interior.

```python

from phonometry import enclosure_insertion_loss

bands = np.array([125.0, 250.0, 500.0, 1000.0, 2000.0, 4000.0])
panel_R = np.array([18.0, 24.0, 30.0, 36.0, 42.0, 46.0])   # medido, dB

enc = enclosure_insertion_loss(
    panel_R, external_area=6.0, internal_area=5.0,
    internal_absorption=0.3, frequencies=bands,
)
print(np.round(enc.insertion_loss, 1))            # IL neta = R - C por banda
enc.plot()                                         # panel R, corrección C e IL
```

*Lo que entrega el cerramiento es `R − C`, no el `R` del panel: incluso este
interior revestido (absorción media 0,3) cuesta unos 5 dB del índice del panel
en cada banda, y un interior duro sin revestir costaría mucho más. Presupuesta
el revestimiento junto con los paneles, no como un añadido posterior.*

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

```python

from phonometry import enclosure_insertion_loss

bands = np.array([125.0, 250.0, 500.0, 1000.0, 2000.0, 4000.0])
panel_R = np.array([18.0, 24.0, 30.0, 36.0, 42.0, 46.0])   # medido, dB

enc = enclosure_insertion_loss(
    panel_R, external_area=6.0, internal_area=5.0,
    internal_absorption=0.3, frequencies=bands,
)

# Una línea — R del panel, corrección interior C y la IL neta = R - C:
enc.plot(language="es")
plt.show()

# A mano, con los campos por banda que lleva el resultado:
fig, ax = plt.subplots()
ax.plot(bands, enc.panel_transmission_loss, "s--", label="R del panel")
ax.plot(bands, enc.correction, "^:", label="Corrección interior C")
ax.plot(bands, enc.insertion_loss, "o-", label="Pérdida por inserción (R - C)")
ax.set_xlabel("Frecuencia [Hz]"); ax.set_ylabel("Nivel [dB]")
ax.set_xscale("log")
ax.legend()
plt.show()
```

</details>

`enclosure_insertion_loss` devuelve un `EnclosureResult` con la
`panel_transmission_loss` del panel, la `correction` interior, la `insertion_loss`
neta, la `room_constant` interior y `.plot()`.

## Contraste con el solucionador FDTD

La cámara de expansión de cuatro polos se contrasta con el
[solucionador de ondas FDTD 2D](/phonometry/es/guides/fdtd-simulation/)
independiente: un conducto de onda plana que se ensancha en una cámara y vuelve a
estrecharse transmite mucho menos en el máximo de TL de cuatro polos ($kL = \pi/2$)
que en la caída transparente ($kL = \pi$), y la razón de amplitudes medida
reproduce la pérdida de transmisión máxima en forma cerrada con una fracción de
decibelio.

## Qué cubre esta guía

**Cubierto.** Los silenciadores reactivos por el método de matriz de
transferencia de cuatro polos (Bies §8.8-8.9, Munjal Ec. (3.27)): la forma
cerrada `expansion_chamber` (Ec. (8.111)), `helmholtz_resonator` y
`quarter_wave_resonator` (Ecs. (8.46), (8.44)), `extended_tube_chamber`, y
los bloques `duct_matrix`/`shunt_matrix`/`cascade`, contrastados contra el
solucionador FDTD independiente. Los métodos HVAC de Bies §8.11-8.17 /
ASHRAE: `hvac.end_reflection_loss` y `hvac.elbow_insertion_loss` (tablas
interpoladas), `hvac.plenum_attenuation` (forma cerrada de Wells) y
`hvac.flow_noise_straight_duct`/`flow_noise_bend` (VDI 2081). La pérdida de
inserción de cerramientos de máquina de Bies §7.4 (Ecs. (7.103), (7.111)),
`enclosure_insertion_loss`, que combina una pérdida de transmisión de panel
aportada con la corrección por la constante de sala interior.

**No cubierto.** Solo están implementados los elementos reactivos: los
silenciadores disipativos (absorbentes, con revestimiento interior) no están
modelados. `enclosure_insertion_loss` nunca predice la pérdida de
transmisión de panel `R`; se aporta medida o de otro modelo, y el módulo
solo la combina con la corrección interior.

## Véase también

- [Electroacústica](/phonometry/es/guides/electroacoustics/): el pistón radiante
  (impedancia de radiación y directividad), el modelo de radiador complementario.
- [Potencia acústica](/phonometry/es/guides/sound-power/): la `Lw` de fuente que
  alimenta un conducto o un cerramiento.
- [Fuentes imagen y campo estacionario](/phonometry/es/guides/room-image-sources/):
  la `room_constant` reutilizada por la corrección interior del cerramiento.
- [Simulación de ondas FDTD 2D](/phonometry/es/guides/fdtd-simulation/): el
  solucionador independiente que contrasta la cámara de expansión.
- [Informe de conformidad](https://github.com/jmrplens/phonometry/blob/main/docs/CONFORMANCE.md):
  las formas cerradas y los anclajes resueltos con los que se validan estas
  implementaciones.
- Referencia de la API:
  [`noise_control.silencers`](/phonometry/reference/api/noise_control/silencers/),
  [`noise_control.hvac`](/phonometry/reference/api/noise_control/hvac/) y
  [`noise_control.enclosures`](/phonometry/reference/api/noise_control/enclosures/).
