Skip to content

Building Module

The building module contains functions for calculating acoustic properties of building elements, including sound transmission class (STC) and weighted sound reduction index (\(R_w\)) calculations.

FUNCTION DESCRIPTION
rw_curve

Calculate the reference curve for weighted sound reduction index.

rw

Calculate the weighted sound reduction index (\(R_w\)).

rw_c

Calculate the weighted sound reduction index with spectrum adaptation term C (\(R_w + C\)).

rw_ctr

Calculate the weighted sound reduction index with spectrum adaptation term \(C_{tr}\) (\(R_w + C_{tr}\)).

stc_curve

Calculate the Sound Transmission Class (STC) reference curve.

stc

Calculate the Sound Transmission Class (STC).

mass_law

Calculate transmission loss according to mass law.

Functions

rw_curve

rw_curve(tl: NDArray[float64]) -> NDArray[float64]

Calculate the curve of \(Rw\) from a NumPy array tl with third octave data between 100 Hz and 3.15 kHz.

PARAMETER DESCRIPTION
tl

Transmission Loss

TYPE: NDArray[float64]

RETURNS DESCRIPTION
NDArray[float64]

NDArray[np.float64]: Reference curve values.

Source code in acoustic_toolbox/building.py
def rw_curve(tl: NDArray[np.float64]) -> NDArray[np.float64]:
    """Calculate the curve of $Rw$ from a NumPy array `tl` with third
    octave data between 100 Hz and 3.15 kHz.

    Args:
        tl: Transmission Loss

    Returns:
        NDArray[np.float64]: Reference curve values.
    """
    ref_curve = np.array([0, 3, 6, 9, 12, 15, 18, 19, 20, 21, 22, 23, 23, 23, 23, 23])
    residuals = 0
    while residuals > -32:
        ref_curve += 1
        diff = tl - ref_curve
        residuals = np.sum(np.clip(diff, np.min(diff), 0))
    ref_curve -= 1
    return ref_curve

rw

rw(tl: NDArray[float64]) -> float

Calculate \(R_W\) from a NumPy array tl with third octave data between 100 Hz and 3.15 kHz.

PARAMETER DESCRIPTION
tl

Transmission Loss.

TYPE: NDArray[float64]

RETURNS DESCRIPTION
float

The weighted sound reduction index.

TYPE: float

Source code in acoustic_toolbox/building.py
def rw(tl: NDArray[np.float64]) -> float:
    """Calculate $R_W$ from a NumPy array `tl` with third octave data
    between 100 Hz and 3.15 kHz.

    Args:
        tl: Transmission Loss.

    Returns:
        float: The weighted sound reduction index.
    """
    return rw_curve(tl)[7]

rw_c

rw_c(tl: NDArray[float64]) -> float

Calculate \(R_W + C\) from a NumPy array tl with third octave data between 100 Hz and 3.15 kHz.

PARAMETER DESCRIPTION
tl

Transmission Loss.

TYPE: NDArray[float64]

RETURNS DESCRIPTION
float

The weighted sound reduction index with spectrum adaptation term C.

TYPE: float

Source code in acoustic_toolbox/building.py
def rw_c(tl: NDArray[np.float64]) -> float:
    """Calculate $R_W + C$ from a NumPy array `tl` with third octave data
    between 100 Hz and 3.15 kHz.

    Args:
        tl: Transmission Loss.

    Returns:
        float: The weighted sound reduction index with spectrum adaptation term C.
    """
    k = np.array(
        [-29, -26, -23, -21, -19, -17, -15, -13, -12, -11, -10, -9, -9, -9, -9, -9]
    )
    a = -10 * np.log10(np.sum(10 ** ((k - tl) / 10)))
    return a

rw_ctr

rw_ctr(tl: NDArray[float64]) -> float

Calculate \(R_W + C_{tr}\) from a NumPy array tl with third octave data between 100 Hz and 3.15 kHz.

PARAMETER DESCRIPTION
tl

Transmission Loss.

TYPE: NDArray[float64]

RETURNS DESCRIPTION
float

The weighted sound reduction index with spectrum adaptation term \(C_{tr}\).

TYPE: float

Source code in acoustic_toolbox/building.py
def rw_ctr(tl: NDArray[np.float64]) -> float:
    """Calculate $R_W + C_{tr}$ from a NumPy array `tl` with third octave
    data between 100 Hz and 3.15 kHz.

    Args:
        tl: Transmission Loss.

    Returns:
        float: The weighted sound reduction index with spectrum adaptation term $C_{tr}$.
    """
    k_tr = np.array(
        [-20, -20, -18, -16, -15, -14, -13, -12, -11, -9, -8, -9, -10, -11, -13, -15]
    )
    a_tr = -10 * np.log10(np.sum(10 ** ((k_tr - tl) / 10)))
    return a_tr

stc_curve

stc_curve(tl: NDArray[float64]) -> NDArray[float64]

Calculate the Sound Transmission Class (STC) curve from a NumPy array tl with third octave data between 125 Hz and 4 kHz.

PARAMETER DESCRIPTION
tl

Transmission Loss.

TYPE: NDArray[float64]

RETURNS DESCRIPTION
NDArray[float64]

NDArray[np.float64]: The STC reference curve values.

Source code in acoustic_toolbox/building.py
def stc_curve(tl: NDArray[np.float64]) -> NDArray[np.float64]:
    """Calculate the Sound Transmission Class (STC) curve from a NumPy array `tl`
    with third octave data between 125 Hz and 4 kHz.

    Args:
        tl: Transmission Loss.

    Returns:
        NDArray[np.float64]: The STC reference curve values.
    """
    ref_curve = np.array([0, 3, 6, 9, 12, 15, 16, 17, 18, 19, 20, 20, 20, 20, 20, 20])
    top_curve = ref_curve
    res_sum = 0
    while True:
        diff = tl - top_curve
        residuals = np.clip(diff, np.min(diff), 0)
        res_sum = np.sum(residuals)
        if res_sum < -32:
            if np.any(residuals > -8):
                top_curve -= 1
                break
        top_curve += 1
    return top_curve

stc

stc(tl: NDArray[float64]) -> float

Calculate the Sound Transmission Class (STC) from a NumPy array tl with third octave data between 125 Hz and 4 kHz.

PARAMETER DESCRIPTION
tl

Transmission Loss.

TYPE: NDArray[float64]

RETURNS DESCRIPTION
float

The Sound Transmission Class value.

TYPE: float

Source code in acoustic_toolbox/building.py
def stc(tl: NDArray[np.float64]) -> float:
    """Calculate the Sound Transmission Class (STC) from a NumPy array `tl` with
    third octave data between 125 Hz and 4 kHz.

    Args:
        tl: Transmission Loss.

    Returns:
        float: The Sound Transmission Class value.
    """
    return stc_curve(tl)[6]

mass_law

mass_law(
    freq: float | NDArray[float64],
    vol_density: float,
    thickness: float,
    theta: float = 0,
    c: float = 343,
    rho0: float = 1.225,
) -> float | NDArray[float64]

Calculate transmission loss according to mass law.

PARAMETER DESCRIPTION
freq

Frequency of interest in Hz.

TYPE: float | NDArray[float64]

vol_density

Volumetric density of material in \(frac{kg}{m^3}\).

TYPE: float

thickness

Thickness of wall in m.

TYPE: float

theta

Angle of incidence in degrees. Default value is 0 (normal incidence).

TYPE: float DEFAULT: 0

c

Speed of sound in m/s. Defaults to 343.

TYPE: float DEFAULT: 343

rho0

Density of air in \(\frac{kg}{m^3}\). Defaults to 1.225.

TYPE: float DEFAULT: 1.225

RETURNS DESCRIPTION
float | NDArray[float64]

float | NDArray[np.float64]: Transmission loss value(s) in dB.

Source code in acoustic_toolbox/building.py
def mass_law(
    freq: float | NDArray[np.float64],
    vol_density: float,
    thickness: float,
    theta: float = 0,
    c: float = 343,
    rho0: float = 1.225,
) -> float | NDArray[np.float64]:
    r"""Calculate transmission loss according to mass law.

    Args:
        freq: Frequency of interest in Hz.
        vol_density: Volumetric density of material in $frac{kg}{m^3}$.
        thickness: Thickness of wall in m.
        theta: Angle of incidence in degrees. Default value is 0 (normal incidence).
        c: Speed of sound in m/s. Defaults to 343.
        rho0: Density of air in $\frac{kg}{m^3}$. Defaults to 1.225.

    Returns:
        float | NDArray[np.float64]: Transmission loss value(s) in dB.
    """
    rad_freq = 2.0 * np.pi * freq
    surface_density = vol_density * thickness
    theta_rad = np.deg2rad(theta)
    a = rad_freq * surface_density * np.cos(theta_rad) / (2 * rho0 * c)
    tl_theta = 10 * np.log10(1 + a**2)
    return tl_theta

:::