Source code for acoustics.standards.iso_9613_1_1993
"""
ISO 9613-1:1993
===============
ISO 9613-1:1993 specifies an analytical method of calculating the attenuation of sound
as a result of atmospheric absorption for a variety of meteorological conditions.
"""
import numpy as np
SOUNDSPEED = 343.2
"""
Speed of sound.
"""
REFERENCE_TEMPERATURE = 293.15
"""
Reference temperature.
"""
REFERENCE_PRESSURE = 101.325
"""
International Standard Atmosphere in kilopascal.
"""
TRIPLE_TEMPERATURE = 273.16
""".
Triple point isotherm temperature.
"""
[docs]def soundspeed(temperature, reference_temperature=REFERENCE_TEMPERATURE):
"""
Speed of sound :math:`c`.
:param temperature: Ambient temperature :math:`T_0`
:param reference_temperature: Reference temperature :math:`T`
The speed of sound is calculated using
.. math:: c = 343.2 \\left( \\frac{T}{T_0} \\right)
"""
return 343.2 * np.sqrt(temperature / reference_temperature)
[docs]def saturation_pressure(temperature, reference_pressure=REFERENCE_PRESSURE, triple_temperature=TRIPLE_TEMPERATURE):
"""
Saturation vapour pressure :math:`p_{sat}`.
:param temperature: Ambient temperature :math:`T`
:param reference_pressure: Reference pressure :math:`p_r`
:param triple_temperature: Triple point temperature water :math:`T_{01}`
The saturation vapour pressure is calculated using
.. math:: p_{sat} = 10^C \cdot p_r
with exponent :math:`C` given by
.. math:: C = -6.8346 \cdot \\left( \\frac{T_{01}}{T} \\right)^{1.261} + 4.6151
"""
return reference_pressure * 10.0**(-6.8346 * (triple_temperature / temperature)**(1.261) + 4.6151)
[docs]def molar_concentration_water_vapour(relative_humidity, saturation_pressure, pressure):
"""
Molar concentration of water vapour :math:`h`.
:param relative_humidity: Relative humidity :math:`h_r`
:param saturation_pressure: Saturation pressure :math:`p_{sat}`
:param pressure: Ambient pressure :math:`p`
The molar concentration of water vapour is calculated using
.. math:: h = h_r \\frac{p_{sat}}{p_a}
"""
return relative_humidity * saturation_pressure / pressure
[docs]def relaxation_frequency_oxygen(pressure, h, reference_pressure=REFERENCE_PRESSURE):
"""
Relaxation frequency of oxygen :math:`f_{r,O}`.
:param pressure: Ambient pressure :math:`p_a`
:param reference_pressure: Reference pressure :math:`p_r`
:param h: Molar concentration of water vapour :math:`h`
The relaxation frequency of oxygen is calculated using
.. math:: f_{r,O} = \\frac{p_a}{p_r} \\left( 24 + 4.04 \cdot 10^4 h \\frac{0.02 + h}{0.391 + h} \\right)
"""
return pressure / reference_pressure * (24.0 + 4.04 * 10.0**4.0 * h * (0.02 + h) / (0.391 + h))
[docs]def relaxation_frequency_nitrogen(pressure, temperature, h, reference_pressure=REFERENCE_PRESSURE,
reference_temperature=REFERENCE_TEMPERATURE):
"""
Relaxation frequency of nitrogen :math:`f_{r,N}`.
:param pressure: Ambient pressure :math:`p_a`
:param temperature: Ambient temperature :math:`T`
:param h: Molar concentration of water vapour :math:`h`
:param reference_pressure: Reference pressure :math:`p_{ref}`
:param reference_temperature: Reference temperature :math:`T_{ref}`
The relaxation frequency of nitrogen is calculated using
.. math:: f_{r,N} = \\frac{p_a}{p_r} \\left( \\frac{T}{T_0} \\right)^{-1/2} \cdot \\left( 9 + 280 h \exp{\\left\{ -4.170 \\left[ \\left(\\frac{T}{T_0} \\right)^{-1/3} -1 \\right] \\right\} } \\right)
"""
return pressure / reference_pressure * (temperature / reference_temperature)**(-0.5) * (
9.0 + 280.0 * h * np.exp(-4.170 * ((temperature / reference_temperature)**(-1.0 / 3.0) - 1.0)))
[docs]def attenuation_coefficient(pressure, temperature, reference_pressure, reference_temperature,
relaxation_frequency_nitrogen, relaxation_frequency_oxygen, frequency):
"""
Attenuation coefficient :math:`\\alpha` describing atmospheric absorption in dB/m for the specified ``frequency``.
:param pressure: Ambient pressure :math:`T`
:param temperature: Ambient temperature :math:`T`
:param reference_pressure: Reference pressure :math:`p_{ref}`
:param reference_temperature: Reference temperature :math:`T_{ref}`
:param relaxation_frequency_nitrogen: Relaxation frequency of nitrogen :math:`f_{r,N}`.
:param relaxation_frequency_oxygen: Relaxation frequency of oxygen :math:`f_{r,O}`.
:param frequency: Frequencies to calculate :math:`\\alpha` for.
"""
return 8.686 * frequency**2.0 * (
(1.84 * 10.0**(-11.0) * (reference_pressure / pressure) * (temperature / reference_temperature)**
(0.5)) + (temperature / reference_temperature)**
(-2.5) * (0.01275 * np.exp(-2239.1 / temperature) * (relaxation_frequency_oxygen +
(frequency**2.0 / relaxation_frequency_oxygen))**
(-1.0) + 0.1068 * np.exp(-3352.0 / temperature) *
(relaxation_frequency_nitrogen + (frequency**2.0 / relaxation_frequency_nitrogen))**(-1.0)))