---
title: "Industrial Noise Control: Silencers, HVAC and Enclosures"
description: "Reactive silencers by the four-pole transmission-matrix method (expansion chambers, Helmholtz and quarter-wave resonators, extended tubes), HVAC duct attenuation and flow noise, and machine-enclosure insertion loss, from Bies, Hansen & Howard."
references:
  - type: book
    authors: ["Bies, D. A.", "Hansen, C. H.", "Howard, C. Q."]
    year: 2017
    title: "Engineering noise control"
    edition: "5th ed."
    publisher: "CRC Press"
    doi: "10.1201/9781351228152"
    note: "The muffler four-pole method and expansion-chamber TL (§8.8-8.9), the HVAC duct methods (§8.11-8.17) and the machine-enclosure noise reduction (§7.4) of this page."
  - type: book
    authors: ["Munjal, M. L."]
    year: 2014
    title: "Acoustics of ducts and mufflers"
    edition: "2nd ed."
    publisher: "Wiley"
    doi: "10.1002/9781118443767"
    note: "The transfer-matrix formulation, the element matrices and the transmission loss from the compound matrix (Eq. (3.27)) behind §1."
  - type: book
    authors: ["Vér, I. L.", "Beranek, L. L."]
    year: 2006
    title: "Noise and vibration control engineering: Principles and applications"
    edition: "2nd ed."
    publisher: "Wiley"
    doi: "10.1002/9780470172568"
    note: "The companion treatment of mufflers, ducts and enclosures cross-checked in this page."
---

import ThemeImage from '../../../components/ThemeImage.astro';

Three passive measures dominate applied noise control: **silencers** in a duct,
the passive attenuations and regenerated noise of an **HVAC** run, and a
**machine enclosure**. `phonometry.noise_control` covers all three with the
engineering theory of Bies, Hansen & Howard. The silencers are built on the
one-dimensional four-pole (transfer-matrix) method, which chains reusable
acoustic elements; the HVAC methods are the ASHRAE tables and closed forms for
bends, end reflection, plenums and flow noise; and the enclosure model combines
a user-supplied panel transmission loss with the reverberant build-up inside
the enclosure. The radiating [piston](/phonometry/guides/electroacoustics/) of
the electroacoustics domain is the companion radiator model.

## 1. Reactive silencers (four-pole method)

A reactive silencer attenuates by *reflecting* sound with impedance
discontinuities. Each acoustic element is a 2x2 **transfer matrix** relating the
pressure `p` and volume velocity `Su` at its two ends, and a compound silencer
is the ordered matrix product of its elements (Bies §8.9). A straight duct of
length `L` and area `S` is

$$
\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,
$$

and a side branch of impedance $Z_b$ is the shunt
$\left[\begin{smallmatrix} 1 & 0 \\ 1/Z_b & 1 \end{smallmatrix}\right]$. The
**transmission loss** follows from the compound matrix $T$ with the port
impedances $Z_1 = \rho c/S_\text{in}$ and $Z_n = \rho c/S_\text{out}$
(Munjal Eq. (3.27); Bies Eq. (8.141) prints the $T_{11}$/$T_{22}$ impedance
weights of this formula inverted and fails the sudden-expansion limit, see the
[errata registry](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],
$$

which for equal inlet/outlet areas $S$ reduces to (Bies Eq. (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},
$$

and the **insertion loss** for a source impedance $Z_s$ and radiation impedance
$Z_r$ is the extra attenuation over a direct connection.

### Expansion chamber

The simplest silencer, a chamber of area $S_\text{exp}$ and length $L$ between
pipes of area $S_\text{duct}$, has the closed-form transmission loss (Bies
Eq. (8.111)) with area ratio $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],
$$

peaking at $10\log_{10}[1 + \tfrac14(m-1/m)^2]$ when $kL = \pi/2, 3\pi/2, \dots$
and dropping to $0$ at $kL = n\pi$ where the chamber is a half-wavelength long
and transparent. The four-pole product reproduces this exactly.

```python
import numpy as np
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))   # 6.55 dB peak (m = 4)
# The troughs at f = n c / 2L are exactly 0 dB (no dissipation).
print(round(float(res.transmission_loss[np.argmin(res.transmission_loss)]), 6))
```

The figure below shows the transmission loss for four area ratios: a larger
mismatch $m$ lifts every peak, but the troughs stay at 0 dB and the peaks stay
at the same frequencies, set only by the chamber length.

<ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/silencer_expansion_chamber.svg" alt="Expansion-chamber transmission loss against frequency for area ratios m = 2, 4, 8 and 16, showing periodic peaks rising with m at odd multiples of the quarter-wave frequency and troughs returning to 0 dB at every half-wavelength of the chamber length" width="88%" />

<details>
<summary>Show the code for this figure</summary>

```python
import matplotlib.pyplot as plt
import numpy as np
from phonometry import expansion_chamber

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

# One line for one chamber: TL vs frequency (with the insertion loss too if
# source/radiation impedances are given).
expansion_chamber(freqs, 0.3, 0.04, 0.01,
                  source_impedance=4e4, radiation_impedance=5e3).plot()
plt.show()

# By hand: the family of area ratios of the concept figure.
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("Frequency [Hz]"); ax.set_ylabel("Transmission loss [dB]")
ax.legend()
plt.show()
```

</details>

### Side-branch and extended-tube resonators

A **Helmholtz resonator** (neck area $S_n$, effective length $l_e$, cavity
volume $V$) and a closed **quarter-wave tube** (length $l_e$) each short the
duct at their tuning frequency, giving a sharp transmission-loss spike there:
$f_0 = \tfrac{c}{2\pi}\sqrt{S_n/(l_e V)}$ (Bies Eq. (8.46)) and $f = c/4l_e$
(Eq. (8.44)). An **extended-tube chamber** buries quarter-wave side branches in
an expansion chamber to fill the plain chamber's troughs.

```python
import numpy as np
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))       # tuning frequency, Hz

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 Example 8.1)

# An inlet extension of L/4 fills the first expansion-chamber trough.
et = extended_tube_chamber(f, length=0.4, chamber_area=0.04, pipe_area=0.01,
                           inlet_extension=0.1)
```

Each returns a `ReactiveSilencerResult` with `transmission_loss`,
`insertion_loss` (when impedances are given), the compound `transfer_matrix`
and `.plot()`. Advanced layouts chain elements directly with `duct_matrix`,
`shunt_matrix`, `cascade`, `transmission_loss` and `insertion_loss`.

## 2. HVAC duct attenuation and flow noise

A ventilation run attenuates fan noise at bends, at the open duct end and in
plenums, and regenerates noise wherever the airflow is disturbed. `phonometry.noise_control.hvac`
gathers the Bies Chapter 8 methods.

```python
from phonometry.noise_control import hvac

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

# Low-frequency reflection back up an open duct end (ASHRAE Table 8.14).
er = hvac.end_reflection_loss(bands, diameter=0.30, termination="flush")

# Insertion loss of a lined square 90-degree elbow (ASHRAE Table 8.11).
el = hvac.elbow_insertion_loss(bands, width=0.3, bend_type="square", lined=True)

# Plenum-chamber TL by Wells' method (closed form).
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

# Flow-generated (self) noise of a straight duct (VDI 2081).
fn = hvac.flow_noise_straight_duct(bands, flow_velocity=10.0, area=0.04)
```

The end-reflection and elbow methods interpolate the ASHRAE tables (they pass
exactly through the tabulated nodes); the plenum (Wells) and flow-noise (VDI
2081) methods are closed forms. `end_reflection_loss`, `elbow_insertion_loss`,
`flow_noise_straight_duct` and `flow_noise_bend` return an `HvacSpectrumResult`
(attenuation or regenerated sound power level) with `.plot()`; `plenum_attenuation`
returns the transmission loss directly. Rectangular ducts use the equivalent
diameter $D = \sqrt{4S/\pi}$.

:::note
Bies 5th ed. gives the duct end reflection only as the ASHRAE Table 8.14
look-up; there is no closed form in that edition. This module reproduces and
interpolates the table.
:::

## 3. Machine enclosures

A sealed enclosure reduces the radiated noise by its panel transmission loss
$R$, minus a penalty $C$ for the reverberant build-up inside the small, hard
cavity (Bies Eqs. (7.103), (7.111)):

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

with the external area $S_E$ and the interior **room constant**
$R_i = S_i \alpha_i/(1-\alpha_i)$ (the same
[`room_constant`](/phonometry/guides/room-image-sources/) as the steady-state
room field). A hard interior wastes much of the panel $R$; lining it drives $C$
toward its floor $10\log_{10}0.3 = -5.2$ dB.

**The panel transmission loss $R$ is supplied by you** as a per-band array
(measured, or predicted by a panel model), or as a callable of frequency. This
module never predicts $R$ itself; it combines a given $R$ with the interior
absorption.

```python
import numpy as np
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])   # measured, 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))            # net IL = R - C per band
enc.plot()                                         # panel R, correction C and IL
```

`enclosure_insertion_loss` returns an `EnclosureResult` with the panel
`panel_transmission_loss`, the interior `correction`, the net `insertion_loss`,
the interior `room_constant`, and `.plot()`.

## Cross-check against the FDTD solver

The four-pole expansion chamber is cross-checked against the independent 2D
[FDTD wave solver](/phonometry/guides/fdtd-simulation/): a plane-wave duct that
widens into a chamber and narrows back transmits far less at the four-pole TL
peak ($kL = \pi/2$) than at the transparent trough ($kL = \pi$), and the
measured amplitude ratio reproduces the closed-form peak transmission loss to a
fraction of a decibel.

## See also

- [Electroacoustics](/phonometry/guides/electroacoustics/): the radiating
  piston (radiation impedance and directivity), the companion radiator model.
- [Sound Power](/phonometry/guides/sound-power/): the source `Lw` that feeds a
  duct or an enclosure.
- [Room image sources and steady field](/phonometry/guides/room-image-sources/):
  the `room_constant` reused by the enclosure interior correction.
- [2D FDTD wave simulation](/phonometry/guides/fdtd-simulation/): the
  independent solver that cross-checks the expansion chamber.
- [Conformance report](https://github.com/jmrplens/phonometry/blob/main/docs/CONFORMANCE.md):
  the closed forms and worked anchors these implementations are validated
  against.
- API reference:
  [`noise_control.silencers`](/phonometry/reference/api/noise_control/silencers/),
  [`noise_control.hvac`](/phonometry/reference/api/noise_control/hvac/) and
  [`noise_control.enclosures`](/phonometry/reference/api/noise_control/enclosures/).
