"""
Building
========
The building module contains functions related to building acoustics.
"""
import numpy as np
[docs]def rw_curve(tl):
"""
Calculate the curve of :math:`Rw` from a NumPy array `tl` with third
octave data between 100 Hz and 3.15 kHz.
:param tl: Transmission Loss
"""
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
[docs]def rw(tl):
"""
Calculate :math:`R_W` from a NumPy array `tl` with third octave data
between 100 Hz and 3.15 kHz.
:param tl: Transmission Loss
"""
return rw_curve(tl)[7]
[docs]def rw_c(tl):
"""
Calculate :math:`R_W + C` from a NumPy array `tl` with third octave data
between 100 Hz and 3.15 kHz.
:param tl: Transmission Loss
"""
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
[docs]def rw_ctr(tl):
"""
Calculate :math:`R_W + C_{tr}` from a NumPy array `tl` with third octave
data between 100 Hz and 3.15 kHz.
:param tl: Transmission Loss
"""
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
[docs]def stc_curve(tl):
"""
Calculate the Sound Transmission Class (STC) curve from a NumPy array `tl`
with third octave data between 125 Hz and 4 kHz.
:param tl: Transmission Loss
"""
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
[docs]def stc(tl):
"""
Calculate the Sound Transmission Class (STC) from a NumPy array `tl` with
third octave data between 125 Hz and 4 kHz.
:param tl: Transmission Loss
"""
return stc_curve(tl)[6]
[docs]def mass_law(freq, vol_density, thickness, theta=0, c=343, rho0=1.225):
""" Calculate transmission loss according to mass law.
:param freq: Frequency of interest in Hz.
:type freq: `float` or `NumPy array`
:param vol_density: Volumetric density of material in [kg/m^3].
:type vol_density: `float`
:param thickness: Thickness of wall.
:type thickness: `float`
:param theta: Angle of incidence in degrees. Default value is `0` (normal incidence).
:type theta: `float`
:param c: Speed of sound in [m/s].
:type c: `float`
:param rho0: Density of air in kg/m^3.
:type rho0: `float`
"""
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
__all__ = ['rw_curve', 'rw', 'rw_c', 'rw_ctr', 'stc_curve', 'stc', 'mass_law']