我想使用numpy FFT2模块。
例如,我在离散网格中有函数值 x =(0,1,2,3,4,5),y =(0,1,2,3,4,5),z = exp(x + y) 所以我的代码将是
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,5,6)
y=np.linspace(0,5,6)
xmesh,ymesh=np.meshgrid(x,y)
z=np.exp(xmesh+ymesh)
plt.scatter(xmesh.ravel(),ymesh.ravel(),z.ravel())
plt.show()
这显示图像如 现在,我想使用傅立叶变换将其转换为k空间。 对于z值,我刚使用
fft_z=np.fft.fft2(z)
但我如何确定其域名? 要绘制如上所示的散点图(事实上,我将绘制热图),我必须这样做 确定这些fft_z值所在的位置,并像上面的代码一样在k空间中创建meshgrid。
答案 0 :(得分:1)
您可以使用np.fft.fftfreq
自动生成频域。
提醒一下,频率和时域之间的关系是
df = 1 /(N * dt),1 / dt是频域的全带宽(BW)。
重要的是要注意fftfreq从-BW / 2到BW / 2生成一个数组,但这是非常规的方式。从0到BW / 2,-BW / 2到-df。这是因为离散傅立叶变换的周期性,因此数据将以零为中心显示。在绘图之前,您可以使用np.fft.fftshift来实现数据。你可以看到一个例子。
fft_z = np.fft.fftshift(np.fft.fft2(z))
fx = np.fft.fftshift(np.fft.fftfreq(x.shape[0],x[1]-x[0]))
fy = np.fft.fftshift(np.fft.fftfreq(y.shape[0],y[1]-y[0]))
您可以使用以下方式绘制结果:
plt.pcolormesh(fx,fy,fft_z.real)
OBS:fft_z.real取fft_z的实部,这是一个复数。同样可以用于虚部。 plt.pcolormesh(fx,fy,fft_z.imag)
希望有所帮助