Source code for RCAIDE.Library.Methods.Noise.Metrics.Equivalent_SENEL_SEL_noise_metrics

# RCAIDE/Methods/Noise/Metrics/Equivalent_SENEL_SEL_noise_metrics.py
# 
# 
# Created:  Jul 2023, M. Clarke  

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------  
# RCAIDE imports 
from RCAIDE.Framework.Core import Units 
from RCAIDE.Library.Methods.Noise.Common.background_noise   import background_noise

# Python package imports   
import numpy as np  
    
# ----------------------------------------------------------------------------------------------------------------------  
#  Equivalent_SENEL_SEL_noise_metrics
# ----------------------------------------------------------------------------------------------------------------------       
[docs] def Equivalent_SENEL_SEL_noise_metrics(noise_data, flight_times = ['12:00:00'],time_period = ['06:00:00','20:00:00']): """This method calculates the Average A-weighted Sound Level (LAeqT), the Day-Night Average Sound Level and the Single Event Noise Exposure Level (SENEL) or Sound Exposure Level (SEL) Assumptions: Flights occure between 6:00 and 9:00 pm (i.e. a 15 hour window) Source: None Inputs: noise_data - post-processed noise data structure Outputs: [dB] noise_data - post-processed noise data structure Properties Used: N/A """ # determine start and end of time period DNL_time_period = ['07:00:00','20:00:00'] t_7am = float(DNL_time_period[0].split(':')[0])*60*60 + float(DNL_time_period[0].split(':')[1])*60 + float(DNL_time_period[0].split(':')[2]) t_10pm = float(DNL_time_period[1].split(':')[0])*60*60 + float(DNL_time_period[1].split(':')[1])*60 + float(DNL_time_period[1].split(':')[2]) t_start = float(time_period[0].split(':')[0])*60*60 + float(time_period[0].split(':')[1])*60 + float(time_period[0].split(':')[2]) t_end = float(time_period[1].split(':')[0])*60*60 + float(time_period[1].split(':')[1])*60 + float(time_period[1].split(':')[2]) SPL = noise_data.SPL_dBA N_gm_y = noise_data.microphone_y_resolution N_gm_x = noise_data.microphone_x_resolution flight_time = noise_data.time time_step = flight_time[1]-flight_time[0] number_of_flights = len(flight_times) duration = t_end - t_start p_div_p_ref_sq_L_eq = np.zeros((N_gm_x,N_gm_y)) p_div_p_ref_sq_L_24hr = np.zeros((N_gm_x,N_gm_y)) p_div_p_ref_sq_L_dn = np.zeros((N_gm_x,N_gm_y)) ambient_noise_duration = t_end - t_start ambient_noise_duration_24hr = 24 * Units.hrs for i in range(number_of_flights): t_flight_during_day = float(flight_times[i].split(':')[0])*60*60 + float(flight_times[i].split(':')[1])*60 + float(flight_times[i].split(':')[2]) + flight_time # compute ambient noise duration ambient_noise_duration -= flight_time[-1] ambient_noise_duration_24hr -= flight_time[-1] # create noise penalty noise_penality = np.zeros((len(flight_time),N_gm_x,N_gm_y)) noise_penality[t_flight_during_day<t_7am] = 10 noise_penality[t_flight_during_day>t_10pm] = 10 # convert SPL to pressure and multiply by duration p_sq_ref_flight_sq = np.nansum(time_step * (10**(SPL/10)), axis=0) p_sq_ref_flight_sq_dn = np.nansum(time_step * (10**( (noise_penality + SPL)/10)), axis=0) # add to current p_div_p_ref_sq_L_eq = np.nansum(np.concatenate((p_sq_ref_flight_sq[:,:,None],p_div_p_ref_sq_L_eq[:,:,None]),axis = 2), axis =2) p_div_p_ref_sq_L_24hr = np.nansum(np.concatenate((p_sq_ref_flight_sq[:,:,None],p_div_p_ref_sq_L_24hr[:,:,None]),axis = 2), axis =2) p_div_p_ref_sq_L_dn = np.nansum(np.concatenate((p_sq_ref_flight_sq_dn[:,:,None],p_div_p_ref_sq_L_dn[:,:,None]),axis = 2), axis =2) # add on background noise for remainder of time ambient_noise_duration = np.maximum(ambient_noise_duration,0) ambient_noise_duration_24hr = np.maximum(ambient_noise_duration_24hr,0) p_div_p_ref_sq_L_eq += ambient_noise_duration * (10**(background_noise()/10)) p_div_p_ref_sq_L_24hr += ambient_noise_duration_24hr * (10**(background_noise()/10)) p_div_p_ref_sq_L_dn += ambient_noise_duration * (10**(background_noise()/10)) noise_data.L_eq = 10*np.log10((1/(t_end-t_start))*p_div_p_ref_sq_L_eq) noise_data.L_eq_24hr = 10*np.log10((1/(24*Units.hours))*p_div_p_ref_sq_L_24hr) noise_data.L_dn = 10*np.log10((1/(t_end-t_start))*p_div_p_ref_sq_L_dn) # Compute Day-Night Sound Level and Noise Equivalent Noise SPL_max = np.max(SPL,axis = 0) p_sq_ref_flight_sq_SEL = time_step * (10**(SPL/10)) # subtract 10 db to get bounds SPL_max_min10 = SPL_max - 10 time_history = np.tile(flight_time[:,None,None], (1,len(SPL[0,:,0]),len(SPL[0,0,:]))) t_window = np.ma.masked_array(time_history, SPL >SPL_max_min10) t_interval = t_window[-1] - t_window[0] # mask all noise values that are lower than L-10 level P0 = np.ma.masked_array(p_sq_ref_flight_sq_SEL, SPL >SPL_max_min10) P0_tot = np.nansum((1/(t_interval))*P0, axis=0) SENEL = 10*np.log10(P0_tot) noise_data.SENEL = SENEL return