2024-12-30 用noise level量取coda duration

def rms_envelope(data,window_size):
    
    envelope = np.abs(scipy.signal.hilbert(data))
    rms_envelope = np.sqrt(np.convolve(envelope**2, np.ones(window_size) / window_size, mode='valid'))

    return rms_envelope

def noi2duration(data, pick_df, win):
    Env = np.zeros((4929, data.shape[1]-win+1))
    Du = np.zeros(4929)*np.nan
    Chs = np.zeros(4929)*np.nan
    # Ch = []
    for i, tr in enumerate(data):
        env = rms_envelope(tr, win)
        Env[i] = env
        phase_types = pick_df[(pick_df['ch']==i)]['phase_type']
        if ('P' in phase_types.values) and ('S' in phase_types.values):
            # Ch.append(i)
            p_pick = pick_df[(pick_df['ch']==i)&(pick_df['phase_type']=='P')]['phase_index']
            s_pick = pick_df[(pick_df['ch']==i)&(pick_df['phase_type']=='S')]['phase_index']
            p_pick = np.array(p_pick)[0]
            s_pick = np.array(s_pick)[0]
            n_slice = env[p_pick-1000:p_pick-200] # 2 - 10 s before p_pick 
            n_level = np.mean(n_slice)
            coda_slice = env[s_pick:]
            if np.argwhere(coda_slice-n_level<=0).size>=1:
                t2s = np.argwhere(coda_slice-n_level<=0)[0][0]
                s2p = s_pick - p_pick
                tau = (t2s+s2p)/100
                Chs[i] = i
                # Ch.append(i)
                Du[i] = tau
        else:
            continue
    return Env, Du, Chs
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容