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

Date

July 11, 2025

Defined Under Namespace

Modules: Constants

Constant Summary

Constants included from Constants

Constants::IMPULSE_CORRECTION_THRESHOLD, Constants::STANDARD_24H_PERIOD

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

L_r = L_AeqT + K_T + K_I dB

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



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 > L_lim + uncertainty)



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

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

According to version:

K_I = 6 dB if L_Cpeak 

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



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

L_total = 10 * log10( [Σ(t_i * 10^(0.1*L_i)] / T_total ) dB

Example:

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

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



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

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

According to Table 1:

Parameters:

  • delta_l (Float)

    Difference between tone level and background level (dB)

Returns:

  • (Float)

    Tonal adjustment factor in dB



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

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