用FFT实现二维场的三维阵列表示

2024-06-16 10:58:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要得到复域的傅里叶变换。我用的是python。在

我的输入是xy平面电场的二维快照。在

我现在有一个3D数组F[x][y][z],其中F[x][y][0]包含实际组件,F[x][y]1包含字段的复杂组件。在

我当前的代码非常简单,可以执行以下操作:

result=np.fft.fftn(F)
result=np.fft.fftshift(result)

我有以下问题:

1)这是否正确地计算了场的傅里叶变换,还是应该将该场作为二维矩阵输入,每个元素都包含实分量和虚分量?在

2)我只使用实数倍数输入字段的复合分量值(即,如果复数值是6i,我输入了6),这是正确的还是应该作为复数值输入(即输入为“6j”)?在

3)由于这在技术上是一个二维输入字段,我是否应该使用np.fft.fft2相反呢?这样做意味着输出不集中在中间。在

4)输出看起来不像我期望的F的fourier变换,我不确定我做错了什么。在

完整示例代码:

^{pr2}$

图F给出了: F

与np.fft.fftn,最后显示的图像是: fftn

和np.fft.fft2: fft2

这两个看起来都不像我期望的F的傅里叶变换。在


Tags: 代码fftnp组件数组result快照平面
2条回答

我在这里添加另一个答案,适合添加的代码。在

答案仍然是np.fft.fft2()。这里有一个例子。我稍微修改了代码。为了验证我们是否需要fft2我丢弃了其中一个斑点,然后我们知道单个高斯斑点应该转换为高斯斑点(具有特定相位,在绘制绝对值时不会显示)。我还减小了标准差,这样频率响应会变宽一点。在

代码:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.meshgrid(np.linspace(-1,1,100), np.linspace(-1,1,100))
d = np.sqrt(x**2+y**2)
sigma, mu = .1, 0.0
g1 = np.exp(-( (d-mu)**2 / ( 2.0 * sigma**2 ) ) )
N = 300
positions = [ [150,100] ]#, [150,200] ]
sz2 = [int(x/2) for x in g1.shape]
F_2D = np.zeros([N,N])
for x0,y0 in positions:
    F_2D[ x0-sz2[0]: x0+sz2[0], y0-sz2[1]:y0+sz2[1] ] = g1 + 1j*0.

result = np.fft.fftshift(np.fft.fft2(F_2D))

plt.subplot(211); plt.imshow(F_2D)
plt.subplot(212); plt.imshow(np.absolute(result))
plt.title('$\sigma$=.1')
plt.show()

结果:

Example result 1

为了回到原来的问题,我们只需要改变

positions = [ [150,100] , [150,200] ]sigma=.35而不是sigma=.1。在

您应该使用复杂的numpy变量(通过使用1j)并使用fft2。例如:

N = 16
x0 = np.random.randn(N,N,2)
x = x0[:,:,0] + 1j*x0[:,:,1]
X = np.fft.fft2(x)

x0上使用fftn将执行3D FFT,使用fft将执行矢量1D FFT。在

相关问题 更多 >