MATLAB中fftshift(fft2(fftshift(x)))与fftshift(fft2(x))的差异及正确频谱获取
二维数组频谱与连续傅里叶变换匹配的正确实现
要明确两种实现的差异,得先理清MATLAB中fft2和fftshift的作用:
fft2(x)计算的是二维离散傅里叶变换(DFT),默认结果中直流分量(0频率)位于数组的(1,1)位置(MATLAB 1-based索引)。fftshift的作用是将数组的中心与原点对齐,把直流分量从角落移到数组中心,让频谱的频率分布和连续傅里叶变换的可视化逻辑一致。
两种实现的区别
fftshift(fft2(x))
这是匹配连续傅里叶变换的正确写法:- 先通过
fft2(x)得到x的DFT结果,再用fftshift将频谱的直流分量移到中心,此时频谱的幅度和相位都与连续傅里叶变换的离散近似完全匹配(若要数值完全一致,还需乘以采样间隔的乘积dx*dy,因为DFT是求和,连续傅里叶变换是积分,采样间隔对应积分的微分元)。
- 先通过
fftshift(fft2(fftshift(x)))
这个操作先对x做循环移位(把x的中心移到(1,1)),再做DFT,最后再移位回中心:- 由于DFT的循环移位性质,结果的幅度和前者完全相同(复指数因子的模为1),但会引入额外的线性相位偏移,导致相位不再与连续傅里叶变换匹配。
结论
- 若只需要观察频谱的强度分布,两种写法效果一致;
- 若要得到与连续傅里叶变换完全一致的频谱(包含相位信息),请使用
fftshift(fft2(x)),必要时乘以采样间隔的乘积dx*dy来校准数值。
内容的提问来源于stack exchange,提问作者Zachery Zhang
相关产品推荐
相关产品推荐

