This project provides estimators for the generalized cross correlation according to Knapp and Carter 1976 [KC76].
The generalized Estimator can be described by
where denotes the cross power spectrum of and . In this project, all estimates are computed in the spectral domain using the Wiener-Kinchin relations (e.g. ).
Following estimators are implemented:
This repo uses a pyproject.toml
file generated with the dependency and package managing tool poetry.
This package can be installed with an up to date pip
pip install .
or using poetry
poetry install
otherwise use your own favorite way to install/use the code in your environment.
import numpy as np
import matplotlib.pylab as plt
from gccestimating import GCC, corrlags
# generate some noise signals
nsamp = 1024
noise1 = 0.5*np.random.randn(nsamp)
sig1 = np.zeros(nsamp) + noise1
noise2 = 0.5*np.random.randn(nsamp)
sig2 = np.zeros_like(sig1) + noise2
noise_both = np.random.randn(256)
sig1[:256] = noise_both
sig2[500:756] = noise_both
# create a lags array
lags = corrlags(2*nsamp-1, samplerate=1)
# Create the a GCC instance
gcc = GCC(sig1, sig2)
def mkplot(est, p):
plt.subplot(p)
plt.plot(lags, est.sig, label=est.name)
plt.legend()
# calculate the standard cc estimate
cc_est = gcc.cc()
# plot it using the mkplot function
mkplot(cc_est, 611)
# plot the other estimates
mkplot(gcc.scot(), 612)
mkplot(gcc.phat(), 613)
mkplot(gcc.roth(), 614)
mkplot(gcc.ht(), 615)
mkplot(gcc.eckart(noise_both, noise1, noise2), 616)
# compare cc to the timedomain based
# implementation from Numpy
# you will see: very close (errors < 1e-13)
plt.figure()
plt.plot(np.correlate(sig1, sig2, 'full'))
plt.plot(gcc.cc())
plt.show()
[KC76]: Knapp and Carter, "The Generalized Correlation Method for Estimation of Time Delay", IEEE Trans. Acoust., Speech, Signal Processing, August, 1976