Atmospheric Attenuation#

Atmospheric attenuation of sound is the decrease in sound intensity as it travels through the Earth’s atmosphere. Various factors contribute to this attenuation, such as absorption and scattering. Sound absorption occurs when sound energy is converted into heat energy as it interacts with atmospheric molecules. This process is frequency-dependent, as it can be seen below, with higher frequencies experiencing greater attenuation. The calculations in this section is based on Bugaru et al. [2] and Technical Committee ISO/TC 43/SC 1 [12].

Hide code cell source
import os
from pathlib import Path
import sys
sys.path.append(str(Path(os.getcwd()).parent.parent))
from src.utils import atmospheric_absorption, print_code
import numpy as np
import matplotlib.pyplot as plt
from IPython.core.display import HTML

Sound attenuation coefficient#

To calculate atmospheric attenuation, it is necessary to determine the sound attenuation coefficient, \(\alpha\). This coefficient quantifies the amount of sound absorbed by the air per meter traveled from the sound source. The sound attenuation coefficient is determined by considering factors such as frequency, temperature, relative humidity, and ambient atmospheric pressure. By incorporating these variables into the calculation, the attenuation of sound in the atmosphere can be accurately estimated. The power level of the noise decreases in a linear manner with distance, and it can be calculated using the formula \(A_{atm} = \alpha \cdot d\).

HTML(print_code(atmospheric_absorption))
def atmospheric_absorption(f=1000, t=10, rh=80, ps=1.01325e5):
    """ 
    Calculate the attenuation coefficient for a given frequency, temperature, relative humidity, and atmospheric pressure.
    
    Input:
    f: frequency in Hz
    t: temperature in C
    rh: relative humidity in %
    ps: atmospheric pressure in Pa
    
    Output:
    alpha: attenuation coefficient
    """
    
    # Convert atmospheric pressure to a variable that won't be modified
    ps0 = 1.01325e5
    
    # Convert temperature from Celsius to Kelvin
    T = t + 273.15
    # Reference temperature in Kelvin
    T0 = 293.15
    
    # Reference temperature in Kelvin for saturation vapor pressure
    T01 = 273.16
    
    # Calculate saturation vapor pressure constant
    Csat = -6.8346 * (T01/T)**1.261 + 4.6151
    
    # Calculate saturation vapor pressure
    rhosat = 10**Csat
    
    # Calculate relative humidity ratio
    H = rhosat * rh * ps0 / ps
    
    # Calculate frequency-dependent term for attenuation due to water vapor
    frn = (ps / ps0) * (T0/T)**0.5 * (9 + 280 * H * np.exp(-4.17 * ((T0/T)**(1/3) - 1)))
    
    # Calculate frequency-dependent term for attenuation due to oxygen
    fro = (ps / ps0) * (24.0 + 4.04e4 * H * (0.02 + H) / (0.391 + H))
    
    # Calculate the attenuation coefficient
    alpha = 20/np.log(10) * f**2 * (1.84e-11 / ( (T0/T)**0.5 * ps / ps0 )+ (T/T0)**(-2.5)* (0.10680 * np.exp(-3352 / T) * frn / (f**2 + frn * frn)+ 0.01278 * np.exp(-2239.1 / T) * fro / (f**2 + fro * fro)))
    
    return alpha

Frequency influence#

Lets visualize the atmospheric absorption for different relative humidities and frequencies.

t = 10 # temperature
fs = np.logspace(1, 4, num=100, endpoint=True, base=10) # frequency range
alphas = np.zeros(fs.shape) # initiate alpha
rhs = (0, 10, 20, 40, 60, 80, 100) # relative humidity range

plt.figure()
for rh in rhs:
    for i, f in enumerate(fs):
        alphas[i] = atmospheric_absorption(f, t, rh)
    plt.loglog(fs, alphas, label='rh: %d'%rh)
plt.title(f'Absorption coefficient at {t} degrees')
plt.grid(True)
plt.xlabel('Frequency[Hz]')
plt.ylabel('Absorption coefficient [dB/m]')
plt.legend(loc='best')
plt.tight_layout()
plt.show()
../../_images/37c481e3bfaa2eaf16a7dafd54011824913afcf308181f902f7f8bdaf9cfe5a5.png

As shown in the graph above, the frequency of the noise significantly influences the level of atmospheric absorption. Higher frequencies experience greater absorption, resulting in reduced sound levels. Generally, with a few exceptions, higher relative humidity contributes to lower levels of absorption.

Relative humidity influence#

rh_list = np.linspace(0, 100, 1000)
f_list = [63, 125, 250, 500, 1000, 2000, 4000, 8000]

fig, ax = plt.subplots(figsize = (6,6))
for f in f_list:
    Aatm = atmospheric_absorption(f, 20, rh_list)
    ax.plot(rh_list, Aatm, label = f"f: {f} Hz")
ax.legend()
ax.set(xlabel = "Relative Humidity (%)",
       ylabel = 'Absorption coefficient [dB/m]')
ax.grid()
plt.tight_layout()
plt.show()
../../_images/58790b9ebc7ea16e9dd5c011aea49505f8d41cc84112db56e8eda5c4f74b4aef.png

As observed above, relative humidity also exerts a significant influence on atmospheric absorption. Particularly in the range of 10-30% relative humidity, there appears to be a notable increase in absorption.

Temperature influence#

t_list = np.linspace(0, 40, 1000)
f_list = [63, 125, 250, 500, 1000, 2000, 4000, 8000]

fig, ax = plt.subplots(figsize = (6,6))
for f in f_list:
    Aatm = atmospheric_absorption(f, t_list, rh=70)
    ax.plot(t_list, Aatm, label = f"f = {f} Hz")
ax.legend()
ax.set(xlabel = "Temperature [°C]",
       ylabel = 'Absorption coefficient [dB/m]')
ax.grid()
plt.tight_layout()
plt.show()
../../_images/bddfcdf8495a2cdbe4fabc0f9bfc77b09dc32ff24dab66f4c6928d5a02a24414.png

As seen from the above graph, temperature has a relatively minor impact on the overall level of absorption. In general, higher absorption rates are observed at lower temperatures.