Функция scipy.fftpack.rfft
возвращает ДПФ в виде вектора с плавающей запятой, чередуя действительную и комплексную части. Это означает, что для совместного умножения на ДПФ (для свертки) мне придется выполнять сложное умножение «вручную», что кажется довольно сложным. Это должно быть то, что люди делают часто - я предполагаю/надеюсь, что есть простой трюк, позволяющий сделать это эффективно, которого я не заметил?
В основном я хочу исправить этот код, чтобы оба метода давали один и тот же ответ:
import numpy as np
import scipy.fftpack as sfft
X = np.random.normal(size = 2000)
Y = np.random.normal(size = 2000)
NZ = np.fft.irfft(np.fft.rfft(Y) * np.fft.rfft(X))
SZ = sfft.irfft(sfft.rfft(Y) * sfft.rfft(X)) # This multiplication is wrong
NZ
array([-43.23961083, 53.62608086, 17.92013729, ..., -16.57605207,
8.19605764, 5.23929023])
SZ
array([-19.90115323, 16.98680347, -8.16608202, ..., -47.01643274,
-3.50572376, 58.1961597 ])
Н.Б. Я знаю, что fftpack содержит функцию convolve
, но мне нужно преобразовать только половину преобразования — мой фильтр может быть преобразован один раз заранее, а затем использоваться снова и снова.