在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)));

绘制结果:matlab - Matlab:对于实数函数,FFT复数结果,IFFT实数结果-LMLPHP
IFFT做得很好:yIFFT是一个纯实高斯函数然而,FFT产生一个复数:一个非常小的虚部存在。这很好,因为在傅里叶变换算法中应该会出现一个错误,而且无论如何都可以忽略不计令我困惑的是,为什么IFFT中根本没有错误FFT和IFFT算法有什么不同吗?
***注意:fftshift和ifftshift在这里是等价的,因为我的数组有偶数个元素。

最佳答案

处理实值时域信号是相当常见的现象以至于ifft function内置了对频域中出现的相应对称性的处理,如文档的“算法”部分所述:
ifft函数测试Y中的向量是否是共轭对称的当第i个元素满足v时,向量v(i) = conj(v([1,end:-1:2]))是共轭对称的如果Y中的向量是共轭对称的,则逆变换计算速度更快,输出为实。
换句话说,ifftyIFFT的虚部构造为正好0,因为它检测到您的输入具有共轭对称性。
另一方面,即使是时域信号也相对不常见,Mathworks认为在fft function中不需要执行类似的测试也就是说,通过使用

% compute fft(x,[],dim) using ifft:
size(x,dim) * conj(ifft(conj(x),[],dim))

关于matlab - Matlab:对于实数函数,FFT复数结果,IFFT实数结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48532509/

10-09 08:22