Module: ISO_1996::Withdrawn::Part_3_1987

Includes:
Constants
Defined in:
lib/iso_1996/withdrawn/part_3_1987.rb

Overview

ISO 1996-3:1987 Application to Noise Limits

Module implementing calculations defined in ISO 1996-3:1987: “Acoustics - Description, measurement and assessment of environmental noise - Part 3: Application to noise limits”

Author:

  • Maciej Ciemborowicz

Since:

  • 2025-07-11

Defined Under Namespace

Modules: Constants

Class Method Summary collapse

Class Method Details

.assessment_level(l_aeq_t, k_t, k_i) ⇒ Float

Calculate assessment level (L_r) as defined in Section 8

Parameters:

  • l_aeq_t (Float)

    Equivalent continuous A-weighted sound pressure level (dB)

  • k_t (Float)

    Tonal adjustment factor (dB)

  • k_i (Float)

    Impulsive adjustment factor (dB)

Returns:

  • (Float)

    Assessment level in dB

Since:

  • 2025-07-11



78
79
80
# File 'lib/iso_1996/withdrawn/part_3_1987.rb', line 78

def self.assessment_level(l_aeq_t, k_t, k_i)
  l_aeq_t + k_t + k_i
end

.compliance_evaluation(l_r, noise_limit, measurement_uncertainty) ⇒ Boolean

Evaluate compliance with noise limits as defined in Section 9

Parameters:

  • l_r (Float)

    Assessment level (dB)

  • noise_limit (Float)

    Noise limit value (dB)

  • measurement_uncertainty (Float)

    Measurement uncertainty (dB)

Returns:

  • (Boolean)

    True if limit is exceeded (L_r > noise_limit + measurement_uncertainty)

Since:

  • 2025-07-11



90
91
92
# File 'lib/iso_1996/withdrawn/part_3_1987.rb', line 90

def self.compliance_evaluation(l_r, noise_limit, measurement_uncertainty)
  l_r > noise_limit + measurement_uncertainty
end

.impulsive_adjustment_factor(l_cpeak, is_highly_annoying: false) ⇒ Float

Note:

Returns 6 dB if L_Cpeak ≥ 130 dB OR noise is highly annoying, otherwise 0 dB

Determine impulsive adjustment factor (K_I) as defined in Section 7.2

Parameters:

  • l_cpeak (Float)

    C-weighted peak sound pressure level (dB)

  • is_highly_annoying (Boolean) (defaults to: false)

    Whether noise is subjectively assessed as highly annoying

Returns:

  • (Float)

    Impulsive adjustment factor in dB

Since:

  • 2025-07-11



64
65
66
# File 'lib/iso_1996/withdrawn/part_3_1987.rb', line 64

def self.impulsive_adjustment_factor(l_cpeak, is_highly_annoying: false)
  (l_cpeak >= Constants::IMPULSE_CORRECTION_THRESHOLD || is_highly_annoying) ? 6.0 : 0.0
end

.time_period_conversion(period_levels, total_period: Constants::STANDARD_24H_PERIOD) ⇒ Float

Convert sound levels between time periods as defined in Annex A

Examples:

Convert day and night levels to 24-hour equivalent

periods = [
  {level: 65.0, duration: 16}, # Day
  {level: 55.0, duration: 8}   # Night
]
Part_3_1987.time_period_conversion(periods) # => ~62.1

Parameters:

  • period_levels (Array<Hash>)

    Array of hashes with :level (dB) and :duration (hours)

  • total_period (Float) (defaults to: Constants::STANDARD_24H_PERIOD)

    Total time period for normalization (hours)

Returns:

  • (Float)

    Equivalent sound level for total period in dB

Since:

  • 2025-07-11



110
111
112
113
# File 'lib/iso_1996/withdrawn/part_3_1987.rb', line 110

def self.time_period_conversion(period_levels, total_period: Constants::STANDARD_24H_PERIOD)
  energy_sum = period_levels.sum { |period| period[:duration] * (10 ** (period[:level] / 10.0)) }
  10 * Math.log10(energy_sum / total_period)
end

.tonal_adjustment_factor(delta_l) ⇒ Float

Note:

According to Table 1: - ΔL ≥ 15 dB → 6 dB - 10 ≤ ΔL ≤ 14 dB → 5 dB - 5 ≤ ΔL ≤ 9 dB → 2 dB - ΔL < 5 dB → 0 dB

Determine tonal adjustment factor (K_T) as defined in Section 6 and Table 1

Parameters:

  • delta_l (Float)

    Difference between tone level and background level (dB)

Returns:

  • (Float)

    Tonal adjustment factor in dB

Since:

  • 2025-07-11



46
47
48
49
50
51
52
53
# File 'lib/iso_1996/withdrawn/part_3_1987.rb', line 46

def self.tonal_adjustment_factor(delta_l)
  case delta_l
  when 15..Float::INFINITY then 6.0
  when 10..14 then 5.0
  when 5..9  then 2.0
  else 0.0
  end
end