对于正向(多维)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')
输出阵列不是对称的,第二轴被截断到正频率。对于复杂的FFT,可以用以下公式计算laplacian
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
但是,这真的有用吗?它似乎忽略了“y”方向的负频率。
最佳答案
我不熟悉pyfftw
,但对于numpy.fft
模块,它会工作得很好(假设您使用注释中提到的rfftfreq
)。
概括地说:对于实数组,a
,fourier变换具有类似Hermtian的性质:b
是b(-kx,-ky)
的复共轭。
前向fft的真实版本通过省略负的b(kx,ky)
s来丢弃(大多数)冗余信息。后向fft的真实版本假设通过对适当的元素进行复共轭可以找到丢失频率处的值。
如果使用了复fft并保留了所有频率,ky
仍将具有类似于Hermitian的特性。因此,实际的反向fft所作的假设仍然成立,并将给出正确的答案。
我想使用-k2 * b
可以很好地工作,只要为pyfftw
情况的输出指定一个大小正确的float64
数组。