"""
Weighting
=========
Weightings according to IEC 61672-1:2003.
"""
import numpy as np
from acoustics.bands import third
THIRD_OCTAVE_A_WEIGHTING = np.array([
-63.4, -56.7, -50.5, -44.7, -39.4, -34.6, -30.2, -26.2, -22.5, -19.1, -16.1, -13.4, -10.9, -8.6, -6.6, -4.8, -3.2,
-1.9, -0.8, +0.0, +0.6, +1.0, +1.2, +1.3, +1.2, +1.0, +0.5, -0.1, -1.1, -2.5, -4.3, -6.6, -9.3
])
"""
A-weighting filter for preferred 1/3-octave band center frequencies, as specified in :attr:`acoustics.bands.THIRD_OCTAVE_CENTER_FREQUENCIES`.
"""
THIRD_OCTAVE_C_WEIGHTING = np.array([
-11.2, -8.5, -6.2, -4.4, -3.0, -2.0, -1.3, -0.8, -0.5, -0.3, -0.2, -0.1, +0.0, +0.0, +0.0, +0.0, +0.0, +0.0, +0.0,
+0.0, +0.0, -0.1, -0.2, -0.3, -0.5, -0.8, -1.3, -2.0, -3.0, -4.4, -6.2, -8.5, -11.2
])
"""
C-weighting filter for preferred 1/3-octave band center frequencies, as specified in :attr:`acoustics.bands.THIRD_OCTAVE_CENTER_FREQUENCIES`.
"""
[docs]def a_weighting(first, last):
"""
Select frequency weightings between ``first`` and ``last``
centerfrequencies from A-weighting.
Possible values for these frequencies are third-octave frequencies
between 12.5 Hz and 20,000 Hz (including them).
Parameters
----------
first : scalar
First third-octave centerfrequency.
last : scalar
Last third-octave centerfrequency.
Returns
-------
NumPy array with A-weighting between ``first`` and ``last``
centerfrequencies.
"""
return _weighting("a", first, last)
[docs]def c_weighting(first, last):
"""
Select frequency weightings between ``first`` and ``last``
centerfrequencies from C-weighting.
Possible values for these frequencies are third-octave frequencies
between 12.5 Hz and 20,000 Hz (including them).
Parameters
----------
first : scalar
First third-octave centerfrequency.
last : scalar
Last third-octave centerfrequency.
Returns
-------
NumPy array with A-weighting between ``first`` and ``last``
centerfrequencies.
"""
return _weighting("c", first, last)
def _weighting(filter_type, first, last):
third_oct_bands = third(12.5, 20000.0).tolist()
low = third_oct_bands.index(first)
high = third_oct_bands.index(last)
if filter_type == "a":
freq_weightings = THIRD_OCTAVE_A_WEIGHTING
elif filter_type == "c":
freq_weightings = THIRD_OCTAVE_C_WEIGHTING
return freq_weightings[low:high + 1]
[docs]def z2a(levels, first, last):
"""Apply A-weighting to Z-weighted signal.
"""
return levels + a_weighting(first, last)
[docs]def a2z(levels, first, last):
"""Remove A-weighting from A-weighted signal.
"""
return levels - a_weighting(first, last)
[docs]def z2c(levels, first, last):
"""Apply C-weighting to Z-weighted signal.
"""
return levels + c_weighting(first, last)
[docs]def c2z(levels, first, last):
"""Remove C-weighting from C-weighted signal.
"""
return levels - c_weighting(first, last)
[docs]def a2c(levels, first, last):
"""Go from A-weighted to C-weighted.
"""
dB = a2z(levels, first, last)
return z2c(dB, first, last)
[docs]def c2a(levels, first, last):
"""Go from C-weighted to A-weighted.
"""
dB = c2z(levels, first, last)
return z2a(dB, first, last)
__all__ = [
'THIRD_OCTAVE_A_WEIGHTING',
'THIRD_OCTAVE_C_WEIGHTING',
'a_weighting',
'c_weighting',
'z2a',
'a2z',
'z2c',
'c2z',
'a2c',
'c2a',
]