【问题标题】:Matlab: for even real functions, FFT complex result, IFFT real resultMatlab:对于偶数实函数,FFT复数结果,IFFT实数结果
【发布时间】:2018-01-31 00:10:48
【问题描述】:

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

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

绘制结果:

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

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

【问题讨论】:

    标签: matlab fft ifft


    【解决方案1】:

    实值时域信号的处理是相当普遍的现象。如此之多,以至于ifft function 具有针对频域中出现的相应对称性的内置处理,如文档的“算法”部分所述:

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

    换句话说,ifftyIFFT 的虚部构造为正好为 0,因为它检测到您的输入具有共轭对称性。

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

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

    【讨论】:

    • 非常好!这让我想知道这是否适用于其他语言,例如 Python 或 C++ 的 FFTW 库。
    【解决方案2】:

    你的代码有错误:

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

    应该阅读

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

    ifftshift 函数将原点从中间移到最左边的 bin。 fftshift 将原点从最左边的 bin 移到中间。对于 even-sized 奇数大小的数组,这两个操作相似但不相同。请注意,您的逆变换遇到了同样的问题, 但没有显示 SleuthEye 解释的错误。 [别管那一点,我想我在那里有点困惑,你的情况应该没有区别。]

    还有,

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

    最好写成

    -nx/2 : nx/2-1
    

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

    【讨论】:

      猜你喜欢
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 2016-05-29
      • 2017-11-09
      • 1970-01-01
      相关资源
      最近更新 更多