import numpy as np def sp_jk(freq_bins, amp_spectra): # Calculate source parameters using J and K Snoke's integrals # with correction for the limited frequency band. The routine # ignores quality factor in calculations (ideally, the spectrum # should be corrected for attenuation before). # For each waveform, calculate the J and K integrals and source parameters. Av = amp_spectra * 2 * np.pi * freq_bins jf = (2 * np.trapz(Av ** 2, x=freq_bins) + 2 / 3 * (amp_spectra[0] * 2 * np.pi * freq_bins[0]) ** 2 * freq_bins[0] + 2 * (amp_spectra[-1] * 2 * np.pi * freq_bins[-1]) ** 2 * freq_bins[-1]) kf = (2 * np.trapz(amp_spectra ** 2, x=freq_bins) + 2 * amp_spectra[0] ** 2 * freq_bins[0] + 2 / 3 * amp_spectra[-1] ** 2 * freq_bins[-1]) # Calculation of spectral level and corner frequency mo = 2 * (kf ** 3 / jf) ** 0.25 # spectral level from Snoke's integrals fo = np.sqrt(jf / kf) / (2 * np.pi) # corner frequency return mo, fo