【发布时间】:2018-03-12 02:03:27
【问题描述】:
我需要得到一个复数域的傅里叶变换。我正在使用 python。
我的输入是 xy 平面中电场的 2D 快照。
我目前有一个 3D 数组 F[x][y][z] 其中 F[x][y][0] 包含实部,F[x][y]1 包含复数领域。
我当前的代码很简单,就是这样做的:
result=np.fft.fftn(F)
result=np.fft.fftshift(result)
我有以下问题:
1) 这是否正确计算了场的傅立叶变换,还是应该将场作为 2D 矩阵输入,每个元素都包含实部和虚部?
2) 我仅使用实数倍数输入了字段的复分量值(即,如果复数值是 6i,我输入了 6),这是正确的还是应该作为复数值输入(即输入为 ' 6j')?
3) 由于这在技术上是一个 2D 输入字段,我应该使用 np.fft.fft2 代替吗?这样做意味着输出不在中间。
4) 输出看起来不像我期望的 F 的傅立叶变换的样子,我不确定我做错了什么。
完整示例代码:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
x, y = np.meshgrid(np.linspace(-1,1,100), np.linspace(-1,1,100))
d = np.sqrt(x*x+y*y)
sigma, mu = .35, 0.0
g1 = np.exp(-( (d-mu)**2 / ( 2.0 * sigma**2 ) ) )
F=np.empty(shape=(300,300,2),dtype=complex)
for x in range(0,300):
for y in range(0,300):
if y<50 or x<100 or y>249 or x>199:
F[x][y][0]=g1[0][0]
F[x][y][1]=0j
elif y<150:
F[x][y][0]=g1[x-100][y-50]
F[x][y][1]=0j
else:
F[x][y][0]=g1[x-100][y-150]
F[x][y][1]=0j
F_2D=np.empty(shape=(300,300))
for x in range(0,300):
for y in range(0,300):
F_2D[x][y]=np.absolute(F[x][y][0])+np.absolute(F[x][y][1])
plt.imshow(F_2D)
plt.show()
result=np.fft.fftn(F)
result=np.fft.fftshift(result)
result_2D=np.empty(shape=(300,300))
for x in range(0,300):
for y in range(0,300):
result_2D[x][y]=np.absolute(result[x][y][0])+np.absolute(result[x][y][1])
plt.imshow(result_2D)
plt.show()
这些看起来都不像我所期望的 F 的傅立叶变换。
【问题讨论】:
-
你应该使用
F[x][y][0]而不是F[x,y,0] -
为此更新了我的代码,输出没有改变