本文中的Python代码是根据Matlab中xcorr函数的转写,不过只是复现了x,y均为复数的情况的结果,结果与Matlab一致。代码如下:
def xcorr(x, y):
maxlag = np.maximum(np.size(x), np.size(y)) - 1
c = crosscorr(x, y, maxlag)
return c
def crosscorr(x, y, maxlag):
# Compute cross-correlation for vector inputs. Output is clipped based on
# maxlag but not padded if maxlag >= max(size(x,1),size(y,1)).
nx = np.size(x)
ny = np.size(y)
m = np.maximum(nx, ny)
maxlagDefault = m - 1
mxl = np.maximum(maxlag, maxlagDefault)
m2 = findTransformLength(m)
X = np.fft.fft(x, m2, 0)
Y = np.fft.fft(y, m2, 0)
c1 = np.fft.ifft(X * np.conj(Y), n=None, axis=0)
# Keep only the lags we want and move negative lags before positive
# lags.
c = np.hstack((c1[m2 - mxl + np.arange(mxl)], c1[0:mxl + 1]))
return c
def findTransformLength(mm):
m = 2 * mm
while True:
r = m
for p in [2, 3, 5, 7]:
while (r > 1) and (r % p == 0):
r = r / p
if r == 1:
break
m = m + 1
return m