使用MatLab进行FFTW和fft

时间:2013-10-10 08:42:52

标签: matlab fft fftw

我对离散fft有一个奇怪的问题。我知道高斯函数exp(-x ^ 2/2)的傅立叶变换同样是高斯函数exp(-k ^ 2/2)。我尝试用MatLab和FFTW中的一些简单代码测试它,但我得到了奇怪的结果。

首先,结果的虚部不应该是零(在MatLab中)。

其次,实部的绝对值是高斯曲线,但没有绝对值,一半模式具有负系数。更确切地说,每个第二模式的系数都应该是它的负值。

第三,得到的高斯曲线的峰值(在取实部的绝对值之后)不是一个而是高得多。其高度与x轴上的点数成比例。但是,比例因子不是1但接近1/20。

有人能解释我的错误吗?

以下是我使用的MatLab代码:

    function [nooutput,M] = fourier_test

    Nx = 512;      % number of points in x direction

    Lx = 50;        % width of the window containing the Gauss curve

    x = linspace(-Lx/2,Lx/2,Nx);     % creating an equidistant grid on the x-axis

    input_1d = exp(-x.^2/2);                 % Gauss function as an input
    input_1d_hat = fft(input_1d);            % computing the discrete FFT
    input_1d_hat = fftshift(input_1d_hat);   % ordering the modes such that the peak is centred

    plot(real(input_1d_hat), '-')
    hold on
    plot(imag(input_1d_hat), 'r-')

1 个答案:

答案 0 :(得分:4)

答案基本上就是Paul R在他的第二篇评论中所建议的,你引入一个相移(线性依赖于频率),因为input_1d_hat描述的高斯中心实际上是k>0,其中k+1input_1d_hat的索引。相反,如果您将数据居中(使input_1d_hat(1)对应于中心),则会在频域中获得相位校正高斯:

    Nx = 512;      % number of points in x direction
    Lx = 50;        % width of the window containing the Gauss curve

    x = linspace(-Lx/2,Lx/2,Nx);     % creating an equidistant grid on the x-axis

    %%%%%%%%%%%%%%%%
    x=fftshift(x);   % <-- center
    %%%%%%%%%%%%%%%%

    input_1d = exp(-x.^2/2);                 % Gauss function as an input
    input_1d_hat = fft(input_1d);            % computing the discrete FFT
    input_1d_hat = fftshift(input_1d_hat);   % ordering the modes such that the peak is centered

    plot(real(input_1d_hat), '-')
    hold on
    plot(imag(input_1d_hat), 'r-')

根据DFT的定义,如果高斯不居中使得最大值出现在k=0,您将看到相位扭曲。关闭fftshift的效果是执行循环移位或交换数据集的左侧和右侧,这相当于将峰的中心移动到k=0

关于幅度缩放,这是在Matlab中实现的DFT定义的问题。来自FFT的文档:

For length N input vector x, the DFT is a length N vector X,
with elements
                 N
   X(k) =       sum  x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1 <= k <= N.
                n=1
The inverse DFT (computed by IFFT) is given by
                 N
   x(n) = (1/N) sum  X(k)*exp( j*2*pi*(k-1)*(n-1)/N), 1 <= n <= N.
                k=1

请注意,在前进步骤中,求和由N归一化。因此,如果在总和中增加点Nx的数量,同时保持宽度Lx高斯函数常数将按比例增加X(k)

对于信号泄漏到假想的频率维度,这是由于DFT的离散形式,导致截断和其他影响,如Paul R.再次提到的那样。如果你在保持Lx时减少Nx {1}}常数,您应该看到虚拟维度相对中的信号量减少到实际维度(比较光谱,同时保持真实维度中的峰值强度相等)。

您可以找到类似问题herehere的其他答案。