2d fft numpy / python混乱

时间:2016-08-29 07:41:59

标签: python numpy fft

我有x-y-z形式的数据,想要沿x-y创建一个功率谱。这是我发布的一个基本示例,用于检查我的实际数据可能出错:

import numpy as np
from matplotlib import pyplot as plt

fq = 10; N = 20
x = np.linspace(0,8,N); y = x
space = x[1] -x[0]

xx, yy = np.meshgrid(x,y)
fnc = np.sin(2*np.pi*fq*xx)
ft = np.fft.fft2(fnc)
ft = np.fft.fftshift(ft)

freq_x  = np.fft.fftfreq(ft.shape[0], d=space)
freq_y  = np.fft.fftfreq(ft.shape[1], d=space)
plt.imshow(
    abs(ft),
    aspect='auto',
    extent=(freq_x.min(),freq_x.max(),freq_y.min(),freq_y.max())
)
plt.figure()
plt.imshow(fnc)

这导致以下function& frequency数字频率不正确。感谢。

1 个答案:

答案 0 :(得分:2)

你的一个问题是matplotlib的imshow使用了与你期望的不同的坐标系。提供origin='lower'参数,峰值现在显示在y=0,正如预期的那样。

你遇到的另一个问题是fftfreq需要告诉你的时间步长,在你的情况下是8 / (N - 1)

import numpy as np
from matplotlib import pyplot as plt

fq = 10; N = 20
x = np.linspace(0,8,N); y = x
xx, yy = np.meshgrid(x,y)
fnc = np.sin(2*np.pi*fq*xx)
ft = np.fft.fft2(fnc)
ft = np.fft.fftshift(ft)

freq_x  = np.fft.fftfreq(ft.shape[0], d=8 / (N - 1))  # this takes an argument for the timestep
freq_y  = np.fft.fftfreq(ft.shape[1], d=8 / (N - 1))
plt.imshow(
    abs(ft),
    aspect='auto',
    extent=(freq_x.min(),freq_x.max(),freq_y.min(),freq_y.max()),
    origin='lower' ,          # this fixes your problem
    interpolation='nearest',  # this makes it easier to see what is happening
    cmap='viridis'            # let's use a better color map too
)
plt.grid()
plt.show()

enter image description here

您可以说“但频率为10,而不是0.5!”但是,如果您想采样10的频率,则需要比{{更快地采样1}}!奈奎斯特定理说你需要超过 20的采样率才能有任何希望