numpy.fft2的输出是否遵循numpy.fft文档规定的标准频率排序规则?
NumPy fft2 频率存储规则说明
NumPy 二维FFT的输出逐轴独立遵循一维FFT的索引-频率映射规则,不存在和一维FFT不同的特殊逻辑,具体如下:
- 对任意维度长度为
N的轴,索引k对应的频率阶数为:- 当
k <= N//2时,对应正频率阶数k - 当
k > N//2时,对应负频率阶数k - N
- 当
- 实信号的二维FFT满足共轭对称性:
fft2(Z)[ky, kx] = conj(fft2(Z)[-ky, -kx]),因此幅值相等的共轭对必然成对出现。
你遇到的现象解释
你的测试用例中nx=128、ny=128,两个轴的奈奎斯特索引为64:
- 索引
127对应的频率阶数为127 - 128 = -1,绝非你误以为的127 - 点
(127, 1)对应的实际波数对为(ky=-1, kx=1),点(1, 127)对应的实际波数对为(ky=1, kx=-1),二者是共轭对称对,幅值完全相等,符合规则 - 结合你的域长
lx=4、ly=4,实际角波数为2π*频率阶数/域长,上述两个点对应的角波数分别为(-π/2, π/2)和(π/2, -π/2),和你构造的余弦信号频率完全匹配,对应4个峰值的观测结果也是正确的。
常见误区澄清
你认为Matlab只把正频率存在奈奎斯特索引以下是误解:Matlab的fft2输出排序规则和NumPy完全一致,都需要调用fftshift将零频移到数组中心后,才能直观得到负频率在左/下、正频率在右/上的排布。
实用调试建议
不需要人工记忆索引映射规则,直接调用NumPy内置的fftfreq函数即可直接得到每个索引对应的实际频率:
# 计算x、y方向的角波数 kx = 2 * np.pi * np.fft.fftfreq(nx, d=lx/nx) ky = 2 * np.pi * np.fft.fftfreq(ny, d=ly/ny) # 取任意索引的波数直接查表即可,比如索引(127,1)对应的波数: print(ky[127], kx[1]) # 输出为 -1.5707963267948966 1.5707963267948966,即 -π/2 和 π/2
内容的提问来源于stack exchange,提问作者LWilliams
相关产品推荐
相关产品推荐

