obspy.signal.cross_correlation.correlate¶
- correlate(a, b, shift, demean=True, normalize=True, domain='freq')[source]¶
Cross-correlation of signals a and b with specified maximal shift.
Parameters: - a (ndarray, Trace) first signal
- b (ndarray, Trace) second signal to correlate with first signal
- shift (int) Number of samples to shift for cross correlation. The cross-correlation will consist of 2*shift+1 or 2*shift samples. The sample with zero shift will be in the middle.
- demean (bool) Demean data beforehand.
- normalize (bool) Normalize cross-correlation. A perfect correlation will correspond to the value 1.
- domain (str) Correlation will be performed in frequency domain with scipy.signal.fftconvolve() for domain='freq' and in time domain with scipy.signal.correlate() for domain='time'.
Returns: cross-correlation function.
To calculate shift and value of the maximum of the returned cross-correlation function use xcorr_max().
Note
For most input parameters cross-correlation in frequency domain is much faster. Only for small values of shift (⪅100) time domain cross-correlation migth save some time.
Note
If the signals have different length, they will be aligned around their middle. The sample with zero shift in the cross-correlation function corresponds to this correlation:
--aaaa-- bbbbbbbb
For odd len(a)-len(b) the cross-correlation function will consist of only 2*shift samples because a shift of 0 corresponds to the middle between two samples.
Example
>>> a = np.random.randn(10000).astype(np.float32) >>> cc = correlate(a, a, 1000) >>> shift, value = xcorr_max(cc) >>> shift 0 >>> round(value, 5) 1.0 >>> b = np.roll(a, 20) # shift a by 20 samples >>> cc = correlate(a, b, 1000) >>> shift, value = xcorr_max(cc) >>> shift -20 >>> round(value, 2) 1.0