2

離散 fft に奇妙な問題があります。ガウス関数 exp(-x^2/2) のフーリエ変換も同じガウス関数 exp(-k^2/2) であることを知っています。MatLab と FFTW の簡単なコードでテストしようとしましたが、奇妙な結果が得られました。

まず、結果の虚数部は (MatLab では) 本来あるべきゼロではありません。

第 2 に、実部の絶対値はガウス曲線ですが、絶対値がなければモードの半分は負の係数を持ちます。より正確には、すべての 2 番目のモードには、本来あるべき負の係数があります。

第 3 に、(実数部の絶対値を取った後の) 結果のガウス曲線のピークは 1 ではなく、はるかに高くなります。その高さは、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-')
4

1 に答える 1

4

input_1d_hat答えは基本的に、ポール R が彼の 2 番目のコメントで示唆していることです。 で記述されるガウス分布の中心は実質的に でk>0あり、k+1は へのインデックスであるため、位相シフト (周波数に線形に依存) を導入しinput_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の幅を一定に保ちながら合計のポイント数を増やすと、それに比例して増加します。LxX(k)

虚数周波数次元への信号の漏れに関しては、これは DFT の離散形式によるものであり、Paul R が再度指摘したように、切り捨てやその他の影響をもたらします。定数Lxを維持しながら削減すると、実次元に対するNx虚次元の信号量(実次元のピーク強度を等しく保ちながらスペクトルを比較)。

同様の質問に対するその他の回答は、ここここにあります。

于 2013-10-10T14:46:59.077 に答える