У меня есть серия сигналов длиной 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 с использованием метода Фурье?