关于MATLAB中fft,fftshift,fftshift(fft(fftshift(x))),FFT要乘以dx 等问题理解
问题一:为什么要在matlab中进行FFT时要用fftshift(fft(fftshift(x)))?
考虑一个长度为L的矩形信号(见下图1),我们以Δx为采样间隔进行采样,因此采样点数M=L/Δx.或者Δx=L/M。我们假设矩形信号是关于x=0轴对称的,那么采样的坐标区间就是[-L/2,...,L/2-Δx],在Matlab中下标索引就是[1,2,...M]。此时我们发现信号的坐标为0的位置(零频/直流分量)正好在中间,对应Matlab中下标索引为M/2+1;然而Matlab中FFT算法中对应的坐标为0的位置(零频分量)在下标索引为1的位置,也就是数组的第一个位置[1-2];且FFT后数组中第一个为直流分量,后面前半部分是正频,后半部分是负频[2,4]。
那么,这样就显然需要一个操作把原本在Matlab下标索引中为M/2+1的位置(代表此处坐标为0)挪到FFT算法所要求的坐标为0的位置,即下标索引为1。而这个操作就是fftshift所干的。而后为了便于显示要把零频分量再移回坐标中心,自然就需要再一次使用fftshift/ifftshift(跟采样点数M为奇偶有关)。如果信号开始就时0位置/时刻,那么也自然就不需要fftshift来在fftshift去了,此时只需要fftshift挪一下零频分量使他居中便于观察就行了[2]。同理,逆离散傅里叶变换为ifftshift(ifft(ifftshift(F0)))/dx。
图一
图二
图三
问题二:为什么FFT以后的值乘以采样间隔Δx/dx才会和解析结果一致?
这是因为在傅里叶变换推导到离散傅里叶变换时没有加上Δx,因此自然要补上这个结果[1]。
*个人理解,以作记录。
参考资料:
[1]:Computational fourier optics : a MATLAB tutorial / David G. Voelz. P18-21
[3]:https://www.mathworks.com/matlabcentral/answers/288818-what-s-the-purpose-of-doing-fftshift-twice