我正在测试Matlab中FFT和IFFT函数的有效性。
我可以将这些函数的输出与一个众所周知的数学事实进行比较:偶数实函数(如以0为中心的高斯函数)的傅里叶变换是另一个偶数实函数(FFT[real, 0-centered Gaussian] = real, 0-centered Gaussian)。这个事实应该对FFT和IFFT都成立。
首先,我创建我的网格:
nx = 256; % grid total pixel count
X = 500; % grid size (um)
dx = X/nx; % grid spacing (um)
x = linspace(-nx/2,nx/2-1,nx)*dx; % x grid (um)
df = 1/(nx*dx); % spectral grid spacing (1/um)
f = linspace(-nx/2,nx/2-1,nx)*df; % f grid (1/um)
我制作高斯函数:
A = 1; % magnitude (arbitrary units)
x_fwhm = 7; % Full width at half maximum diameter (um)
x0 = x_fwhm/sqrt(2*log(2)); % 1/e^2 radius (um)
y = A*exp(-2*x.^2./(x0)^2); % Gaussian (arbitrary units)
应用快速傅里叶变换(FFT):
yFFT = fftshift(fft(fftshift(y)));
或者,使用 IFFT:
yIFFT = fftshift(ifft(fftshift(y)));
绘制结果: IFFT完美地完成了它的工作:yIFFT是一个纯实数高斯函数。然而,FFT得到一个复数:存在一个非常小的虚部。这很正常,因为傅里叶变换算法会有误差,并且这个误差可以忽略不计。令我困惑的是,为什么IFFT中根本没有任何误差?FFT和IFFT算法有这么大的不同吗?
***注意:由于我的数组具有偶数个元素,fftshift和ifftshift在此处是等效的。