levels

class description

class levels.Levels(**kwargs)[source]

Bases: openmdao.core.explicitcomponent.ExplicitComponent

Compute noise levels according to ICAO Annex 16 Volume I: Noise.

  • Sound pressure level (spl)

  • Overall sound pressure level (oaspl)

  • Perceived noise level, tone-corrected (pnlt)

  • Tone corrections (C)

The Levels component requires the following inputs:

  • inputs['rho_0']: ambient density [kg/m3]

  • inputs['c_0']: ambient speed of sound [m/s]

  • inputs['msap_prop']: mean-square acoustic pressure, propagated to the observer (re. rho_0^2c_0^2) [-]

The Levels component computes the following outputs:

  • outputs['spl']: sound pressure level [dB]

  • outputs['oaspl']: overall sound pressure level [dB]

  • outputs['pnlt']: perceived noise leve, tone corrected [PNdB]

  • outputs['C']: pnlt tone correction [dB]

The LevelsInt component has the following options:

  • settings: pyna settings

  • n_t: number of time steps in the noise time series

  • data: pyna noise data

compute(inputs: openmdao.vectors.default_vector.DefaultVector, outputs: openmdao.vectors.default_vector.DefaultVector)[source]

Compute outputs given inputs. The model is assumed to be in an unscaled state.

Parameters
  • inputs (Vector) – Unscaled, dimensional input variables read via inputs[key].

  • outputs (Vector) – Unscaled, dimensional output variables read via outputs[key].

  • discrete_inputs (dict or None) – If not None, dict containing discrete input values.

  • discrete_outputs (dict or None) – If not None, dict containing discrete output values.

initialize()[source]

Perform any one-time initialization run at instantiation.

setup()[source]

Declare inputs and outputs.

Available attributes:

name pathname comm options

Warning

The Julia version of the Levels component, levels.jl, is not documented yet. However, it is very similar to the Python version, levels.py. More information and examples on how OpenMDAO.jl components work can be found here.

theory

Sound pressure level

The sound pressure level (SPL) is calculated using:

\[SPL(\theta,\phi,f) = <p_{\textrm{prop}}^2>^* + \ 20\log_{10}\left[\frac{\rho_0 c_0^2}{p_{ref}}\right] \label{eq:SPL}\]

The reference pressure \(p_{\textrm{ref}} = 2\cdot 10^{-5}\).

Overall sound pressure level

The overall sound pressure level (OASPL) is calculated using:

\[OASPL(\theta,\phi) = 10\log_{10}\left[ \sum_{i=1}^{N_{freq}}\left( 10^{\frac{SPL(\theta,\phi,f)}{10}} \right) \right]\]

Tone-corrected perceived noise level

The tone-corrected perceived noise level (PNLT) is calculated using the method described in ICAO Annex 16, Volume I cite{ICAO2017}. The PNLT calculation at each time step requires an SPL spectrum as a function of frequency. In this section, the SPL at the i-th one-third octave frequency band is denoted by \(SPL[i]\). Firstly, the SPL is converted into perceived noisiness:

\[\begin{split}n[i] = \begin{cases} 10^{m_c(SPL[i] - SPL_c[i])} \quad & \quad \textrm{if}\quad SPL_a[i] \leq SPL[i]\\ 10^{m_b(SPL[i] - SPL_b[i])} \quad & \quad \textrm{if}\quad SPL_b[i] \leq SPL[i] \leq SPL_a[i]\\ 0.3 \cdot 10^{m_e(SPL[i] - SPL_e[i])} \quad & \quad \textrm{if}\quad SPL_e[i] \leq SPL[i] \leq SPL_b[i]\\ 0.1 \cdot 10^{m_d(SPL[i] - SPL_d[i])} \quad & \quad \textrm{if}\quad SPL_d[i] \leq SPL[i] \leq SPL_e[i]\\ 0 \quad & \quad \textrm{otherwise}\\ \end{cases}\end{split}\]

The Noy tables (i.e. \(SPL_a\), \(SPL_b\), \(SPL_c\), \(SPL_d\), \(SPL_e\), \(m_b\), \(m_c\), \(m_d\), \(m_d\)) are tabulated online. The perceived noisiness values are combined to total perceived noisiness using:

\[N = \max(n) + 0.15\left( \sum_{i=1}^{24} - \max(n) \right)\]

The perceived noise level is computed using:

\[PNL = 40 \ + \ \frac{10}{\log_{10} 2} \log_{10} N\]

The corrections for spectral irregularities on the perceived noise level involve several steps. Step 1: compute the slopes of the SPL spectrum using:

\[\begin{split}s[i] = \begin{cases} N.A. \quad & \textrm{if} \quad i \leq 3\\ SPL[i] - SPL[i-1] \quad & \textrm{if} \quad \textrm{otherwise} \\ \end{cases}\end{split}\]

Step 2: Encircle the values of the slopes in the spectrum with a value larger than 5, i.e. \(|s[i] - s[i-1]| > 5\). Step 3: In the spectrum of SPL, encircle:

\[\begin{split}\begin{cases} \textrm{SPL[i]} \quad & \textrm{if} \quad \textrm{encircled value of slope} s[i] > 0 \ \textrm{and}\ s[i] > s[i-1] \\ \textrm{SPL[i-1]} \quad & \textrm{if} \quad \textrm{encircled value of slope} s[i] \leq 0 \ \textrm{and}\ s[i-1] > 0 \\ \textrm{nothing} \quad & \textrm{otherwise} \\ \end{cases}\end{split}\]

Step 4: Compute adjusted \(SPL\), i.e. \(SPL'\):

\[\begin{split}SPL'[i] = \begin{cases} SPL[i] \quad & \textrm{if} \quad \textrm{SPL[i] is not encircled}\\ 0.5(SPL[i-1]+SPL[i+1]) \quad & \textrm{if} \quad \textrm{SPL[i] is encircled}\\ SPL[23] + s[23] \quad & \textrm{if} \quad \textrm{i=24 and SPL[i] is encircled}\\ \end{cases}\end{split}\]

Step 5: Compute adjusted slopes \(s'\), including an ‘imaginary’ 25-th frequency band:

\[\begin{split}s'[i] = \begin{cases} s'[4] \quad & \textrm{if} \quad \textrm{i = 3}\\ SPL'[i+1]-SPL'[i]\quad & \textrm{if} \quad \textrm{i $\in $[4,24]}\\ s[24] \quad & \textrm{if} \quad \textrm{i = 25}\\ 0 \quad & \textrm{if} \quad \textrm{otherwise}\\ \end{cases}\end{split}\]

Step 6: Compute average of adjacent adjusted slopes:

\[\begin{split}\bar{s} = \begin{cases} \frac{1}{3}(s'[i] + s'[i+1] + s'[i+2])\quad & \textrm{if} \quad \textrm{i $\in$ [3,23]}\\ 0 \quad & \textrm{if} \quad \textrm{otherwise}\\ \end{cases}\end{split}\]

Step 7: Compute final adjusted SPL, i.e. \(SPL"\):

\[\begin{split}SPL"[i] = \begin{cases} SPL[i] \quad & \textrm{if} \quad \textrm{i=3}\\ SPL"[i-1] + \bar{s}[i-1] \quad & \textrm{if} \quad \textrm{i > 3}\\ 0 \quad & \textrm{if} \quad \textrm{otherwise}\\ \end{cases}\end{split}\]

Step 8: Compute differences \(F[i] = SPL[i]-SPL[i]"\). Step 9: Compute the tone corrections, \(C[i]\), using:

f[i] [Hz]

F[i] (Step 8)

C[i]

\(f[i]\in [50, 500)\)

\(3/2 \leq F[i] < 3\)

\(F[i]/3 - 1/2\)

\(.\)

\(3<F[i]<20\)

\(F/6\)

\(.\)

\(20 \leq F[i]\)

\(10/3\)

\(f[i]\in [500, 5000)\)

\(3/2 \leq F[i] < 3\)

\(F[i]/3 - 1\)

\(.\)

\(3 \leq F[i] < 20\)

\(F[i]/3\)

\(.\)

\(20 \leq F[i]\)

\(20/3\)

\(f[i]\in [5000, 10000]\)

\(3/2 \leq F[i] < 3\)

\(F/3 - 1/2\)

\(.\)

\(3 \leq F[i] < 20\)

\(F[i]/6\)

\(.\)

\(20 \leq F[i]\)

\(10/3\)

Step 10: Compute the largest tone-correction and add it to the perceived noise level to obtain the tone-corrected perceived noise level:

\[PNLT = PNL + \max_{i\in \mathcal{I}} C\]

When computing the maximum tone correction, the range of frequencies below 800Hz is ignored when enabling the TCF8001 flag.