Вычисление взаимной корреляции с возвратом обратного вывода fft

Я пытаюсь сопоставить два набора данных, взяв преобразование Фурье обоих и умножив сопряжение первого fft со вторым fft, прежде чем преобразовать обратно во временное пространство. Чтобы проверить свой код, я сравниваю вывод с выводом numpy.correlate. Однако, когда я рисую свой код (ограниченный определенным окном), кажется, что два сигнала идут в противоположных направлениях/отражаются около нуля.

Вот как выглядит мой вывод

Мой вывод

Мой код:

import numpy as np
import pyplot as plt

phl_data = np.sin(np.arange(0, 10, 0.1))
mlac_data = np.cos(np.arange(0, 10, 0.1))
N = phl_data.size
zeroes = np.zeros(N-1)
phl_data = np.append(phl_data, zeroes)
mlac_data = np.append(mlac_data, zeroes)

# cross-correlate x = phl_data, y = mlac_data:
# take FFTs:
phl_fft = np.fft.fft(phl_data)
mlac_fft = np.fft.fft(mlac_data)
# fft of cross-correlation
Cw = np.conj(phl_fft)*mlac_fft
#Cw = np.fft.fftshift(Cw)
# transform back to time space:
Cxy = np.fft.fftshift(np.fft.ifft(Cw))
times = np.append(np.arange(-N+1, 0, dt),np.arange(0, N, dt))

plt.plot(times, Cxy)
plt.xlim(-250, 250)

# test against convolving:
c = np.correlate(phl_data, mlac_data, mode='same')
plt.plot(times, c)
plt.show()

(оба набора данных были дополнены N-1 нулями)


person George    schedule 30.03.2019    source источник
comment
Скорее всего, вы получите ответы, если будет приведен минимальный воспроизводимый пример. Например, как выглядят данные?   -  person mnm    schedule 30.03.2019
comment
Прочтите Как создать минимальный, полный и проверяемый пример   -  person Sheldore    schedule 30.03.2019
comment
Я изменил свои данные на простой sin/cos и добавил их в свой код с обновленным изображением.   -  person George    schedule 30.03.2019


Ответы (1)


В документации к numpy.correlate объясняется это:

Эта функция вычисляет корреляцию, как обычно определяется в текстах обработки сигналов:

c_{av}[k] = sum_n a[n+k] * conj(v[n])

а также:

Примечания

Приведенное выше определение корреляции не является уникальным, и иногда корреляция может определяться по-другому. Другое распространенное определение:

c'_{av}[k] = sum_n a[n] conj(v[n+k])

который связан с c_{av}[k] через c'_{av}[k] = c_{av}[-k].

Таким образом, уникального определения не существует, и два общих определения приводят к обратному результату.

person Cris Luengo    schedule 30.03.2019