def qtransform(fseries, Q, f0): """Calculate the energy 'TimeSeries' for the given fseries Parameters ---------- fseries: 'pycbc FrequencySeries' frequency-series data set Q: q value f0: central frequency Returns ------- norm_energy: '~pycbc.types.aligned.ArrayWithAligned' A 'TimeSeries' of the normalized energy from the Q-transform of this tile against the data. cenergy: '~pycbc.types.aligned.ArrayWithAligned' A 'TimeSeries' of the complex energy from the Q-transform of this tile against the data. """ # q-transform data for each (Q, frequency) tile # initialize parameters qprime = Q / 11**(1 / 2.) # ... self.qprime dur = 1.0 / fseries.delta_f # check for sampling rate sampling = (len(fseries) - 1) * 2 * fseries.delta_f # choice of output sampling rate output_sampling = sampling # Can lower this to highest bandwidth output_samples = int(dur * output_sampling) # window fft window_size = 2 * int(f0 / qprime * dur) + 1 # get start and end indices start = int((f0 - (f0 / qprime)) * dur) end = int(start + window_size) # apply window to fft # normalize and generate bi-square window norm = np.sqrt(315. * qprime / (128. * f0)) windowed = fseries[start:end].numpy() * (bisquare(window_size) * norm) # pad data, move negative frequencies to the end, and IFFT padded = np.pad(windowed, padding(window_size, output_samples), mode='constant') wenergy = npfft.ifftshift(padded) # return a 'TimeSeries' wenergy = FrequencySeries(wenergy, delta_f=1. / dur) cenergy = TimeSeries(zeros(output_samples, dtype=np.complex128), delta_t=1. / sampling) ifft(wenergy, cenergy) energy = cenergy.squared_norm() medianenergy = np.median(energy.numpy()) norm_energy = energy / float(medianenergy) return norm_energy, cenergy
def qseries(fseries, Q, f0, return_complex=False): """Calculate the energy 'TimeSeries' for the given fseries Parameters ---------- fseries: 'pycbc FrequencySeries' frequency-series data set Q: q value f0: central frequency return_complex: {False, bool} Return the raw complex series instead of the normalized power. Returns ------- energy: '~pycbc.types.TimeSeries' A 'TimeSeries' of the normalized energy from the Q-transform of this tile against the data. """ # normalize and generate bi-square window qprime = Q / 11**(1 / 2.) norm = numpy.sqrt(315. * qprime / (128. * f0)) window_size = 2 * int(f0 / qprime * fseries.duration) + 1 xfrequencies = numpy.linspace(-1., 1., window_size) start = int((f0 - (f0 / qprime)) * fseries.duration) end = int(start + window_size) center = (start + end) / 2 windowed = fseries[start:end] * (1 - xfrequencies**2)**2 * norm tlen = (len(fseries) - 1) * 2 windowed.resize(tlen) windowed = numpy.roll(windowed, -center) # calculate the time series for this q -value windowed = FrequencySeries(windowed, delta_f=fseries.delta_f, epoch=fseries.start_time) ctseries = TimeSeries(zeros(tlen, dtype=numpy.complex128), delta_t=fseries.delta_t) ifft(windowed, ctseries) if return_complex: return ctseries else: energy = ctseries.squared_norm() medianenergy = numpy.median(energy.numpy()) return energy / float(medianenergy)