Source code for acoustics.descriptors

"""
Descriptors
============

The descriptors module offers all kinds of acoustics related descriptors.

.. toctree::
    :maxdepth: 2

Descriptors from ISO/TR 25417:2007
**********************************

Descriptors from :mod:`acoustics.standards.iso_tr_25417_2007`.

.. autoattribute:: acoustics.descriptors.REFERENCE_PRESSURE
.. autofunction:: acoustics.descriptors.sound_pressure_level
.. autofunction:: acoustics.descriptors.equivalent_sound_pressure_level
.. autofunction:: acoustics.descriptors.peak_sound_pressure
.. autofunction:: acoustics.descriptors.peak_sound_pressure_level
.. autoattribute:: acoustics.descriptors.REFERENCE_SOUND_EXPOSURE
.. autofunction:: acoustics.descriptors.sound_exposure
.. autofunction:: acoustics.descriptors.sound_exposure_level
.. autoattribute:: acoustics.descriptors.REFERENCE_POWER
.. autofunction:: acoustics.descriptors.sound_power_level
.. autofunction:: acoustics.descriptors.sound_energy
.. autofunction:: acoustics.descriptors.sound_energy_level
.. autoattribute:: acoustics.descriptors.REFERENCE_ENERGY
.. autofunction:: acoustics.descriptors.sound_intensity
.. autofunction:: acoustics.descriptors.time_averaged_sound_intensity
.. autoattribute:: acoustics.descriptors.REFERENCE_INTENSITY
.. autofunction:: acoustics.descriptors.time_averaged_sound_intensity_level
.. autofunction:: acoustics.descriptors.normal_time_averaged_sound_intensity
.. autofunction:: acoustics.descriptors.normal_time_averaged_sound_intensity_level


Other descriptors
*****************

"""
import numpy as np

from acoustics.standards.iso_tr_25417_2007 import (
    REFERENCE_PRESSURE,
    sound_pressure_level,
    equivalent_sound_pressure_level,
    peak_sound_pressure,
    peak_sound_pressure_level,
    REFERENCE_SOUND_EXPOSURE,
    sound_exposure,
    sound_exposure_level,
    REFERENCE_POWER,
    sound_power_level,
    sound_energy,
    REFERENCE_ENERGY,
    sound_energy_level,
    sound_intensity,
    time_averaged_sound_intensity,
    REFERENCE_INTENSITY,
    time_averaged_sound_intensity_level,
    normal_time_averaged_sound_intensity,
    normal_time_averaged_sound_intensity_level,
)

from acoustics.standards.iso_1996_1_2003 import composite_rating_level


def _leq(levels, time):
    levels = np.asarray(levels)
    return 10.0 * np.log10((1.0 / time) * np.sum(10.0**(levels / 10.0)))


[docs]def leq(levels, int_time=1.0): """ Equivalent level :math:`L_{eq}`. :param levels: Levels as function of time. :param int_time: Integration time. Default value is 1.0 second. :returns: Equivalent level L_{eq}. Sum of levels in dB. """ levels = np.asarray(levels) time = levels.size * int_time return _leq(levels, time)
[docs]def sel(levels): """ Sound Exposure Level from ``levels`` (NumPy array). """ levels = np.asarray(levels) return _leq(levels, 1.0)
[docs]def lw(W, Wref=1.0e-12): """ Sound power level :math:`L_{w}` for sound power :math:`W` and reference power :math:`W_{ref}`. :param W: Sound power :math:`W`. :param Wref: Reference power :math:`W_{ref}`. Default value is :math:`10^{12}` watt. """ W = np.asarray(W) return 10.0 * np.log10(W / Wref)
[docs]def lden(lday, levening, lnight, hours=(12.0, 4.0, 8.0), adjustment=(0.0, 5.0, 10.0)): """ Calculate :math:`L_{den}` from :math:`L_{day}`, :math:`L_{evening}` and :math:`L_{night}`. :param lday: Equivalent level during day period :math:`L_{day}`. :param levening: Equivalent level during evening period :math:`L_{evening}`. :param lnight: Equivalent level during night period :math:`L_{night}`. :param hours: Hours per period. :param adjustment: Correction factor per period. :returns: :math:`L_{den}` .. seealso:: :func:`acoustics.standards.iso_1996_1_2003.composite_rating_level` """ lday = np.asarray(lday) levening = np.asarray(levening) lnight = np.asarray(lnight) return composite_rating_level(np.vstack((lday, levening, lnight)).T, hours, adjustment)
[docs]def ldn(lday, lnight, hours=(15.0, 9.0), adjustment=(0.0, 10.0)): """ Calculate :math:`L_{dn}` from :math:`L_{day}` and :math:`L_{night}`. :param lday: Equivalent level during day period :math:`L_{day}`. :param lnight: Equivalent level during night period :math:`L_{night}`. :param hours: Hours per period. :param adjustment: Correction factor per period. :returns: :math:`L_{dn}` .. seealso:: :func:`acoustics.standards.iso_1996_1_2003.composite_rating_level` """ lday = np.asarray(lday) lnight = np.asarray(lnight) return composite_rating_level(np.vstack((lday, lnight)).T, hours, adjustment)
__all__ = [ # Following we take from another module "REFERENCE_PRESSURE", "sound_pressure_level", "equivalent_sound_pressure_level", "peak_sound_pressure", "peak_sound_pressure_level", "REFERENCE_SOUND_EXPOSURE", "sound_exposure", "sound_exposure_level", "REFERENCE_POWER", "sound_power_level", "sound_energy", "REFERENCE_ENERGY", "sound_energy_level", "sound_intensity", "time_averaged_sound_intensity", "REFERENCE_INTENSITY", "time_averaged_sound_intensity_level", "normal_time_averaged_sound_intensity", "normal_time_averaged_sound_intensity_level", # Following are locally defined "leq", "sel", "lw", "lden", "ldn", ]