Как реализовать взаимную корреляцию Pytorch 1D для длинных сигналов в области Фурье? - PullRequest
1 голос
/ 22 июня 2019

У меня есть серия сигналов длиной n = 36000, для которых мне нужно выполнить кросс-корреляцию.В настоящее время моя реализация процессора в numpy немного медленная.Я слышал, что Pytorch может значительно ускорить тензорные операции и предоставляет способ параллельного выполнения вычислений на GPU.Я хотел бы изучить эту опцию, но я не совсем уверен, как это сделать с помощью каркаса.

Из-за длины этих сигналов я бы предпочел выполнить операцию кросс-корреляции на частотедомен.

Обычно, используя numpy, я выполняю эту операцию следующим образом:

import numpy as np

signal_length=36000

# make the signals
signal_1 = np.random.uniform(-1,1, signal_length)
signal_2 = np.random.uniform(-1,1, signal_length)

# output target length of crosscorrelation
x_cor_sig_length = signal_length*2 - 1

# get optimized array length for fft computation
fast_length = np.fftpack.next_fast_len(x_cor_sig_length)

# move data into the frequency domain. axis=-1 to perform 
# along last dimension
fft_1 = np.fft.rfft(src_data, fast_length, axis=-1)
fft_2 = np.fft.rfft(src_data, fast_length, axis=-1)

# take the complex conjugate of one of the spectrums. Which one you choose depends on domain specific conventions
fft_1 = np.conj(fft_1)


fft_multiplied = fft_1 * fft_2

# back to time domain. 
prelim_correlation = np.fft.irfft(result, x_corr_sig_length, axis=-1)

# shift the signal to make it look like a proper crosscorrelation,
# and transform the output to be purely real

final_result = np.real(np.fft.fftshift(prelim_correlation),axes=-1)).astype(np.float64)

Глядя на документацию по Pytorch, похоже, что для numpy.conj () нет эквивалента.Я также не уверен, если / как мне нужно реализовать fftshift после операции irfft.

Итак, как бы вы написали одномерную кросс-корреляцию в Pytorch с использованием метода Фурье?

1 Ответ

0 голосов
/ 22 июня 2019

На самом деле, посмотрите conv1d , где написано:

where ⋆\star⋆ is the valid cross-correlation operator,

На самом деле, даже если это называется сверткой, это взаимная корреляция.

...