Для прямого (многомерного) алгоритма FFTW вы можете указать, что вход numpy.ndarray
является действительным, а вывод должен быть сложным.Это делается при создании выровненных по байту массивов, которые идут в аргументах fft_object
:
import numpy as np
import pyfftw
N = 256 # Input array size (preferrably 2^{a}*3^{b}*5^{c}*7^{d}*11^{e}*13^{f}, (e+f = 0,1))
dx = 0.1 # Spacing between mesh points
a = pyfftw.empty_aligned((N, N), dtype='float64')
b = pyfftw.empty_aligned((N, N//2+1), dtype='complex128')
fft_object = pyfftw.FFTW(a, b, axes=(0, 1), direction='FFTW_FORWARD')
Выходной массив не симметричен, а вторая ось усекается до положительных частот.Для сложного БПФ вы можете вычислить лапласиан со следующим np.ndarray
kx, ky = np.meshgrid(np.fft.fftfreq(N, dx), np.fft.fftfreq(N, dx)) # Wave vector components
k2 = -4*np.pi**2*(kx*kx+ky*ky) # np.ndarray for the Laplacian operator in "frequency space"
Как это будет сделано в усеченном случае?Я думал об использовании:
kx, ky = np.meshgrid(np.fft.fftfreq(N//2+1, dx), np.fft.fftfreq(N, dx)) # The axes conven-
# tions are different
Но будет ли это действительно работать?Похоже, что он пренебрегает отрицательными частотами в направлении "у".