В документации команды numpy.correlate говорится, что взаимная корреляция двух массивов вычисляется как общее определение для обработки сигналов следующим образом:
z[k] = sum_n a[n] * conj(v[n+k])
Похоже, это не так. Похоже, корреляция перевернута. Это означало бы, что либо знак в последнем члене формулы меняется
z[k] = sum_n a[n] * conj(v[n-k])
или что два входных вектора находятся в неправильном порядке. Простая реализация данной формулы будет:
x = [1.0, 2.0, 3.0]
y = [0.0, 0.5, 2.0]
y_padded = numpy.append( [0.0, 0.0] , y)
y_padded = numpy.append(y_padded, [0.0, 0.0] )
crosscorr_numpy = numpy.correlate(x, y, mode='full')
crosscorr_self = numpy.zeros(5)
for k in range(5):
for i in range(3):
crosscorr_self[k] += x[i] * y_padded[i+k]
print crosscorr_numpy
print crosscorr_self
Вы можете легко увидеть, что результирующий вектор имеет неправильный порядок. Я был очень сбит с толку, когда это не дало ожидаемых результатов, и я почти уверен (после обсуждения этого с моими коллегами), что это ошибка.