繁体   English   中英

Matlab:对于偶数实函数,FFT复数结果,IFFT实际结果

[英]Matlab: for even real functions, FFT complex result, IFFT real result

我正在测试Matlab中FFT和IFFT函数的有效性。

我可以将这些函数的输出与一个众所周知的数学事实进行比较:偶数,实数函数的傅里叶变换(如以0为中心的高斯),是另一个偶数,实数函数(FFT [真实,0居中高斯] =真实,0居中的高斯)。 这个事实应该适用于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))); 

绘制结果: 显示的野兔是(a)在空间中定义的高斯:y,(b)FFT(y)的实部,(c)如果IFFT(y),(d)FFT(y)的虚部和(e)的实部IFFT(y)的虚部。

IFFT做得很好:yIFFT是纯粹的高斯。 然而,FFT产生一个复数:存在一个非常小的虚部。 这很好,因为在傅里叶变换算法中应该预期会出现错误,并且无论如何它都可以忽略不计。 令我困惑的是为什么 IFFT中根本没有错误 FFT和IFFT算法有很大不同吗?

***注意:fftshift和ifftshift在这里是等价的,因为我的数组具有偶数个元素。

处理实值时域信号是一种相当普遍的现象。 因此ifft函数具有对频域中出现的相应对称性的内置处理,如文档的“算法”部分所述:

ifft函数测试Y中的向量是否是共轭对称的。 当第i 元素满足v(i) = conj(v([1,end:-1:2]))时,向量v是共轭对称的。 如果Y中的矢量是共轭对称的,则逆变换计算更快并且输出是实数。

换言之, ifft构建的虚部yIFFT是恰好为0,因为它检测到您的输入具有共轭对称。

另一方面,即使时域信号相对较少,Mathworks也不认为有必要在fft函数中执行类似的测试。 也就是说,您仍然可以通过使用ifft函数计算FFT来利用共轭对称性测试

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

您的代码中存在错误:

yFFT = fftshift(fft(fftshift(y)));

应该读

yFFT = fftshift(fft(ifftshift(y)));

ifftshift功能将原点从中间移动到最左边的bin。 fftshift将原点从最左边的bin移动到中间。 对于 偶数大小的 奇数大小的数组,这两个操作类似但不相同。 请注意,您的逆变换会遇到同样的问题, 但是没有出现错误,正如SleuthEye所解释的那样。 [没关系,我觉得我有点困惑,你的情况应该没有区别。]

也,

linspace(-nx/2,nx/2-1,nx)

会写得更好

-nx/2 : nx/2-1

鉴于nx是偶数。 它更短,但由于计算事物的方式,它也可能有一个较小的数值误差(可能没有区别,但我尝试在步长为1时避免linspace

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM